私は Google Calendar API を Web ベースのアプリに実装しようとしている初心者ですが、提供される手順に従っても、情報の取得は約 20 分間しか機能しません (アクセス トークンがまだ有効である間)。新しいアクセス トークンを生成するにはリフレッシュ トークンが必要であることは理解していますが、ターミナル (Google のドキュメントで提供されている) からこのスクリプトを実行しても、リフレッシュ トークンは提供されません。
ターミナルで実行したコード: google-api oauth-2-login –scope=https://www.googleapis.com/auth/calendar –client-id=CLIENT_ID –client-secret=CLIENT_SECRET
これにより、次のようなすべてのキーを含む .yaml ファイルが生成されました。
---
mechanism: oauth_2
scope: SCOPE_HERE
client_id: CLIENT_ID_HERE
client_secret: CLIENT_SECRET_HERE
access_token: ACCESS_TOKEN_HERE
refresh_token:
アクセス トークンの有効期限が切れた場合に提供されるコードは次のとおりです。
oauth_yaml = YAML.load_file('.google-api.yaml')
client = Google::APIClient.new
client.authorization.client_id = oauth_yaml["client_id"]
client.authorization.client_secret = oauth_yaml["client_secret"]
client.authorization.scope = oauth_yaml["scope"]
client.authorization.refresh_token = oauth_yaml["refresh_token"]
client.authorization.access_token = oauth_yaml["access_token"]
if client.authorization.refresh_token && client.authorization.expired?
client.authorization.fetch_access_token!
end
service = client.discovered_api('calendar', 'v3')
したがって、yaml ファイルによれば、client.authorization.refresh_token は常に「nil」であり、新しいアクセス トークンを取得することはありません。また、client.authorization.expired?アプリが動作を停止した後でも、常に false を返します。 同じ問題に関する他の質問をここでいくつか見ましたが、ターミナル コマンドを使用してトークンを生成しているため、そのリフレッシュ トークンを取得する方法がよくわかりません。
リフレッシュ トークンを取得するには、オフライン アクセスを希望することを指定する必要があります: access_type=offline
https://developers.google.com/accounts/docs/OAuth2WebServer#offline を参照してください。