从0开始构建一个Oauth2Server服务 23
撤销授权 revoking access
出于多种原因,您可能需要撤销应用程序对用户帐户的访问权限。
- 用户明确希望撤销应用程序的访问权限,例如,如果他们发现他们不想再使用的应用程序列在他们的授权页面上
- 开发人员想要撤销其应用程序的所有用户令牌
- 开发人员删除了他们的应用程序
- 作为服务提供商,您已确定某个应用程序受到威胁或存在恶意,并希望将其禁用
根据您实现生成访问令牌的方式,撤销它们将以不同的方式工作。
令牌数据库
如果将访问令牌存储在数据库中,那么撤销属于特定用户的所有令牌就相对容易了。您可以轻松编写查询来查找和删除属于用户的令牌,例如在令牌表中查找他们的user_id
. 假设您的资源服务器通过在数据库中查找访问令牌来验证访问令牌,那么下次被撤销的客户端发出请求时,他们的令牌将无法验证。
jwt令牌
如果你有一个真正无状态的令牌验证机制,并且你的资源服务器在不与另一个系统共享信息的情况下验证令牌,那么唯一的选择就是等待所有未完成的令牌过期,并阻止应用程序生成新令牌通过阻止来自该客户端 ID 的任何刷新令牌请求来针对该用户。这是使用自编码令牌时使用极短寿命令牌的主要原因。
如果你能负担得起某种程度的状态,你可以将令牌标识符的撤销列表推送到你的资源服务器,并且你的资源服务器可以在验证令牌时检查该列表。访问令牌可以包含一个唯一的 ID(例如声明jti
),可用于跟踪各个令牌。如果你想撤销一个特定的令牌,你需要把那个令牌jti
放到一个列表中,某个地方可以被你的资源服务器检查。当然,这意味着您的资源服务器不再进行纯粹的无状态检查,因此这可能不是适用于所有情况的选项。
您还需要使与访问令牌一起颁发的应用程序的刷新令牌无效。撤销刷新令牌意味着应用程序下次尝试刷新访问令牌时,将拒绝对新访问令牌的请求。