我正在通过HTTPS在我的Node.js应用程序上创建一个REST服务。我不希望任何人使用这些REST服务,除非它们是经过身份验证的用户,所以在向这些服务提出请求时,我需要一种身份验证方法。
我在网上读过书,看来带护照的OAuth2是个好办法.然而,我想出了一个更简单的解决方案,它不需要持久化令牌,我想知道,我的解决方案是否存在任何较大的漏洞?
我的解决方案是将一个秘密存储在服务器上。当用户登录并对他们进行身份验证(或注册)时,我会散列用户用户名,向其添加时间戳,并用我的秘密对其进行编码,以创建一个“访问令牌”。由于时间戳,此令牌将始终在一小时(或一天或无论如何长.)之后过期。
一旦用户拥有了这个访问令牌,他们只需要在请求查询中传递这个令牌以及他们的用户名,他们就可以使用服务器的REST了。考虑到当我用服务器机密解码令牌时,它等于用户名。
此方法还不要求我保存任何令牌信息(刷新令牌、过期时间等)。我也不需要额外的模块,如护照和oauth模块来实现我的解决方案,它似乎非常紧凑。
我的问题是(我对安全性非常陌生),对于服务器来说,如果服务器的秘密永远不会被发现的话,这个解决方案是否足以为移动应用程序(仍然可以通过REST客户端访问)提供服务?
发布于 2015-06-22 19:08:00
欢迎来到这里!
对于任何有关安全性的问题,默认答案是:不要自己尝试:)
听起来您正在重新发明签名访问令牌方案,它正在被编码为JSON令牌(JWT)。我强烈建议你用这个方案代替。
不要在GET params中传递数据,因为它很可能在某个地方被缓存或记录(让自己容易受到中间人的攻击)。您应该将令牌存储在HttpOnly; Secure cookie中,以防止cookie暴露在非安全通道中。
我写了一些关于JWT的深入文章,以及如何在web浏览器中使用它们:
免责声明:我在风暴路径工作。我们是一种用户身份验证服务,我们可以为您解除所有这些问题。听起来你在使用Node,我们有很好的库,可以让您在几分钟内运行所有的用户需求:)
我也是nJwt的作者,这是一个Node.js库,它使使用JWT的方法变得非常容易。
希望这能有所帮助!
https://stackoverflow.com/questions/30961818
复制相似问题