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 上方查找:
一个。如果找到记录并且 user_id 和 jwt_hash 匹配,则发出新的
令牌并更新 table.
b。如果找到记录,但 user_id 和 jwt_hash 不匹配,则表示
有人之前使用过令牌交换新令牌。令牌是
被黑客入侵,通过 user_id 删除记录并响应警报
信息。
c。如果没有找到记录,用户需要重新登录或只输入密码。
当用户更改密码或登出时,按用户id删除记录。
要连续使用token,合法用户和黑客都需要不断地交换新的token,但只有一个可以成功,如果一个失败,都需要在下次交换时重新登录。
所以如果黑客得到了token,可以短时间使用,但是如果合法用户下次换新的就不能换新了,因为token有效期短,比较安全。
如果没有黑客,普通用户也需要定期交换新的令牌,比如每30分钟,这就像自动登录一样。额外负载不高,我们可以为我们的应用程序调整过期时间。
但想象一下这个场景:
例如,黑客拿到了 Bob 的令牌,他知道 Bob 在 1:00 am 到 6:00 am 睡觉,
因此,黑客可以在晚上连续使用令牌,直到 Bob 第二天起床并使用该应用程序。
一个解决方案是在晚上,用户应该输入用户并传递而不是令牌,但这不是我认为的好解决方案!
你知道更好的解决方案吗?
提前致谢
这个解决方案有很多缺点,优点很少:
需要服务器存储。你失去了 JWT 无国籍。即使对于永远不会被撤销的令牌
代币,其实可以永久使用只是用旧的刷新一下
每个用户一个令牌意味着 一台且只有一台设备使用 API。例如,在移动设备上登录会使桌面浏览器中的会话无效
攻击者可以在用户睡觉时使用令牌(如您所指)
然后,优点:你可以撤销令牌。如果你真的需要它(建议 JWT 让令牌过期)我相信有简单的方法可以实现它。参见
请注意,您的问题开始时谈论的是 "refresh" 令牌,但后来您描述了一种自定义机制来刷新和撤销,这与此无关。刷新令牌是长期存在的,持久的,仅用于获取短期访问令牌
根据这篇文章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 上方查找:
一个。如果找到记录并且 user_id 和 jwt_hash 匹配,则发出新的 令牌并更新 table.
b。如果找到记录,但 user_id 和 jwt_hash 不匹配,则表示 有人之前使用过令牌交换新令牌。令牌是 被黑客入侵,通过 user_id 删除记录并响应警报 信息。
c。如果没有找到记录,用户需要重新登录或只输入密码。 当用户更改密码或登出时,按用户id删除记录。
要连续使用token,合法用户和黑客都需要不断地交换新的token,但只有一个可以成功,如果一个失败,都需要在下次交换时重新登录。
所以如果黑客得到了token,可以短时间使用,但是如果合法用户下次换新的就不能换新了,因为token有效期短,比较安全。
如果没有黑客,普通用户也需要定期交换新的令牌,比如每30分钟,这就像自动登录一样。额外负载不高,我们可以为我们的应用程序调整过期时间。
但想象一下这个场景:
例如,黑客拿到了 Bob 的令牌,他知道 Bob 在 1:00 am 到 6:00 am 睡觉, 因此,黑客可以在晚上连续使用令牌,直到 Bob 第二天起床并使用该应用程序。
一个解决方案是在晚上,用户应该输入用户并传递而不是令牌,但这不是我认为的好解决方案! 你知道更好的解决方案吗?
提前致谢
这个解决方案有很多缺点,优点很少:
需要服务器存储。你失去了 JWT 无国籍。即使对于永远不会被撤销的令牌
代币,其实可以永久使用只是用旧的刷新一下
每个用户一个令牌意味着 一台且只有一台设备使用 API。例如,在移动设备上登录会使桌面浏览器中的会话无效
攻击者可以在用户睡觉时使用令牌(如您所指)
然后,优点:你可以撤销令牌。如果你真的需要它(建议 JWT 让令牌过期)我相信有简单的方法可以实现它。参见
请注意,您的问题开始时谈论的是 "refresh" 令牌,但后来您描述了一种自定义机制来刷新和撤销,这与此无关。刷新令牌是长期存在的,持久的,仅用于获取短期访问令牌