你应该如何存储访问令牌?

Posted

技术标签:

【中文标题】你应该如何存储访问令牌?【英文标题】:How are you supposed to store access tokens? 【发布时间】:2019-09-25 16:56:11 【问题描述】:

我们正在构建一个带有 React/Redux 前端和 NodeJS/Express 后端的应用程序。我不是安全专家,而是选择使用 Auth0 来处理身份验证。

Auth0 在用户登录时返回一个 ID Token 和一个 Access Token,这个 access Token 用于认证和访问我们的后端 API。

我们已经看到了这个访问令牌 stored before in Local Storage,但 Auth0 与 that here 相矛盾。此外,in this answer 似乎有些人建议存储在本地存储中,如does this one。

这让我非常困惑。我们如何存储和持久化令牌而不将其存储在内存中?我们只能将它存储在 Redux 中,但它会在刷新时清除,这不是解决方案。

在这里,他们显示用户登录并返回访问令牌,稍后它将与 API 请求一起发送,我理解,但同时它要存储在哪里?

我们应该如何存储访问令牌以便我们的应用程序可以访问我们的 API?还是我们根本不应该存储它?

【问题讨论】:

您可以将访问令牌存储在 cookie 中。其他 Web 应用程序将无法访问 cookie。 那么将令牌存储在 Cookie 中是绝对的答案吗?还是我应该看看其他路线?似乎 Cookie 也是有争议的选择 ***.com/questions/41076736/… @MattWeber 你没有太多选择。您链接到的问题有一个使用 cookie 的链接。最重要的是,这取决于您需要它的安全性——请记住,由于您已经拥有 API,因此页面刷新并不是真正的问题,因为您可以重新发送身份并让服务器决定是否如果您不想将其存储在 cookie 中,它们仍然是经过身份验证的。 建议不要将其存储在本地存储中。不是绝对的真理。我通常将令牌存储在本地存储中。存储在 cookie 中是更好的选择。 看来 Auth0 建议将令牌存储在内存(状态)中,然后使用静默身份验证? auth0.com/docs/api-auth/tutorials/silent-authentication 【参考方案1】:

我们决定将访问令牌存储在 React Context Provider 中。看起来 Auth0 已经更新了他们的快速入门指南来做同样的事情。

【讨论】:

【参考方案2】:

存储 AT/RT 的最佳方式是为您的客户端后端服务器使用分布式缓存。通过这种方式,您可以确保所有 API 调用都必须通过您的后端应用程序进行传输。在您的前端,您只传递 ID_Token 女巫必须用于识别您的最终用户。 用户发送 ID_Token --> 客户端(后端 Web 应用)检查 Id_Token 并从缓存中获取 AT --> 使用 AT 调用 API。

【讨论】:

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

如何存储访问令牌? (Oauth 2,Auth 代码流程)

我应该如何使用人工访问令牌来访问 npm repo

将访问令牌存储在用户的集合中更好还是分开?

使用访问令牌和刷新令牌保持身份验证

SPA 应该在哪里保存 OAuth 2.0 访问令牌?

存储位置 - OAuth 2.0 中的访问令牌和刷新令牌