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