JSON Web 令牌授权服务 - 检查单独服务器上的状态以保护路由。节点JS

JSON Web Token Auth Service - checking status on separate server to protect routes. NodeJS

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

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

但是

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

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

所以我的问题是

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

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

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

  1. 这行得通吗?是的,它会起作用。但是也有很多缺点(更多讨论见下文)。
  2. 不一定。我真的不认为丑陋的网址包含查询字符串。但无论如何,所有身份验证信息(令牌等)都应包含在 HTTP 授权 HEADER 本身中——永远不要包含在 URL(或查询字符串)中。
  3. 这对您来说无关紧要,因为只要您的 JWT-generating 代码具有与您的网络服务器相同的密钥,您就可以验证令牌的真实性。
  4. 是的!阅读下文。

那么,既然我们已经解决了这些问题,让我解释一下为什么您目前采用的方法不是最好的主意(您离很好的解决方案!):

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

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

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

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

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

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

  • Web 服务器通常不会记录此信息(没有杂乱的审计跟踪)。
  • 许多标准库都可以解析此信息。
  • 此信息不会被 end-users 随便浏览一个站点,并且不会影响您的 URL 模式。

假设您使用的是 OAuth 2 承载令牌,您可以按如下方式制作 HTTP 授权 header(假设您将其表示为 JSON blob):

{"Authorization": "Bearer myaccesstokenhere"}

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

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

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

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

希望这对您有所帮助!