我应该在哪里存储 JWT 令牌?

Posted

技术标签:

【中文标题】我应该在哪里存储 JWT 令牌?【英文标题】:Where should I store JWT token? 【发布时间】:2019-04-25 19:55:42 【问题描述】:

我正在使用 vue.js 和 vuex 开发一个应用程序,它使用 JWT 令牌对 JSON API 服务器进行身份验证。 所以我想知道存储 JWT 令牌的最佳做法是什么?

如果我存储在vuex store中,刷新页面后会丢失,需要用户重新登录,不太方便。

如果我将它存储在浏览器的本地存储中,它会在下次登录之前被弃用,然后假设身份验证令牌的组件会混淆。我不知道如何处理。

感谢您对此的提示。

【问题讨论】:

使用 cookie,它适合您的问题 可以使用localStorage @PareshGami 我解释了 localStorage 的问题。 在现场再次使用时必须检查令牌 这是一篇来自 dev.to 的精彩文章,其中包含一些有意义的外部资源,可帮助您在 cookie 和 localStorage 之间做出选择:dev.to/rdegges/please-stop-using-local-storage-1i04 【参考方案1】:

如果我将它存储在浏览器的本地存储中,它就会被弃用 在下一次登录之前,然后假设组件 身份验证令牌感到困惑。我不知道如何处理 这个。

这不是真的,localStorage 信息是按文档来源保存的。 应用程序有责任检查令牌是否仍然可用(未过期),如果没有将他重定向到登录页面。

您应该将过期时间延长到重新登录的合理时间,并且您应该考虑一个合适的算法来扩展他的 JWT 令牌。例如,每次用户向服务器发出请求并剩下 1 小时时,您可以增加登录时间 1 天。

【讨论】:

【参考方案2】:

下面是我使用 axios 库的 react 项目的快照,其中我遇到了类似的问题。当来自服务器的响应为 401(未验证)时,我使用另一个没有过期日期的令牌(refreshToken)请求了一个新的 JWT 令牌

axios.interceptors.response.use(
    ok => ok,
    err => 
        if(err.response.status === 401) 
            return axios
                    .get('/api/oauth/token/refresh', 
                        headers: 'Authorization': `Bearer $localStorage.getItem('refreshToken') `
                    )
                    .then((data) => 
                        // in data is new access token
                        err.config.headers['Authorization']=`Bearer $data.token`;
                        return axios(err.config)
                    );

         

        throw err
    
);

【讨论】:

有什么好处?如果可以随时刷新,为什么要让它过期?

以上是关于我应该在哪里存储 JWT 令牌?的主要内容,如果未能解决你的问题,请参考以下文章

我应该在哪里保存客户端的 JWT 以供将来请求?

我应该在哪里存储“非单页”前端应用程序的 JSON Web 令牌

存储JWT令牌的位置?

我在哪里可以将 jwt 令牌存储在 localStorage 中?

JWT应该保存在哪里?

在 Django REST 框架中使用 JWT 时,刷新令牌和访问令牌存储在哪里?