JSON Web令牌验证服务 - 检查单独服务器上的状态以保护路由。的NodeJS

时间:2015-02-06 17:43:55

标签: node.js authentication express routing jwt

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

对于身份验证,我使用的是jsonwebtoken我已经设置好了,我对它的工作方式感到满意。

BUT ...

在网站上,我希望能够限制(使用Express)某些路由到经过身份验证的用户,并且我正在努力实现这一点的最佳方式。令牌当前正保存在LocalStorage中。

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

所以我的问题是

  1. 这会有用吗?
  2. 这是不是意味着(没有双关语)我最终得到了丑陋的网址
  3. 我是否可以更好地在同一台服务器上托管,然后将生成的令牌保存在服务器端?
  4. 有更好的解决方案吗?
  5. 我应该说我不想使用Angular - 我知道这会解决我的一些问题,但它会为我创造更多!

1 个答案:

答案 0 :(得分:4)

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

  1. 这会有用吗?是的,它会起作用。但是有许多缺点(更多讨论见下文)。
  2. 不一定。我并不认为丑陋的网址包含查询字符串。但无论如何,所有身份验证信息(令牌等)都应该包含在HTTP授权头文件中 - 而且永远不会包含在URL(或查询字符串)中。
  3. 在您的情况下,这并不重要,因为只要您的JWT生成代码具有与您的Web服务器相同的密钥,您就可以验证令牌的真实性。
  4. 是!请阅读以下内容。
  5. 所以,既然我们已经解决了这些问题,请让我解释一下为什么你所采取的方法目前并不是最好的想法(你并不是太远了从一个很好的解决方案!):

    首先,由于XSS(跨站点脚本攻击),目前在本地存储中存储任何身份验证令牌是一个坏主意。本地存储不提供任何形式的域名限制,因此您的用户可能会被欺骗,以便轻松提升其令牌。

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

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

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

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

    相反,您应该使用HTTP Authorization标头(它是标准),将您的凭据提供给服务器。这有很多好处:

    • 此信息通常不会被Web服务器记录(没有杂乱的审计跟踪)。
    • 此信息可以通过许多标准库进行解析。
    • 最终用户随意浏览网站时看不到此信息,也不会影响您的网址格式。

    假设您正在使用OAuth 2承载令牌,您可以按照以下方式制作HTTP授权标头(假设您将其表示为JSON blob):

    {"授权":" Bearer myaccesstokenhere"}

    现在,最后,如果您正在寻找上述实践的良好实现,我实际上在Node中编写并维护了一个更受欢迎的auth库:stormpath-express

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

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

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

    希望这有帮助!