Google API客户端:令牌已被撤销问题

时间:2015-09-09 03:59:50

标签: ruby-on-rails devise omniauth

我在我的Rails项目中使用了google-api-client gem。我有omniauth和devise工作,我让用户通过谷歌进行身份验证。

直到最近,我还以为我的情况非常好。我注意到我的应用在一小时后获取Google Calendar API时会出错。到期时间距验证时间一小时,从那时起我收到此错误:

Signet::AuthorizationError (Authorization failed.  Server message:
{
   "error" : "invalid_grant",
   "error_description" : "Token has been revoked."
}):

这与无效的刷新令牌分开,因为我确实在数据库中存储了刷新令牌。它使用以下代码发送刷新令牌请求,该请求会激发上述错误:

client = Google::APIClient.new(
  :application_name => APP_NAME,
  :application_version => APP_VERSION,
)

client.authorization.client_id = CLIENT_ID
client.authorization.client_secret = CLIENT_SECRET

client.authorization.refresh_token = user.auth_refresh_token
token_result = client.authorization.fetch_access_token!

我一直非常小心不要登录和退出我的Google帐户,所以我无法弄清楚为什么Google会发回这条消息。如果我在55分钟后刷新页面,一切都还可以。如果我在1小时后刷新页面,它会抱怨撤销访问令牌。

以前有人有这个问题吗?如果是这样,你做了什么修复它?您是否需要在Google的开发者控制台中进行更改?

1 个答案:

答案 0 :(得分:1)

我最终搞清楚了这个问题,所以我想我会分享修复它的内容。

在config / initializers / devise.rb中,我有:

scope: 'userinfo.profile, userinfo.email, calendar, https://www.googleapis.com/auth/gmail.readonly', prompt: 'select_account consent' }

对我来说,prompt: 'select_account consent'部分是什么。在每次登录时要求用户同意,这似乎使刷新令牌保持最新。当用户通过Google登录时,我会检查响应中是否有刷新令牌,如果有,我将其保存到数据库中。如果没有,我将他们当前的刷新令牌保留在数据库中。

老实说,我真的不明白为什么我这样做是必要的,但对于那些分享他们的代码示例的其他用户来说,这很好。也许Google的OAuth2发生了变化,或者我处理授权的方法可能存在差异。