首页 > 解决方案 > 刷新令牌与访问令牌的 1:1 映射

问题描述

我在这里阅读了对刷新令牌的解释:https ://stackoverflow.com/a/36280559/11634814 ,我认为这很有意义。简而言之,刷新令牌很有用,因为您一次只有一个未过期的访问令牌与每个刷新令牌相关联。如果 Bob 窃取了 Alice 的刷新令牌,我们可以检测到这一点,因为他会尝试使用它来使用 Alice 的令牌发出新请求,即使 Alice 的访问令牌没有过期

当相应的访问令牌未过期时尝试使用刷新令牌发出请求是奇怪的,服务器可以检测到这一点并使刷新令牌无效。我的问题与@Rakib 在评论中提出的这个问题非常相似:

“服务器是否必须维护刷新令牌的状态才能发现异常?如果是,那么使用刷新令牌不是无状态实现。这是当前的假设吗?”

此实现是否意味着您必须存储与单个刷新令牌关联的当前访问令牌?或者有没有一种无国籍的方式来解决它?

谢谢

标签: jwtaccess-tokenrefresh-token

解决方案


refresh_token 交换没有限制

我使用了来自 google 和 aws 的 refresh_token,没有任何限制。我的意思是,我能够在小于到期时间(谷歌为 3600 秒)的间隔内多次使用 refresh_token 获得新的 access_token。

此外,根据第 10.4 节 specauth0microsfot这个refresh_token没有无尽的生命,相反可能会过期或失效。

因此,仅考虑到未过期的 access_token 的存在,将refresh_token 标记为无效可疑,会剥夺您的有用功能

无状态认证

如果您正在使用 JWT 并且您的安全功能位于另一个工件(授权服务器)中,而不是在您的微服务工件(资源服务器)中,我们可以说:

JSON Web Tokens (JWT) 被称为无状态,因为授权服务器不需要维护任何状态;令牌本身就是验证令牌持有者授权所需的全部内容。

简单来说,没有状态意味着在与主要实体或事件(在您的情况下为令牌)相关的服务器(在您的情况下为授权服务器)中不存在一种实时会话。更简单地说,你可以重启服务器,不会丢失任何东西,之前生成的令牌将继续工作

因此,如果您关心的是refresh_token 盗窃或 access_token 生成的一些滥用,您应该在您的授权服务器中实现一个逻辑。

在这种情况下,您的身份验证将保持无状态,因为该逻辑将位于表或其他机制中,并且最终功能保持不变:只需要令牌,并且授权服务器中的令牌没有附加的实时会话。

最后,最知名的授权服务器或 iams(auth0、okta、keycloak、google、aws、microsoft 等)继续提供无状态身份验证,而不管功能数量众多(access_token/refresh_token 生成、令牌撤销、用户管理等)以及在后台运行所需的复杂软件组件和策略。


推荐阅读