2017-09-27 13 views
6

私はoauth2を使いこなしていました。このため、私はサードパーティーのアプリケーションとして動作するオフライン・マップをインストールしました。 stackexchangeで暗号化された資格情報を読む良い方法を見つけました。私は正しい引数を持つ関数を呼び出す対応するofflineimaprcファイルでオフラインのためにPython経由でgpg暗号化されたoauthファイルを使用する方法

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() 

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') 

に注意してください、私は次のPythonスクリプトをコピー/変更したリンクポストに基づいて

ローカルファイルでPATHTOFILEが正しく設定されています。私がやったことは、oauth2の資格情報を含むJSONファイルをGoogleからダウンロードし、それを暗号化したものです。リフレッシュトークンを別のファイルに保存しました。私はPythonインタプリタで2つのPython関数passwdoauthpasswdの出力をチェックするために、次に試した

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')"}) 

:私はofflineimap実行する場合 はしかし、私は、認証エラーが発生します。私は望ましい出力を得る。さらに、Pythonインタプリタ内の関数の出力をofflineimaprc設定ファイルにコピーして、Gmailに同期することができました。これは、offlineimapがファイルを実行するときに間違いがなければならないが、何が間違っているのか分からないことを意味する。

私は自分のGmailパスワードを暗号化すれば、すべてが機能しています。これは、Googleからダウンロードした詳細(client_id、client_secret、refresh token)から何か問題があることを意味します。上で指摘したように、値そのものは正しいです。私は実際に

oauthpasswd('gmail', 'client_id') 
oauthpasswd('gmail', 'client_secret') 
passwd('gmail_rf_token.gpg') 

の出力をpythonコンソールからofflineimaprcファイルにコピーしていました。

答えて

1

問題は次のとおりです。これによるとanswer offlineimapは、offlinemaprcファイル内のすべての鍵の暗号化を許可していません。そのため、Python関数は評価されず、間違った文字列が渡されます。

関連する問題