18

特定の Google カレンダーでイベントを作成する Django アプリを作成しようとしています。これまでのところ、私は成功しています。少しだけ問題があります:

Google python クライアントでリフレッシュ トークンを取得する方法がわかりません。

その結果、トークンの有効期限が切れるとアプリが機能しなくなり、新しいトークンを作成する必要があります。ドキュメントが正しいことを理解していれば、そこに更新トークンが入ります。

アクセス トークンの有効期間は限られており、場合によっては、アプリケーションが 1 つのアクセス トークンの有効期間を超えて Google API にアクセスする必要があります。この場合、アプリケーションはリフレッシュ トークンと呼ばれるものを取得できます。リフレッシュ トークンを使用すると、アプリケーションで新しいアクセス トークンを取得できます。

Google ドキュメント(セクション 4 の「基本的な手順」を参照)

私のコード

import gflags
import httplib2

from apiclient.discovery import build
from oauth2client.file import Storage
from oauth2client.client import OAuth2WebServerFlow
from oauth2client.tools import run

FLAGS = gflags.FLAGS

FLOW = OAuth2WebServerFlow(
    client_id=GOOGLE_API_CLIENT_ID,
    client_secret=GOOGLE_API_CLIENT_SECRET,
    scope=GOOGLE_API_CALENDAR_SCOPE,
    user_agent=GOOGLE_API_USER_AGENT)

storage = Storage(GOOGLE_API_CREDENTIAL_PATH)
credentials = storage.get()
if credentials is None or credentials.invalid == True:
  credentials = run(FLOW, storage)

http = httplib2.Http()
http = credentials.authorize(http)

service = build(serviceName='calendar', version='v3', http=http,
   developerKey=GOOGLE_API_DEVELOPER_KEY)

event = {
    [... Dictionary with all the necessary data here ...]
}

created_event = service.events().insert(calendarId=GOOGLE_API_CALENDAR_ID, body=event).execute()

これは、Google ドキュメントの例とほとんど同じです。興味深いのはStorageです。資格情報データが保存されるファイルです。

私のストレージファイルの内容:

{
    "_module": "oauth2client.client", 
    "_class": "OAuth2Credentials", 
    "access_token": [redacted], 
    "token_uri": "https://accounts.google.com/o/oauth2/token", 
    "invalid": true, 
    "client_id": [redacted], 
    "client_secret": [redacted], 
    "token_expiry": "2011-12-17T16:44:15Z", 
    "refresh_token": null, 
    "user_agent": [redacted]
}

そこに更新トークンがあるはずですが、代わりにnullです。だから私はどういうわけか更新トークンを要求できると思います。

これを機能させる方法について何か助けていただければ幸いです。さらに情報が必要な場合は、教えてください。

4

4 に答える 4

19

Python Client または Calendar API でこれを行う方法はわかりません (連絡先 API へのアクセスに ruby​​ OAuth2 ライブラリを使用しているだけです) が、ユーザーに「オフライン」アクセスを要求する必要があることがわかりました。

これは、値が「offline」の「access_type」パラメーターを認証 URL に追加することによって行われます (「このアプリケーションが自分のデータを取得できるようにする」をクリックするためにユーザーをリダイレクトする URL)。

これを行うと、Google にアクセス トークンを要求すると、JSON 応答で refresh_token が返されます。それ以外の場合は、アクセス トークン (1 時間有効) のみを取得します。

この要件は最近追加されたようです (そして、うまく文書化されていない可能性があります)。

以前は、特定の「オフライン」アクセス許可を取得しなくても、更新トークンを取得していました。

これがあなたを正しい方向に向けることを願っています。

于 2011-12-17T22:19:58.677 に答える
14

そのため、を設定せずに既に同意を受け入れている場合はaccess_type='offline'、 も渡して、オフライン アクセスでアプリに同意するようユーザーに強制する必要がありますapproval_prompt='force'

self.flow = OAuth2WebServerFlow(
    client_id=self.client_id,
    client_secret=self.client_secret,
    scope=self.SCOPE,
    user_agent=user_agent,
    redirect_uri='urn:ietf:wg:oauth:2.0:oob',
    access_type='offline', # This is the default
    approval_prompt='force'
)

auto次に、更新トークンを取得した後、強制プロンプトを削除/設定できます。

于 2013-01-12T00:24:18.090 に答える