Google Calendar API Ruby ライブラリを使用するときにリフレッシュ トークンを取得するにはどうすればよいですか?

概要

私は 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 を参照してください。