JWT 方法中的自定义刷新令牌方法

custom refresh token method in JWT method

根据这篇文章http://www.jianshu.com/p/b11accc40ba7 一种保护 JWT 的方法是 refreshToken:

在中心认证服务器中,我们维护一个 table 像这样:

table auth_tokens(
    user_id,
    jwt_hash,
    expire
)

工作流程如下:

用户使用 phone 请求登录 API 并且我们验证了它,之后,auth 服务器发送一个令牌,并注册令牌(在 table 中添加一行.)

当令牌过期时,用户请求用旧令牌交换API。首先 auth 服务器验证旧令牌正常,除了过期检查,然后创建令牌哈希值,然后通过用户 ID 在 table 上方查找:

要连续使用token,合法用户和黑客都需要不断地交换新的token,但只有一个可以成功,如果一个失败,都需要在下次交换时重新登录。

所以如果黑客得到了token,可以短时间使用,但是如果合法用户下次换新的就不能换新了,因为token有效期短,比较安全。

如果没有黑客,普通用户也需要定期交换新的令牌,比如每30分钟,这就像自动登录一样。额外负载不高,我们可以为我们的应用程序调整过期时间。

但想象一下这个场景:

例如,黑客拿到了 Bob 的令牌,他知道 Bob 在 1:00 am 到 6:00 am 睡觉, 因此,黑客可以在晚上连续使用令牌,直到 Bob 第二天起床并使用该应用程序。

一个解决方案是在晚上,用户应该输入用户并传递而不是令牌,但这不是我认为的好解决方案! 你知道更好的解决方案吗?

提前致谢

这个解决方案有很多缺点,优点很少:

  • 需要服务器存储。你失去了 JWT 无国籍。即使对于永远不会被撤销的令牌

  • 代币,其实可以永久使用只是用旧的刷新一下

  • 每个用户一个令牌意味着 一台且只有一台设备使用 API。例如,在移动设备上登录会使桌面浏览器中的会话无效

  • 攻击者可以在用户睡觉时使用令牌(如您所指)

然后,优点:你可以撤销令牌。如果你真的需要它(建议 JWT 让令牌过期)我相信有简单的方法可以实现它。参见


请注意,您的问题开始时谈论的是 "refresh" 令牌,但后来​​您描述了一种自定义机制来刷新和撤销,这与此无关。刷新令牌是长期存在的,持久的,仅用于获取短期访问令牌