澄清有关OAuth2.0和Node.JS REST API的一些内容

时间:2016-11-15 04:53:23

标签: node.js facebook rest api oauth-2.0

我目前正在使用NodeJS和Express为使用Ionic框架编写的移动应用程序开发REST API。

我有一个mysql数据库,其中存储了我的用户。

我希望我的API在我的用户身份验证以及访问API的某些路由和资源的权利方面是安全的。

我的用户可以使用自己的凭据登录/注册,也可以使用Facebook进行注册。

所以,这就是我现在正在做的事情:

  • 使用我的API路线之一的用户注册
  • 当他想访问受保护的路线时,我使用passport-http的Basic Basic for Basic Auth。

我这样用:

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:

  • 客户端使用Facebook的“登录”按钮,授权我的应用访问其数据,然后获取access_token。它通过HTTP请求发送到我的API。
  • API获取令牌,然后开始调用Facebook Graph API来询问有关用户的信息,例如他的id,email,firstName和lastName。
    • 我将这些信息发送回客户端。如果他愿意,他可以修改他的firstName和lastName。然后将其发回API。
    • API注册用户。

它们都像魅力一样,但我遇到了一些问题:

  1. 在Facebook注册时,如果用户ID已经在数据库中,我认为用户已经订阅了我的服务。但是我怎么能在之后用基本的身份证明来识别他?
  2. 第一个问题把我带到了其他人面前。我到处都读过Basic Auth不够安全。所以我首先考虑购买SSL证书,然后将我的身份验证系统更改为OAuth 2.0。

    我在想,如果我这样做,我就可以将令牌发回给我用Facebook登录的用户,这将回答我的第一个问题。

    1. 但这是OAuth2.0的解决方案吗?
    2. 我在Facebook注册时做得对吗?
    3. 当我想在我的Ionic应用程序上使用我自己的用户登录时,该回调功能如何工作?
    4. 有很多事情似乎都不清楚OAuth2.0,我不想开始实现它,然后弄清楚它不是我的问题的正确解决方案。我一直认为如果您希望其他服务使用您的服务,OAuth2.0是正确的系统。我错了?

1 个答案:

答案 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登录,您将需要处理几个案例:

  1. 将Facebook登录与已登录的帐户相关联 - 有人使用应用程序的自定义登录系统创建帐户。之后,当他们仍然登录时,他们希望将自己的Facebook帐户与之关联起来。例如,人们可以使用电子邮件地址和密码注册Spotify,但他们稍后可以选择使用Facebook登录将该帐户与其Facebook帐户相关联,例如当他们想要将他们的收听活动发布到他们的时间线时。

    为此,您希望在Spotify中添加Facebook登录流程。

    您需要注意的一件事是合并您的本地帐户和Facebook流量帐户信息。建议您为此创建单独的表格,因为当您想要添加更多提供商(如Google等)时,这将简化流程。

  2. 将单独创建的帐户与Facebook登录合并 - 在这种情况下,用户使用自己的凭据(例如电子邮件和密码)登录到您的应用。之后,当此人退出时,他们会选择使用Facebook登录登录您的应用。您的应用程序现在将拥有两个同一个人的帐户,一个通过应用程序登录系统创建,另​​一个通过Facebook登录流程创建。为了给该人提供最佳体验,您的应用应尝试将这些帐户合并为一个。

    为此,您必须从Facebook请求发送电子邮件(假设您的应用需要电子邮件进行注册)。如果它与您在应用中注册的电子邮件相同,则可以合并这些帐户。如果不一样,那么您应该选择连接现有的电子邮件/帐户。

  3. 您应该了解详情:https://developers.facebook.com/docs/facebook-login/multiple-providers