Je jouais avec oauth2 pour mieux le comprendre. Pour cette raison, j'ai installé offlineimap qui devrait agir comme une application tierce. J'ai trouvé une bonne façon de lire les informations d'identification cryptées ici sur stackexchange.comment utiliser les fichiers oauth gpg cryptés via Python pour offlineimap
Basé sur le poste lié j'ai modifié/copier le script python suivant:
import subprocess
import os
import json
def passwd(file_name):
acct = os.path.basename(file_name)
path = "/PATHTOFILE/%s" % file_name
args = ["gpg", "--use-agent", "--quiet", "--batch", "-d", path]
try:
return subprocess.check_output(args).strip()
except subprocess.CalledProcessError:
return ""
def oauthpasswd(acct, key):
acct = os.path.basename(acct)
path = "/PATHTOFILE/%s_oauth2.gpg" % acct
args = ["gpg", "--use-agent", "--quiet", "--batch", "-d", path]
try:
return str(json.loads(subprocess.check_output(args).strip())['installed'][key])
except subprocess.CalledProcessError:
return ""
def prime_gpg_agent():
ret = False
i = 1
while not ret:
ret = (passwd("prime.gpg") == "prime")
if i > 2:
from offlineimap.ui import getglobalui
sys.stderr.write("Error reading in passwords. Terminating.\n")
getglobalui().terminate()
i += 1
return ret
prime_gpg_agent()
Dans le correspondant fichier offlineimaprc j'appelle la fonction avec les bons arguments:
oauth2_client_id = oauthpasswd('gmail', 'client_id')
oauth2_client_secret = oauthpasswd('gmail', 'client_secret')
oauth2_request_url = https://accounts.google.com/o/oauth2/token
oauth2_refresh_token = passwd('gmail_rf_token.gpg')
S'il vous plaît noter Dans le fichier local, le PATHTOFILE
est défini correctement. Ce que j'ai fait a été téléchargé le fichier JSON de Google, y compris les informations d'identification oauth2 et crypté. J'ai stocké le jeton d'actualisation dans un fichier distinct. Cependant, si je lance offlineimap je reçois une erreur d'authentification:
ERROR: While attempting to sync account 'gmail'
('http error', 401, 'Unauthorized', <httplib.HTTPMessage instance at 0x7f488c214320>) (configuration is: {'client_secret': "oauthpasswd('gmail', 'client_secret')", 'grant_type': 'refresh_token', 'refresh_token': "passwd('gmail_rf_token.gpg')", 'client_id': "oauthpasswd('gmail', 'client_id')"})
J'ai essayé alors de vérifier les sorties des deux fonctions de python passwd
et oauthpasswd
dans un interpréteur Python. Je reçois les sorties souhaitées. Plus encore, j'ai copié la sortie des fonctions de l'interpréteur python vers le fichier de configuration offlineimaprc et j'ai pu synchroniser avec Gmail. Cela implique qu'il doit y avoir une erreur lorsque offlineimap exécute le fichier mais je ne vois pas ce qui ne va pas.
Si je ne crypte que mon mot de passe Gmail, tout fonctionne. Cela signifie qu'il y a un problème avec les détails téléchargés sur Google (client_id, client_secret et refresh token). Comme indiqué ci-dessus, les valeurs elles-mêmes sont correctes. J'ai vraiment copié la sortie de
oauthpasswd('gmail', 'client_id')
oauthpasswd('gmail', 'client_secret')
passwd('gmail_rf_token.gpg')
depuis une console python vers le fichier offlineimaprc et cela a fonctionné.