在 nodejs 中使用 JWT 刷新令牌的最佳实践

Posted

技术标签:

【中文标题】在 nodejs 中使用 JWT 刷新令牌的最佳实践【英文标题】:Best practice using JWT refresh token in nodejs 【发布时间】:2020-05-02 17:33:41 【问题描述】:

我在我的 react-native 应用程序中使用 JSON Web 令牌进行身份验证。当用户登录时,会创建一个令牌并将其发送给用户以存储在本地存储中。令牌有效期为 24 小时。每当调用服务器(nodejs)时,都会在标头中发送令牌。

问题是,24 小时后,用户必须重新登录。我不想要这个,所以我开始寻找解决方案。我找到的解决方案:刷新令牌。

到目前为止我的方法。如果我做错了什么,请纠正我。

1) 用户登录。auth tokenrefresh token 都发送给用户以存储在本地存储中。 (这样够安全吗?)

2) 用户想要更改他的个人资料。我在标头中使用 auth token 向服务器发送请求。

3) 服务器收到授权令牌。如果身份验证令牌仍然有效,请执行您必须做的任何事情。如果身份验证令牌已过期,请检查用户是否有刷新令牌(仍然有效)。在这一点上,我被困住了。我是否应该从服务器向用户发送一个新请求,询问“你有刷新令牌吗?”如果是,则将此刷新令牌发送到服务器以创建新的身份验证令牌?

我的问题如下:

假设用户想要从列表中获取最后 10 条消息。带有 auth token 的请求被发送到服务器。

=> auth token 有效:响应是一个包含 10 条消息的列表

=> auth token 是invalid:响应是从服务器到客户端对刷新令牌的新请求

这是 2 种不同的响应。这不会弄乱我在客户端的代码吗?我该如何处理?

另一种方法是在每个请求中发送 auth tokenrefresh token。但这有意义吗?

【问题讨论】:

3) 我应该从服务器向用户发送一个带有问题的新请求吗? - 服务器从不向客户端发送请求。当访问令牌过期时,服务器应以 401 响应,客户端应通过请求新的访问令牌来响应 401 响应。见here 【参考方案1】:

您的意思是像 OAuth2 中那样刷新令牌吗?如果是这样,这些通常仅用于服务器客户端(而不是浏览器应用程序)。使用刷新令牌需要客户端身份验证才能检索新的访问令牌,这与仅将访问令牌发送到资源(通常仅自行授予访问权限)不同。

因此,不清楚使用刷新令牌会在此处添加任何内容。如果您认为让人们登录您的应用程序超过 24 小时足够安全,为什么不延长会话持续时间并延长您颁发的令牌的生命周期?

关于存储,在本地存储中保存安全信息是generally frowned on。如果您确定您没有易受攻击的外部 javascript,并且您在您的网站上使用了非常严格的 Content Security Policy 标头以防止任何内联 Javascript 或不受欢迎的来源,并且您的应用程序不是超高风险,那么它可能没问题。

【讨论】:

以上是关于在 nodejs 中使用 JWT 刷新令牌的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

在数据库中存储和维护 JWT 刷新令牌的最佳策略?

在 SPA 中刷新 JWT 的最佳实践?

JWT - 刷新令牌和安全改进

JWT身份验证中刷新令牌的正确实现是啥

Spring Boot 中 JWT 的最佳实践是啥?

使用 angular 和 express-jwt 实现刷新令牌