2017-09-06 110 views
0

定制刷新令牌方法根据本文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, 因此,黑客可以使用晚上不停地哭闹,直到鲍勃第二天起床并使用应用程序。

一个解决方案是在晚上,用户应该输入用户名和密码来代替令牌,但这不是我的想法中的好解决方案! 你知道更好的解决方案吗?

在此先感谢

回答

0

该解决方案充满了缺点和一些优势的:

  • 需要服务器存储。你失去了智威汤逊无国籍。即使是从来没有打算撤销

  • 令牌,其实道理,可用于不断只是每个用户的旧

  • 一个令牌刷新意味着一个且只有一个设备使用API​​。例如在移动设备上登录会在桌面浏览器

  • 攻击者可以使用令牌在用户睡觉无效的会话(如你指出)

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


请注意,您的问题开始谈论“刷新”标记,但后来你所描述的自定义机制刷新并撤销其无关。刷新令牌是长期存在的,持久性一个仅用于获取短期访问令牌

+0

感谢您的回复。那么刷新令牌如何工作?实施刷新令牌的最佳做法是什么? –

+0

你可以阅读这篇文章https://auth0.com/blog/refresh-tokens-what-are-they-and-when-to-use-them/以及关于在oauth2协议中定义的刷新和访问令牌的线程https:// stackoverflow.com/questions/3487991/why-does-oauth-v2-have-both-access-and-refresh-tokens – pedrofb

+0

@pedrodb谢谢我阅读这两个链接,并改变我的问题的标题。我知道我们需要有黑名单用户的服务器存储。你能读这个问题吗? https://stackoverflow.com/questions/46093214/authentication-in-react-native –