8

数か月前、oauth2 を使用して Google で認証する Rails アプリを作成しました。具体的には、omniauth-google-oauth2 gem です。認証を作成して更新トークンを保存するためのすべての手順を実行しましたが、最近、oauth2 が応答の一部として「refresh_token」を送り返すのをやめました。当初、次のような応答を受け取りました。

credentials: {
  refresh_token: XXX,
  token: YYY,
  expires_at: 1374840767,
  expires: true
},

これで、1 時間以内に有効期限が切れるトークンのみが返されます。

credentials: {
  token: YYY,
  expires_at: 1374840767,
  expires: true
},

これを変更するためにアプリケーション側で何をしたのか本当にわからないので、Googleで何かが変わったのか、それとも私がしたことなのかはわかりません。コンテキストについては、私のコードは次のようになります。

初期化子/omniauth.rb:

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :google_oauth2, 'KEY', 'SECRET', {:scope => "userinfo.email,userinfo.profile,analytics.readonly,adsense.readonly"}
end

authentications_controller.rb は、応答を受け取る場所です。

def create
  auth = request.env["omniauth.auth"] 
  params = request.env["omniauth.params"]
  project = Project.find(params['project_id'])

  Authentication.create(:project_id => project.id, :provider => auth['provider'], :uid => auth['uid'], :access_token => auth['credentials']['refresh_token'])
  flash[:notice] = "Authentication successful."
  redirect_to owner_view_project_path(project)
end

私のinitializers/omniauth.rbファイルに何かが欠けている可能性はありますか? オプション ハッシュに以下を追加しようとしましたが、リフレッシュ トークンが返されないようです。

:approval_prompt => "force", :access_type => "offline"

どんな助けでも大歓迎です!前もって感謝します!

4

3 に答える 3

10

プロンプト: 'consent'は、更新トークンを取得しています。このようなものが動作するはずです:

Rails.application.config.middleware.use OmniAuth::Builder do
  scopes = [
      # we need the profile scope in order to login
      "https://www.googleapis.com/auth/userinfo.profile",
      # this and other scopes could be added, but match them up with the
      # features you requested in your API Console
      "https://www.googleapis.com/auth/calendar"
    ]

  provider :google_oauth2, GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, { scope: scopes.join(" "), access_type: 'offline',  prompt: 'consent'}
end
于 2014-03-31T12:14:50.043 に答える
2

ご覧のとおり、追加するだけで十分です

access_type: 'offline'

プロバイダーのスコープに。

このトリックは、Google の定義では次のとおりです。リフレッシュ トークンは、アプリが Google アカウントに初めてアクセスするときにのみ提供されます。

Google から送信されたリフレッシュ トークンをもう一度確認したい場合は、認証を拒否して認証を取り戻します。

ここでGoogleの元の定義を参照してください:「ユーザーがブラウザに存在しないときにアプリケーションがアクセストークンを更新する必要がある場合は、access_type: offlineを使用してください。これにより、アプリケーションが初めて認証コードを交換するときに、アプリケーションがリフレッシュトークンを取得することになります。ユーザーのために。」( https://developers.google.com/identity/protocols/OAuth2WebServer )

于 2015-07-14T04:51:05.737 に答える
0

It looks like you need to userinfo.email and userinfo.profile in your scope.

https://github.com/zquestz/omniauth-google-oauth2/issues/27

于 2013-08-21T21:08:57.807 に答える