2016-09-09 6 views
1

My(Django)アプリでは、ユーザーがGoogleアカウントを使用してログインする必要があります。このアプリケーションの機能は、Gmail APIを使用してメールを送信することです。アプリのログイン情報を設定してGmailにログインする方法

これまでのところ、ログイン(最終行)で動作するタイプWeb applicationの認証情報を設定しました。

enter image description here

電子メールの送信は、この(「Webアプリケーション」)では動作しません資格ステップが

2016-09-09 05:30:53,535 :Starting new HTTPS connection (1): accounts.google.com 
2016-09-09 05:30:53,779 :Starting new HTTPS connection (1): www.googleapis.com 

で停止しているため、上記のメッセージは私が私が間違った資格情報を持っていることを疑うことができます。私の質問は次のとおりです:

Googleのコンソールには、ログイン用とGmail API経由のメール送信用の2種類の認証情報(つまり、client_secret.jsonファイルが2つあります)を設定する必要がありますか?または、いくつかの神秘的な魔法の詠唱によって、ログインとGmail-API認証を1つの認証情報にペグしますか?どんな情報でも大いに感謝します。

+0

クライアントIDを使用して、有効APIセクションで有効になっているすべてのAPIにアクセスすることがあります。ユーザーがスコープの電子メール(私はそれが1つまたはgmailだと思う)で認証する限り、あなたは好きなだけ多くのAPIに同じクライアントIDを使用できます。あなたがアクセスできるものを決める認証の範囲。上記のメッセージは私にはあまり言いません。詠唱のYouTube動画を見ることができます:) – DaImTo

+0

@DaImTo現在私の唯一の定義されたスコープは[''https://www.googleapis.com/auth/gmail.send''](https://developers.google.com/gmail/api/auth /スコープ)。私はどこに "ログイン"スコープを追加することができます(前のリンクを参照してください)が表示されません。その動画を自分で見たいですか?編集:ハム、多分[this](https://developers.google.com/identity/protocols/googlescopes)、特にGoogle Sign-Inの 'profile'と' login'ですか? –

+0

これはしばらくしていますが、ログインはこれに加えてhttps://developers.google.com/+/web/api/rest/oauthになっていると思います。btw Gmailは苦痛で、私はパイソン人ではないことを指摘しようとしています正しい方向に – DaImTo

答えて

1

python-social-authでDjangoのスコープを追加することは、そのままではありませんが、(two ways described here)のどちらでも難しくありません。私は最初のオプションを選択し、get_scopeメソッドを上書きしました。 views.py

、私は

flow = client.flow_from_clientsecrets(
    CLIENT_SECRET_FILE, 
    scope=SOCIAL_AUTH_GOOGLE_OAUTH2_SCOPES, 
    redirect_uri='https://yourdomain.com/callbacklinkforgmail') 

を設定し、redirect_uriは、GoogleのコンソールにリダイレクトされたURLと一致する必要があります。

要求のアクセス許可は、どこかに格納された資格情報に基づいて行われます。私の場合は、モデルです。

# model with variable/column 'credentials' 
storage = Storage(YourModel, 'id', request.user, 'credentials') 
      credential = storage.get() 
      if credential is None or credential.invalid is True: 
       flow.params['state'] = xsrfutil.generate_token(SOCIAL_AUTH_GOOGLE_OAUTH2_KEY, 
                   request.user) 
       authorize_url = flow.step1_get_authorize_url() 
       return HttpResponseRedirect(authorize_url) 
      else: 
       http = credential.authorize(httplib2.Http()) 
       service = discovery.build('gmail', 'v1', http=http) 

このステップが行われ、一致を確認する機能にredirect_uriをリダイレクトします。私の場合、これはviews.pyです。私のアプリのurls.py

@login_required 
def auth_return(request): 
    if not xsrfutil.validate_token(SOCIAL_AUTH_GOOGLE_OAUTH2_KEY, request.GET['state'].encode('utf-8'), request.user): 
     return HttpResponseBadRequest() 

    credential = flow.step2_exchange(request.GET) 
    storage = Storage(YourModel, 'id', request.user, 'credentials') 
    storage.put(credential) 
    return HttpResponseRedirect("/") 

とエントリ

url(r'^callbacklinkforgmail/$', views.auth_return, name='mailsend') 
関連する問題