Node.JS RESTful API 的最佳身份验证方法

Posted

技术标签:

【中文标题】Node.JS RESTful API 的最佳身份验证方法【英文标题】:Best authentication method for Node.JS RESTful API 【发布时间】:2015-04-23 04:32:52 【问题描述】:

我想构建一个共享同一数据库的 Web 应用程序和一个移动应用程序(适用于 ios)。目前我正在考虑拥有一个 RESTful API 并让两个应用程序(Web 和 iOS)与 API 通信以访问数据。我的问题是我应该使用的身份验证方法。我一直在研究 OAuth2.0,但这不是我想要的,因为我不希望用户必须授权连接,因为当您使用 facebook 或 google+ 登录某个地方时会发生这种情况。我只想使用用户名和密码登录,然后保持登录状态。这适用于两个应用程序(Web 和 iOS)。 我正在使用 Node.JS 和 MongoDB 来构建 API。 我正在尝试以“正确的方式”做事,因为这应该是我的主人的最终项目。 你们能给我一些关于如何实现这一目标的说明吗?

【问题讨论】:

【参考方案1】:

使用 OAuth 2.0,因此您拥有可扩展的标准和基于令牌的身份验证,使用户能够撤销身份验证票证,例如如果他们的手机被盗了。

OAuth 2.0 支持各种授权类型。您从 facebook 和 twitter 登录的那些可以概括为“3-legged oauth”,但也有两种用于 2-legged OAuth 的授权类型,尤其是 resource owner password credentials grant(页面末尾的第 4.3 节),它将简单地交换身份验证令牌的用户名和密码。如果您不想,则无需实施 3-legged oauth。

对于大多数用例,我建议使用数据库存储的令牌而不是基于加密的自我验证令牌。撤销个别授权或特定客户应用程序的所有授权的可能性在实践中非常有用。它还大大缩短了代币,并降低了由于实施中的缺陷而导致灾难性安全泄漏的风险。确保令牌本身是加密强随机,并在实际令牌值周围使用简单的加密包装器,以便能够廉价识别(严重)伪造的令牌。

【讨论】:

感谢您的回答!关于你的回答,我还有一个问题。保留数据库存储的令牌不违反 RESTful 的原则吗? RESTful 是无状态的,在我看来,使用令牌保存数据库并不是无状态的。你能澄清一下吗? 在某种程度上,身份验证始终是有状态的:您必须首先进行身份验证,获取票证,然后执行请求。服务器是存储票证还是将票证创建为自我验证对客户端是透明的。【参考方案2】:

Passport 之类的东西(不,不是威士忌,而是中间件)可能是一个很好的测试方法

它允许以简单透明的方式在许多不同的身份验证方法中进行选择

【讨论】:

以上是关于Node.JS RESTful API 的最佳身份验证方法的主要内容,如果未能解决你的问题,请参考以下文章

通过安全令牌进行 API 身份验证的最佳实践(Node.js 服务器和移动应用程序)

使用 JWT (Node.js + mongoose) 在 REST API 中管理用户权限的最佳方法

如何保护移动和 AJAX 调用的 JSON RESTful API?

保护 Node.js RESTful API

如何存储 RESTful API 的身份验证数据

如何在 Node.js 中最好地创建 RESTful API [关闭]