【发布时间】:2015-02-09 02:31:34
【问题描述】:
我对基于令牌的授权相当陌生。我正在尝试找出自定义过期/令牌刷新方案中的缺陷。
我在 Express API 中有一个基本的 JWT 身份验证设置;我将 JWT 到期时间设置为 1 小时;但是,JWT 会检查相对于令牌发布时间的令牌过期时间。我希望在每次成功的 api 调用后重置过期时间。如果我的用户正在使用该应用程序超过一个小时,我不希望他们必须重新登录以刷新令牌(并且可能会丢失他们正在处理的任何数据。)
另一方面,如果令牌超过一个小时没有响应,我确实希望令牌过期。
我想出了以下方法:
在每个成功的 API 请求期间,发出一个新的 JWT 并将其发送到 自定义响应头。我的客户端代码负责 检查此 JWT 响应标头并将其值用作新的默认授权请求标头。因此,如果没有 API 用户请求超过 1 小时,令牌将过期并且 不会被刷新。然后需要登录。此外,将存储令牌的原始发行日期(登录身份验证的时间戳),以便在 24 小时后强制执行令牌的“硬过期”。
这看起来相当简单且相当安全,但我在 JWT 研究中没有看到任何关于它的参考。有没有更好的方法来实现相同的目标?我是否错过了这种方法的主要安全漏洞?
更新: 在考虑了一段时间后,我意识到这样做的问题在于它打开了重放无法被令牌过期阻止的攻击的大门。所以绝对应该有一个“硬过期”检查:无论最近的用户活动如何,硬过期都会在发行日期后的某个时间使令牌失效。
【问题讨论】:
-
您是否根据旧令牌的有效性发行新令牌?除了您的客户端代码变得有点尴尬之外,我没有看到主要的安全问题。显然,发行新令牌不是免费的,因此在调用 API 时会付出性能损失。此外,您将无法将发布代码与 API 代码分开。 OAuth 2.0 使用刷新令牌在过期后更新已颁发的访问令牌。
-
@user18044 - 是的,我会根据旧令牌(以及其中包含的数据)的有效性颁发新令牌
标签: security authorization jwt express-jwt json-web-token