对于我目前正在进行的项目,我正在使用Node / Express / Mongo开发API,并使用相同的工具单独开发网站。理想情况下,我希望将它们托管在不同的服务器上,以便根据需要进行扩展。
对于身份验证,我使用的是jsonwebtoken我已经设置好了,我对它的工作方式感到满意。
BUT ...
在网站上,我希望能够限制(使用Express)某些路由到经过身份验证的用户,并且我正在努力实现这一点的最佳方式。令牌当前正保存在LocalStorage中。
我想我可以通过get参数将令牌传递给我想要保护的任何路由,然后在网站服务器上检查这个令牌(显然这意味着包括jwt秘密在这里但是我没有看到一个巨大的问题这一点)。
所以我的问题是
我应该说我不想使用Angular - 我知道这会解决我的一些问题,但它会为我创造更多!
答案 0 :(得分:4)
首先,我会直接回答您的问题:
所以,既然我们已经解决了这些问题,请让我解释一下为什么你所采取的方法目前并不是最好的想法(你并不是太远了从一个很好的解决方案!):
首先,由于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标头(它是标准),将您的凭据提供给服务器。这有很多好处:
假设您正在使用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。)
希望这有帮助!