在JWT方法
定制刷新令牌方法根据本文http://www.jianshu.com/p/b11accc40ba7 一个方法,以确保JWT是refreshToken:在JWT方法
在中心auth服务器,我们保持这样的表:
table auth_tokens(
user_id,
jwt_hash,
expire
)
以下是工作流程:(在表中添加一行)
用户请求的登录API与电话,我们证实此事,在此之后,auth服务器发送一个令牌,并注册令牌
当令牌过期时,用户请求使用旧令牌的交换API。首先,将auth服务器验证旧令牌,除了到期检查正常,则创建令牌的哈希值,然后,通过用户ID查找表中:
-
一个。如果找到记录并且user_id和jwt_hash匹配,则发出新的 令牌并更新该表。
b。如果找到记录,但user_id和jwt_hash不匹配,则表示有人使用令牌 之前交换过新令牌。令牌被 黑客入侵,通过user_id删除记录,并通过提示 提供响应信息。
c。如果没有找到记录,用户需要重新登录或只输入密码。 当使用更改密码或登出时,按用户ID删除记录。
令牌连续使用,合法用户和黑客需要不断更换新的令牌,但只能有一个成功的,当一个失败,都需要在接下来的交换时间重新登录。因此,如果黑客得到了令牌,则可以使用较短的时间,但如果下一次合法用户更换新的,则不能交换新的,因为令牌有效期短,更安全。
如果没有黑客,普通用户也需要定期交换新的令牌,比如每30分钟一次,这就如同自动登录一样。额外的负载不高,我们可以调整我们的应用程序的到期时间。
但是想象一下,这塞纳里奥:
例如,黑客得到了鲍勃的道理,他知道鲍勃是睡在凌晨1:00到早上6:00, 因此,黑客可以使用晚上不停地哭闹,直到鲍勃第二天起床并使用应用程序。
一个解决方案是在晚上,用户应该输入用户名和密码来代替令牌,但这不是我的想法中的好解决方案! 你知道更好的解决方案吗?
在此先感谢
该解决方案充满了缺点和一些优势的:
需要服务器存储。你失去了智威汤逊无国籍。即使是从来没有打算撤销
令牌,其实道理,可用于不断只是每个用户的旧
一个令牌刷新意味着一个且只有一个设备使用API。例如在移动设备上登录会在桌面浏览器
攻击者可以使用令牌在用户睡觉无效的会话(如你指出)
然后,优势:你可以撤销令牌。如果你真的需要它(建议JWT让令牌过期),我相信有很简单的方法来实现它。见Invalidating client side JWT session
请注意,您的问题开始谈论“刷新”标记,但后来你所描述的自定义机制刷新并撤销其无关。刷新令牌是长期存在的,持久性一个仅用于获取短期访问令牌
感谢您的回复。那么刷新令牌如何工作?实施刷新令牌的最佳做法是什么? –
你可以阅读这篇文章https://auth0.com/blog/refresh-tokens-what-are-they-and-when-to-use-them/以及关于在oauth2协议中定义的刷新和访问令牌的线程https:// *.com/questions/3487991/why-does-oauth-v2-have-both-access-and-refresh-tokens – pedrofb
@pedrodb谢谢我阅读这两个链接,并改变我的问题的标题。我知道我们需要有黑名单用户的服务器存储。你能读这个问题吗? https://*.com/questions/46093214/authentication-in-react-native –