我在Rails项目中使用了google-api-client gem。我拥有omniauth并可以正常工作,并且我的用户可以通过Google进行身份验证。
我以为直到最近,我的进展都很顺利。我注意到我的应用程序在一小时后获取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开发人员控制台中进行更改?
我最终弄清楚了这个问题,所以我想分享一下解决问题的方法。
在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发生了变化,或者我处理授权的方法存在差异。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句