6

我对基于令牌的授权相当陌生。我试图找出自定义过期/令牌刷新方案中的缺陷。

我在 Express API 中有一个基本的 JWT 身份验证设置;我将 JWT 到期时间设置为 1 小时;但是,JWT 会检查相对于令牌发布时间的令牌过期时间。我希望在每次成功的 api 调用后重置过期时间。如果我的用户正在积极使用该应用程序超过一个小时,我不希望他们必须重新登录以刷新令牌(并且可能会丢失他们正在处理的任何数据。)

另一方面,如果令牌超过一个小时没有响应,我确实希望令牌过期。

我想出了以下方法:

在每个成功的 API 请求期间,发出一个新的 JWT 并将其发送到自定义响应标头中。我的客户端代码负责检查此 JWT 响应标头并将其值用作新的默认授权请求标头。因此,如果超过 1 小时没有来自用户的 API 请求,则令牌将过期并且不会被刷新。然后需要登录。此外,将存储令牌的原始发行日期(登录身份验证的时间戳),以便在 24 小时后强制执行令牌的“硬过期”。

这看起来相当简单且相当安全,但我在 JWT 研究中没有看到任何提及它的内容。有没有更好的方法来实现相同的目标?我是否错过了这种方法的主要安全漏洞?

更新: 在考虑了一段时间后,我意识到这样做的问题是它打开了重放无法被令牌过期阻止的攻击的大门。所以绝对应该有一个“硬到期”检查:硬到期将使令牌在发行日期后的某个时间失效,无论最近的用户活动如何。

4

2 回答 2

3

在这里您可以查看我对这种情况的回答: 使用 angular 和 express-jwt 实现刷新令牌

我所做的是有一个时间窗口,服务器检查令牌过期和本地服务器时间是否在此窗口中,然后发送带有刷新令牌的响应标头。

于 2014-12-17T18:29:05.103 回答
0

如果您同意并意识到无论如何您都需要一个硬到期时间,为什么不将(唯一的)访问令牌的到期时间设置为该时间并坚持使用普通的 OAuth 2.0?您现在正在做的事情的渐近线是在第一次使用访问令牌(在 API 响应中)后发布您自己的 API 特定令牌/cookie,并基于此强制执行后续 API 访问。这是一种有效的方法,但在您自己的 API 中复制了许多现有的 OAuth 2.0 授权服务器功能。我看不出去那里的充分理由。

于 2015-01-12T23:24:36.230 回答