読者です 読者をやめる 読者になる 読者になる

dackdive's blog

新米webエンジニアによる技術ブログ。JavaScript(React), Salesforce, Python など

follow us in feedly

[GAE][django]Google APIs Client Library for Pythonをdjangoで使う (2)

前回 から引き続き。
とりあえず認証のリダイレクトが機能しつつ、 Credentials を NDB に保存できるところまで。

コード

views.pyclient_secrets.json というファイルをロードしてるので
それは別途プロジェクトのルートディレクトリに置いておく。

{
    "web": {
        "client_id": "[YOUR_CLIENT_ID_HERE]",
        "client_secret": "[YOUR_CLIENT_SECRET_HERE]",
        "redirect_uris": [],
        "auth_uri": "https://accounts.google.com/o/oauth2/auth",
        "token_uri": "https://accounts.google.com/o/oauth2/token"
    }
}

参考: Client Secrets - Google APIs Client Library for Python — Google Developers

注意点など

redirect_uri_mismatch エラー

client_id, client_secret は正しいのに
authorize_url にリダイレクトした時に以下のような 400 エラーが起きる場合

Error: redirect_uri_mismatch

f:id:dackdive:20150125034940p:plain

調べてみるとリダイレクトURIは developer console でちゃんと登録しないとだめだったらしい。

参考: authentication - Google OAuth 2 authorization - Error: redirect_uri_mismatch - Stack Overflow

ので、

https://console.developers.google.com/project/[プロジェクト名]/apiui/credential

から設定。

f:id:dackdive:20150125034946p:plain

f:id:dackdive:20150125195445p:plain

承認済みの JAVASCRIPT 生成元 は今回関係ないはず

OAuth2WebServerFlow は結局使わなかった

Flow オブジェクトを生成するところ、以下のように OAuth2WebServerFlow クラスを使ってもいいけど

import settings

FLOW = OAuth2WebServerFlow(
        client_id=settings.CLIENT_ID,
        client_secret=settings.CLIENT_SECRET,
        redirect_uri='http://localhost:8080/task_manager/oauth2callback',
        scope=settings.SCOPE)

これだと settings.py に client_secret 埋め込むことになって public repository に置けなかったので
flow_from_clientsecrets()client_secrets.json を読み込む形にした。
(client_secrets.json.gitignore で管理)

参考: OAuth 2.0 - Google APIs Client Library for Python — Google Developers

TODO

StorageByKeyName の第二引数はエンティティ(ここでは Credentials を格納してる) の key name になる部分で、
本来ならば現在の Google Account ログインユーザー名を使う。
が、とりあえず Credentials がデータストアに保存されるところまでを確認したかったので、これからです。

(2015/01/29 追記)
続き、書きました。
[GAE][django]Google APIs Client Library for Pythonをdjangoで使う (3) - dackdive's blog