Google API 客户端:令牌已被撤销问题
Google API Client: Token has been revoked issue
我在我的 Rails 项目中使用 google-api-客户端 gem。我有 omniauth 和设计工作,我让用户通过 Google.
进行身份验证
直到最近,我一直认为我的进展非常顺利。我注意到我的应用在一小时后获取 Google 日历 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 发生了变化,或者我处理授权的方法可能存在差异。
我在我的 Rails 项目中使用 google-api-客户端 gem。我有 omniauth 和设计工作,我让用户通过 Google.
进行身份验证直到最近,我一直认为我的进展非常顺利。我注意到我的应用在一小时后获取 Google 日历 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 发生了变化,或者我处理授权的方法可能存在差异。