撤销 1 个令牌将撤销相同 OAuth 客户端 ID + 用户同意对的所有令牌

Revoking 1 token revokes all tokens of same OAuth Client ID + User Consent Pair

我遇到的情况是:

我有一个 Google 项目,使用 OAuth 2.0 客户端(用于 Web 应用程序)来获得用户对某些范围的同意。重定向到 Google 中使用的 authorization parameters 使用以下参数值(仅包括可能相关的参数):

如果用户同意访问该应用程序,该应用程序将获得访问令牌以访问授予的范围。

如果同一用户再次同意(虽然之前的访问令牌尚未撤销)同一应用程序(使用相同的 OAuth 2.0 客户端),则会向项目颁发新的访问令牌。

Google 项目现在有 2 个 不同的 令牌,并且两个访问令牌都用于访问授予的范围。奇怪的是,用户在用户 Apps with access to your account 页面中只会看到 Google project/app 的一个条目。

问题是,如果 token gets revoked 中的任何一个,所有活动令牌都会被撤销(尝试使用访问令牌会导致 invalid_grant 错误,Token has been expired or revoked.错误描述)。虽然我没有测试过同时拥有 2 个 live/valid 令牌,但我怀疑行为对于超过 2 个是相同的。

我一直在查看 Google OAuth 2.0 文档以查找有关此行为的一些文档,或找到任何引用伴随令牌被撤销时发生的情况的任何内容,但无法找到任何解释此行为的内容行为。

起初,我认为这可能是由于我使用了 incremental authorization,并认为可能撤销最新的访问令牌会撤销所有之前的访问令牌,但在尝试 include_granted_scopes=false 之后,行为还是一样。

目前,我已限制用户只能同意一次(除非令牌过期),但我很好奇这种行为的解释 - 撤销 1 个令牌会撤销所有令牌。

实际上访问令牌是独立的。设计的访问令牌将工作一小时。从理论上讲,即使用户撤销了您的访问权限,访问令牌仍将在最初有效的剩余时间内有效。这是标准的 Oauth2 功能,它们旨在提供一个小时的访问权限,这就是为什么它被称为持有者令牌的原因,该令牌的持有者被授予一个小时的访问权限。

我怀疑您看到的是刷新令牌被撤销,因为这会导致 invalid_grant 错误。如果您使用离线访问请求用户访问,您将获得刷新令牌。如果您再次请求用户同意,您将获得另一个刷新令牌。单个用户最多可以有五十个未完成的刷新令牌。

如果用户通过他们的 google 帐户撤销了访问权限,或者如果您的应用程序撤销了访问权限。那么是的,所有未完成的刷新令牌都将被撤销。由于您的应用程序对用户帐户的访问已被撤销,而不是单个刷新令牌。请注意,刷新令牌过期实际上有多种原因,可以在此处找到 refresh token experation

这是标准的 Oauth2 行为,并非 google 特定。

Remove third-party account access

If you gave Google Account access to a third-party app or service you no longer trust or want to use, you can remove its access to your Google Account. The app or service won’t be able to access any more info from your Google Account, but you may need to request that they delete the data they already have.