gpt4 book ai didi

node.js - JSON Web Token Auth Service - 检查单独服务器上的状态以保护路由。 Node JS

转载 作者:搜寻专家 更新时间:2023-11-01 00:32:02 25 4
gpt4 key购买 nike

对于我目前正在从事的项目,我正在使用 Node/Express/Mongo 开发 API,并使用相同的工具单独开发网站。理想情况下,我希望将它们托管在单独的服务器上,以便它们可以根据需要进行扩展。

对于身份验证,我使用 jsonwebtoken这是我设置的,我对它的工作方式总体上很满意。

但是……

在网站上,我希望能够限制(使用 Express)某些路由到经过身份验证的用户,我正在努力寻找实现此目的的最佳方法。 token 当前保存在 LocalStorage 中。

我想我可以通过 get 参数将 token 传递到我想要保护的任何路由,然后在网站服务器上检查这个 token (显然这意味着在这里也包括 jwt secret ,但我没有看到一个大问题那个)。

所以我的问题是

  1. 这行得通吗?
  2. 这是否意味着(没有双关语意)我最终得到丑陋的 URL
  3. 我是否可以更好地将两者托管在同一台服务器上,因为我可以将生成的 token 保存在服务器端?
  4. 有更好的解决方案吗?

我应该说我不想使用 Angular - 我知道这会解决我的一些问题,但它会给我带来更多问题!

最佳答案

首先,我会直接回答你的问题:

  1. 这行得通吗?是的,它会起作用。但是也有很多缺点(更多讨论见下文)。
  2. 不一定。我真的不认为丑陋的网址包含查询字符串。但无论如何,所有身份验证信息( token 等)都应包含在 HTTP 授权 header 本身中,绝不能包含在 URL(或查询字符串)中。
  3. 这在您的情况下并不重要,因为只要您的 JWT 生成代码与您的网络服务器具有相同的 key ,您就可以验证 token 的真实性。
  4. 是的!阅读下文。

那么,现在我们已经解决了这些问题,让我来解释一下为什么您目前采用的方法不是最好的想法(您距离好的解决方案并不太远! ):

首先,由于 XSS(跨站点脚本攻击),目前将任何身份验证 token 存储在本地存储中不是一个好主意。 Local Storage 不提供任何形式的域限制,因此您的用户很容易被诱骗放弃他们的 token 。

这是一篇很好的文章,它以易于理解的形式详细解释了为什么这是一个坏主意:http://michael-coates.blogspot.com/2010/07/html5-local-storage-and-xss.html

您应该做的是:将您的 JWT 存储在经过签名和加密的客户端 cookie 中。在 Node 世界中,有一个出色的 mozilla session 库可以自动为您处理此问题:https://github.com/mozilla/node-client-sessions

接下来,您绝对不想通过查询字符串传递身份验证 token (JWT)。有几个原因:

  • 大多数网络服务器会记录所有 URL 请求(包括查询字符串),这意味着如果任何人获得这些日志,他们就可以作为您的用户进行身份验证。
  • 用户在查询字符串中看到这些信息,看起来很难看。

相反,您应该使用 HTTP 授权 header (这是一个标准)向服务器提供您的凭据。这有很多好处:

  • 此信息通常不会由网络服务器记录(没有困惑的审计跟踪)。
  • 这些信息可以被很多标准库解析。
  • 随意浏览网站的最终用户不会看到此信息,并且不会影响您的 URL 模式。

假设您正在使用 OAuth 2 不记名 token ,您可以按如下方式制作 HTTP 授权 header (假设您将其表示为 JSON blob):

{"Authorization": "Bearer myaccesstokenhere"}

现在,最后,如果您正在寻找上述实践的良好实现,我实际上在 Node 中编写并维护了一个更流行的身份验证库:stormpath-express .

它以干净、经过良好审核的方式处理上述所有用例,还提供了一些方便的中间件来自动处理身份验证。

这是中间件实现的链接(您可能会发现这些概念很有用):https://github.com/stormpath/stormpath-express/blob/master/lib/authentication.js

apiAuthenticationRequired 中间件本身非常好,因为如果用户未通过 API 身份验证(HTTP Basic Auth 或带有 Bearer token 的 OAuth2 + JWT)正确进行身份验证,它将拒绝用户的请求.

希望这对您有所帮助!

关于node.js - JSON Web Token Auth Service - 检查单独服务器上的状态以保护路由。 Node JS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28371662/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com