我正在通过HTTPS在我的Node.js应用上创建REST服务。我不想允许任何人使用这些REST服务,除非他们是经过身份验证的用户,因此在向这些服务发出请求时我需要一种身份验证方法。
我已经在网上看过,似乎带护照的OAuth2是一个很好的解决方案...但是我想出了一个更简单的解决方案,不需要持久的令牌,我想知道,有没有我的解决方案有哪些大漏洞?
我的解决方案是保存在服务器上的秘密。当用户登录并对其进行身份验证(或注册)时,我会对用户的用户名进行哈希处理,为其添加时间戳,并使用我的秘密对其进行编码以创建“访问令牌”。由于时间戳,此令牌将始终在一小时(或一天或多长时间......)后过期。
一旦用户拥有此访问令牌,他们只需要在请求查询中传递此令牌及其用户名,他们就可以使用服务器的REST API。鉴于当我使用我的服务器密码解码令牌时,它等于用户名。
此方法也不要求我持久保存任何令牌信息(刷新令牌,到期时间等)。我也不需要其他模块,如passport和oauth模块来实现我的解决方案,它看起来非常紧凑。
我的问题是(我对安全性非常陌生),这个解决方案对于服务器来说是否足够好,以便为移动应用程序提供服务(仍然可以通过REST客户端访问),假设服务器密钥永远不会被发现?
答案 0 :(得分:1)
欢迎来到SO!
关于安全性的任何问题的默认答案:不要自己尝试:)
听起来你正在重新发明已签名的访问令牌方案,该方案正在成为JSON Web令牌(JWT)。我强烈建议你改用这个方案。
不要在GET参数中传递数据,因为它可能会被缓存或记录到某个地方(让自己受到中间人攻击)。您应该将令牌存储在HttpOnly; Secure
cookie中,以防止cookie暴露给非安全通道。
我已经写了一些关于JWT的深入文章以及如何在网络浏览器中使用它们:
Create and Verify JWTs With Node.js
Build Secure User Interfaces Using JSON Web Tokens (JWTs)
免责声明:我在Stormpath工作。我们是一个用户身份验证服务,我们可以为您卸载所有这些问题。听起来您正在使用Node,我们拥有优秀的库,可以让您在几分钟内满足所有用户需求:)
我还是nJwt的作者,这是一个Node.js库,可以很容易地以正确的方式使用JWT。
希望这有帮助!