Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Oauth 2.0] Jeton d'accès sans utilisateur

Générer un jeton d'accès sans intervention utilisateur

    9 avril 2024 à 16:18:14

    Bonjour à tous,

    J'ai développé un script python qui me permet de récupérer des pièces jointe présentes dans des mails via l'API gmail.

    Celui-ci fonctionne très bien mais je dois intervenir pour donner l'autorisation à l'accès de ma boite mail lors de la première exécution du programme. Il génère un jeton d'accès valable 1 heure et un jeton de rafraîchissement valable 1 semaine.

    Voici la partie du code permettant l'autorisation OAuth2.0 :

    import os
    from datetime import datetime
    from typing import Any
    from google.auth.transport.requests import Request  # type: ignore
    from google.oauth2.credentials import Credentials  # type: ignore
    from google_auth_oauthlib.flow import InstalledAppFlow  # type: ignore
    from googleapiclient.discovery import build, Resource  # type: ignore
    from googleapiclient.errors import HttpError  # type: ignore
    
    SCOPES = ["https://mail.google.com/"]
    
    class MailFetcher:
        def __init__(self, params: dict[str, Any]) -> None:
            self.params = params
            self.date: datetime = datetime(1, 1, 1)
            self.mail_del = 0
    
        # Permet l'authentification du compte
        def auth(self) -> None:
            self.creds = None
    
            # Le fichier token_*.json sauvegarde l'accés à l'utilisateur * et le jeton de rafraîchissement
            # et est créé lors de la première complétion du flux d'autorisation
            if os.path.exists(self.params["fetchMail"]["token"]):
                self.creds = Credentials.from_authorized_user_file(
                    self.params["fetchMail"]["token"], SCOPES
                )
    
            # Si le token n'est plus valide, l'utilisateur doit autoriser l'application
            if not self.creds or not self.creds.valid:
                if self.creds and self.creds.expired and self.creds.refresh_token:
                    self.creds.refresh(Request())
                else:
                    flow = InstalledAppFlow.from_client_secrets_file("cred.json", SCOPES)
                    self.creds = flow.run_local_server(port=0)
    
                    # Sauvegarde les credits pour la prochaine utilisation
                    with open(self.params["fetchMail"]["token"], "w") as token:
                        token.write(self.creds.to_json())

    Le problème étant que je veux mettre ce programme sur un serveur pour qu'il tourne tout seul dans son coin. Or passé cette semaine, le programme me demandera à nouveau l'autorisation et je ne pourrait pas lui fournir.

    D'après la documentation des API google, une intervention de l'utilisateur est forcément nécessaire lorsqu'on veut accéder aux informations utilisateur. Quelqu'un aurait donc une idée de comment résoudre ce problème ?

    Je passais par le service SMTP de Gmail mais je souhaiterais utiliser son API pour ne pas avoir à activer l'authentification à double facteur sur le compte google et éviter les restrictions SMTP.

    Merci d'avance

    -
    Edité par MaxouOnEstLà 10 avril 2024 à 11:13:46

    • Partager sur Facebook
    • Partager sur Twitter
      10 avril 2024 à 15:23:49

      Dans la doc que tu indique, il est aussi question de jeton d'actualisation.

      Après avoir une obtenu une 1ère fois l'autorisation de l'utilisateur, on récupére donc un token d'autorisation, qu'il faut échanger avec un token d'actualisation (qu'il faut sauvegardé pour le réutiliser ensuite) 

      la procédure est décrite dans la doc https://developers.google.com/identity/protocols/oauth2/web-server?hl=fr#python_1 

      • Partager sur Facebook
      • Partager sur Twitter

      [Oauth 2.0] Jeton d'accès sans utilisateur

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      • Editeur
      • Markdown