我目前正在使用NodeJS和Express为使用Ionic框架编写的移动应用程序开发REST API。
我有一个mysql数据库,其中存储了我的用户。
我希望我的API在我的用户身份验证以及访问API的某些路由和资源的权利方面是安全的。
我的用户可以使用自己的凭据登录/注册,也可以使用Facebook进行注册。
所以,这就是我现在正在做的事情:
我这样用:
router.route('/protected/route')
.put(auth.isAuthenticated, controller.someMethod);
auth.isAuthenticated看起来像这样:
passport.use(new BasicStrategy(
function(username, password, callback) {
Account.findByEmailAndPassword(username, password, function(err, user) {
if (err) { callback(err) };
if (!user) { return callback(null, false); }
return callback(null, user);
});
}
));
exports.isAuthenticated = passport.authenticate('basic', { session : false });
controller.someMethod()
中,我在req.user
中获取了我的用户对象。我的数据库中有一个字段type
,我可以检查用户的类型是什么,并继续我的请求。现在,使用Facebook:
它们都像魅力一样,但我遇到了一些问题:
第一个问题把我带到了其他人面前。我到处都读过Basic Auth不够安全。所以我首先考虑购买SSL证书,然后将我的身份验证系统更改为OAuth 2.0。
我在想,如果我这样做,我就可以将令牌发回给我用Facebook登录的用户,这将回答我的第一个问题。
有很多事情似乎都不清楚OAuth2.0,我不想开始实现它,然后弄清楚它不是我的问题的正确解决方案。我一直认为如果您希望其他服务使用您的服务,OAuth2.0是正确的系统。我错了?
答案 0 :(得分:0)
好。首先是第一件事。如果您通过SSL执行此操作,则HTTP Basic非常安全。
OAuth 2.0是一种授权方法。
当您想代表在其他服务上注册的用户进行API调用时,会使用OAuth。其他服务必须提供OAuth功能才能供您使用。让我们说,您不希望在您的应用中拥有注册功能,但想要通过Facebook等注册用户,您可以选择使用Facebook登录。那么,您要求用户访问他们的一些Facebook帐户信息(或多或少)。您可以在此处阅读:https://www.digitalocean.com/community/tutorials/an-introduction-to-oauth-2
另一方面,您可以成为提供商,以便其他服务可以使用您的服务。
许多服务允许您创建本地帐户,并且还可以选择使用Facebook,Google等其他服务进行注册.....在后端处理案例。
假设您想要选择使用Facebook登录,您将需要处理几个案例:
将Facebook登录与已登录的帐户相关联 - 有人使用应用程序的自定义登录系统创建帐户。之后,当他们仍然登录时,他们希望将自己的Facebook帐户与之关联起来。例如,人们可以使用电子邮件地址和密码注册Spotify,但他们稍后可以选择使用Facebook登录将该帐户与其Facebook帐户相关联,例如当他们想要将他们的收听活动发布到他们的时间线时。
为此,您希望在Spotify中添加Facebook登录流程。
您需要注意的一件事是合并您的本地帐户和Facebook流量帐户信息。建议您为此创建单独的表格,因为当您想要添加更多提供商(如Google等)时,这将简化流程。
将单独创建的帐户与Facebook登录合并 - 在这种情况下,用户使用自己的凭据(例如电子邮件和密码)登录到您的应用。之后,当此人退出时,他们会选择使用Facebook登录登录您的应用。您的应用程序现在将拥有两个同一个人的帐户,一个通过应用程序登录系统创建,另一个通过Facebook登录流程创建。为了给该人提供最佳体验,您的应用应尝试将这些帐户合并为一个。
为此,您必须从Facebook请求发送电子邮件(假设您的应用需要电子邮件进行注册)。如果它与您在应用中注册的电子邮件相同,则可以合并这些帐户。如果不一样,那么您应该选择连接现有的电子邮件/帐户。
您应该了解详情:https://developers.facebook.com/docs/facebook-login/multiple-providers