RubyでGoogle認証資格情報を更新する方法

概要

認証フローを完了してユーザーの資格情報を取得することはできますが、これらの資格情報が期限切れになることなく引き続き使用できることを確認したいと考えています。私はトークンの有効期限に関するルールを十分に理解しています。

ただし、定期的にユーザーの資格情報を「更新」して、永久に使用できるようにしたい場合があります。どうすればいいでしょうか?

Google のドキュメントには、「クライアント オブジェクトは必要に応じてアクセス トークンを更新します」と書かれています。つまり、次のようにクライアント オブジェクトを初期化するだけで、魔法のように資格情報が常に最新になるという意味ですか? ?

    # one way...credentials is a hash with an access and refresh token and a bunch of other key value pairs

    Signet::OAuth2::Client.new(credentials)

    # another way
    client_secrets = Google::APIClient::ClientSecrets.new({web: credentials})

    auth_client = client_secrets.to_authorization

ドキュメントを信頼したいのですが、読み間違えている可能性があります。さらに、有効期限が切れる可能性を避けるために、ユーザーの資格情報を毎月程度「更新」する方法を知っていれば素晴らしいと思います。公式の Google gem を使用してユーザーの資格情報を定期的に更新する方法を誰かが私に共有してもらえますか、またはこの魔法の更新に関するドキュメント、「クライアント オブジェクトは必要に応じてアクセス トークンを更新します」について説明してもらえますか?

解決策

はい、デフォルトの Ruby Google API クライアント gem には自動更新が含まれています。先ほど述べたように、最初の認証時にリフレッシュ トークンを取得するには、「オフライン」スコープを指定する必要があります。

とはいえ、私は Signet を使用したことはありませんが、以前に Omniauth を使用して手動でトークンを更新したことがあります。それは次のようになります。

def refresh_oauth
  strategy = OmniAuth::Strategies::GoogleOauth2.new(
    nil,
    Rails.application.secrets.fetch(:google_client_id),
    Rails.application.secrets.fetch(:google_client_secret),
  )

  client = strategy.client

  token = OAuth2::AccessToken.new(
    client,
    oauth_token,
    refresh_token: refresh_token,
  )

  token.refresh!
end