1

我阅读了有关身份验证的文档。我在 Nuxt 项目上工作,我的服务器返回一个 cookieHtppOnly

我的问题:

关于 JWT 令牌的存储有很多困惑,有些不建议使用localStroage 我还阅读了我们可以将令牌直接复制到下一个请求的标头中,但我没有找到示例。此外,当 cookie 存在时HttpOnly,由于 JavaScript 无法访问,我们如何使用它?

// https://github.com/FormidableLabs/urql/tree/main/exchanges/auth#quick-start-guide
if (result.data?.refreshLogin) {
  // save the new tokens in storage for next restart
  localStorage.setItem('token', result.data.refreshLogin.token);
  localStorage.setItem('refreshToken', result.data.refreshLogin.refreshToken);
  //...
}

资源:

4

1 回答 1

1

为 JWT 使用 cookie 比使用 localStorage 更安全。accessToken并且您经常使用 刷新的过期时间很短refreshToken

这是对效果的完美解释httpOnlyhttps ://www.ibm.com/mysupport/s/question/0D50z000062kLbCCAU/is-there-a-way-to-read-browser-cookie-with-httponly-flag-设置-ibpm-856-cf02-

客户端 API(例如 JavaScript)无法访问 HttpOnly cookie。此限制消除了通过跨站点脚本 (XSS) 窃取 cookie 的威胁。如果浏览器允许您访问它,那么这将是浏览器的缺陷。

如果您希望浏览器修改特定的 cookie 并且不担心 XSS,您可以删除 HTTPOnly 标志。只有服务器端代码才能访问这些 cookie。


如果您希望您的 cookie 被您的客户端代码修改,您只能设置secure: true并允许它用于更多httpOnly.

cookie-universal-nuxt非常适合管理客户端 cookie。


回复您的评论:

你在说什么中间件?

你的东西是否适用于失眠症之类的东西?发送 GQL 调用,看看你有没有东西。


我只在客户端使用过 GQL,所以我会就它应该在哪里给出反馈,但它可能不是 100% 准确的。

  1. 你应该有一些后端逻辑来处理整个登录流程,但是如果你想管理某人是否登录的事实,这确实会在前端。您将需要一些状态来查看要向最终用户显示的内容。当然,这依赖于您将应用程序仅作为 SPA 运行并且您的后端用作 GQL API 的假设。但是您可能有多种方法来解决这个问题,具体取决于您页面的隐私量等等。很难回答这种广泛的答案。

  2. 两个后端都处理 JWT。客户端负责存储它并检查它是否过期,然后刷新它。它将它发送到后端以查看您是否可以访问请求的数据等。对于前端,如果您想将其保存在 cookie 中以在刷新之间持续存在,那么它就在前端。

  3. JWT 刷新令牌存储在前端。当它过期时,你的前端应该将它发送到你的后端,以便它更新它的值。然后,您可以保留更新的版本,直到它再次过期。

  4. 如果通过资源请求,您的意思是访问数据库中包含的值,这是一些后端工作。您的前端负责调用查询/突变,甚至不知道幕后是什么。这就是 GQL 的重点,通过删除典型 REST API 所具有的所有可能的端点,使前端变得更加友好。


总结一下

您的前端不能包含敏感信息,这是到达这里的主要内容。

您的大多数问题都是知道堆栈的哪一侧。我不确定您是否是全栈开发人员,但您可能应该阅读一些有关 GQL 工作原理的文章。

此外,这里有很多问题。我确实建议尝试一次只专注于一件事,而不是同时使用多种方式,否则整体上很难理解。

此外,StackOverflow 上的这类帖子(询问很多事情)很快就会关闭。

于 2021-06-07T23:39:16.343 回答