如何使用passport.js通过RESTful API而不是通过Web界面处理身份验证(例如本地和Facebook)?
特别关注的是处理从回调到RESTful响应(JSON)的数据传递与使用典型的res.send({data:req.data}),设置重定向到Facebook的初始/登录端点(/无法通过AJAX访问登录,因为它不是JSON响应 - 它是通过回调重定向到Facebook。
我找到https://github.com/halrobertson/test-restify-passport-facebook,但我无法理解它。
此外,passport.js如何存储身份验证凭据?服务器(或者它是服务?)由MongoDB支持,我希望凭证(登录和pw的盐水哈希)存储在那里,但我不知道passport.js是否具有这种类型的功能。
答案 0 :(得分:309)
这里提出了许多问题,似乎即使问题是在Node和passport.js的背景下提出的,真正的问题更多地是关于工作流而不是如何使用特定技术来实现这一点。
让我们使用@Keith示例设置,修改一下以增加安全性:
https://example.com
的网络服务器提供单页Javascript客户端应用https://example.com/api
上的RESTful Web服务为富客户端应用提供服务器支持https://example.com/api
https://example.com/api
处的网络服务,但不知道https://example.com
处的网络服务器。请注意,我使用的是安全HTTP。在我看来,这是开放时可用的任何服务必须的,因为密码和授权令牌之类的敏感信息正在客户端和服务器之间传递。
让我们先看看普通旧身份验证的工作原理。
https://example.com
https://example.com/api
向RESTful API发送一个或多个请求,以获取要在页面上呈现的用户特定数据。他们发送给Web服务的每个请求都将包含用户名和密码,可能采用HTTP Basic身份验证的形式,因为RESTful服务不允许将客户端状态从一个请求维护到下一个请求。由于Web服务使用安全HTTP,因此密码在传输过程中会被安全加密。https://example.com/api
处的网络服务收到大量个别请求,每个请求都包含身份验证信息。根据用户数据库检查每个请求中的用户名和密码,如果发现正确,则执行所请求的功能,并以JSON格式将数据返回给客户端。如果用户名和密码不匹配,则会以401 HTTP错误代码的形式向客户端发送错误。此示例的重要一点是, RESTful Web服务需要对每个请求进行身份验证。
除了用户身份验证之外,此方案中的附加安全层还将添加客户端应用程序授权。例如,如果您拥有使用Web服务的Web客户端,iOS和Android应用程序,您可能希望服务器知道给定请求的三个客户端中的哪一个,而不管经过身份验证的用户是谁。这可以使您的Web服务将某些功能限制为特定客户端。为此,您可以使用API密钥和秘密,请参阅this answer以获取有关的一些想法。
上述工作流程不适用于Facebook连接,因为通过Facebook登录有第三方Facebook本身。登录程序要求用户被重定向到Facebook的网站,其中的凭据是在我们控制范围之外输入的。
让我们看看情况如何变化:。
https://example.com
https://example.com/auth/facebook
的链接。https://example.com/auth/facebook
路由由passport.js处理(请参阅documentation)https://example.com/auth/facebook/callback
路由的passport.js处理程序将调用回调函数,该函数接收来自Facebook的Facebook访问令牌和一些用户信息,包括用户的电子邮件地址。https://example.com/auth/facebook/callback
的所有请求都将包括用于身份验证的Facebook访问令牌,或者通过" get_access_token"来自Facebook的令牌生成的应用程序自己的访问令牌。 REST API中的函数。我希望这能回答大部分问题。当然,您可以使用Twitter,Google或任何其他基于OAuth的身份验证服务替换Facebook。
我有兴趣知道某人是否有更简单的方法来解决这个问题。
答案 1 :(得分:11)
我非常感谢@ Miguel对每个案例的完整流程的解释,但我想在Facebook身份验证部分添加一些。
Facebook提供Javascript SDK,您可以使用它直接在客户端获取访问令牌,然后将其传递到服务器并用于进一步从Facebook获取所有用户信息。所以你基本上不需要任何重定向。
此外,您还可以为移动应用程序使用相同的API端点。只需使用Facebook的Android / iOS SDK,在客户端获取Facebook access_token并将其传递给服务器。
关于无状态特性,如上所述,当get_access_token用于生成令牌并传递给客户端时,此令牌也存储在服务器上。所以它和会话令牌一样好,我相信这会使它成为有状态的吗?
只需2美分..
答案 2 :(得分:3)