我在哪里可以检查 google oauth 2.0 access_token 是不是有效?

Posted

技术标签:

【中文标题】我在哪里可以检查 google oauth 2.0 access_token 是不是有效?【英文标题】:Where can i check if a google oauth 2.0 access_token is valid?我在哪里可以检查 google oauth 2.0 access_token 是否有效? 【发布时间】:2017-12-29 10:44:29 【问题描述】:

我正在为应用程序开发一个安全模块,使用谷歌的 oauth 2.0 访问令牌,使用本文“获取 OAuth 2.0 访问令牌”部分中的建议:https://developers.google.com/identity/protocols/OAuth2WebServer

我正在存储作为上述文章第 5 步的一部分收到的 access_token,“第 5 步:交换授权码以获取刷新和访问令牌”。

假设用户在浏览器中访问任何谷歌网络应用程序并注销,我知道谷歌的会话在这一点上是无效的,这很好,那是生成我存储的 access_token 的会话,然后,假设在那一刻用户登录到我的应用程序并且我的应用程序的会话已过期,所以问题是如果我的应用程序的会话过期并且用户转到我的应用程序,我的应用程序将尝试验证访问令牌(我想维护只要 google 会话处于活动状态,我的应用程序的会话就与 google 会话保持一致)但是此服务 https://www.googleapis.com/oauth2/v2/tokeninfo 不会在中间反映我在我的应用程序中拥有的 access_token 无效,需要很长时间才能反映用户已注销且访问令牌无效。

请原谅我冗长的解释,我希望它很清楚。

现在我的问题是,什么 google rest/service 为 access_token 提供了更好的验证?

【问题讨论】:

Validate Google Id Token的可能重复 请按照链接中的说明进行操作:***.com/questions/39061310/validate-google-id-token 【参考方案1】:

我认为您有一个错误的假设,即访问令牌(和刷新令牌)绑定到验证用户时使用的会话。我试图找到一些关于它的信息,但没有成功。可能有多个会话 - 例如在不同的浏览器中。如果您在一个浏览器中注销,另一个浏览器会保持登录状态,因此可能没有“全局注销”会终止用户的所有会话。

如果令牌在浏览器会话注销时失效,它会使使用令牌的应用程序变得脆弱。例如,移动或桌面应用程序仅使用浏览器进行身份验证,并且在成功身份验证后不用于保持浏览器窗口打开,因此它们无法保持浏览器会话处于活动状态。他们的令牌会随着会话到期而失效。

Google 似乎没有在其 discovery document 中提供 OpenID Connect session management 功能,因此您也无法使用 iframe 监控会话(如 the RFC 中所述)。

【讨论】:

Jan,如果你想做这个测试。创建一个使用 google oauth 2.0 进行身份验证的简单 Web 应用程序,并将应用程序的会话生命周期设置为 5 分钟。使用 google 的 oauth 2.0 登录您的应用程序。然后转到您的谷歌帐户并注销。完成此操作后,然后使用生成的访问令牌对此服务googleapis.com/oauth2/v2/tokeninfo 执行一些获取请求,您会注意到几分钟后您使用该会话生成的访问令牌不再有效。 @anyei,Jan 是正确的。访问令牌不绑定到用户用来验证自己的会话。我怀疑您所看到的只是访问令牌在 1 小时后过期。您需要重新考虑您的安全模型。 我明白了,那很伤心..我正在评估几个 oauth 2.0 身份验证器提供程序,到目前为止,facebook 提供了一种方法来验证确切的场景,例如执行 GET graph.facebook.com/调试令牌? input_token=token-to-inspect &access_token=app-token-or-admin-token 我可以获得一个带有属性“is_valid”的json,它告诉我正在评估的访问令牌是否有效,此外,它甚至给了我为什么令牌无效的原因。 为了进一步解释,这里是 facebook 的令牌调试响应示例:app_id=myappid, application=myapplabel, error=code=190, message=Error validating access token: The session is invalid because用户退出。,subcode=467,expires_at=1500998400,is_valid=false,scopes=(public_profile),user_id=fbuserid jan,pinoyyid 感谢您的回答,我肯定会改变至少对 google 的 api 的方法(实际上到目前为止,linkedin 具有相同的场景,我审查过的唯一一个 oauth 提供商到目前为止,这种“令牌验证验证”功能是 facebook)

以上是关于我在哪里可以检查 google oauth 2.0 access_token 是不是有效?的主要内容,如果未能解决你的问题,请参考以下文章

使用带有 C# 的 Google OAuth 2.0 登录

使用带有 C# 的 Google OAuth 2.0 登录

您可以让 Google OAuth 2.0 访问令牌持续更长时间吗?

如何重置 google oauth 2.0 授权?

Google OAuth 2.0 redirect_uri_mismatch 错误

如何检查用户是不是使用“谷歌登录”(OAuth 2.0)登录