【问题标题】:Clarify some things about OAuth2.0 and Node.JS REST API澄清一些关于 OAuth2.0 和 Node.JS REST API 的事情
【发布时间】:2017-03-28 21:21:06
【问题描述】:

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

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

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

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


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

  • 用户使用我的 API 路由之一进行注册
  • 当他想要访问受保护的路由时,我使用 passport-http 的基本身份验证基本策略。

我是这样使用的:

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、电子邮件、名字和姓氏。
    • 我将这些信息发回给客户。如果他愿意,他可以修改他的名字和姓氏。然后将其发送回 API。
    • API 注册用户。

它们都像一个魅力,但我面临一些问题:

  1. 在注册 facebook 时,如果用户 id 已经在数据库中,我认为用户已经订阅了我的服务。但是之后我如何使用基本身份验证来识别他?

第一个问题把我带到了其他问题。我到处都读到基本身份验证不够安全。所以我在想,首先,购买一个 SSL 证书,然后将我的认证系统更改为 OAuth 2.0。

我在想,如果我这样做,我将能够向使用 Facebook 登录的用户发回一个令牌,这将回答我的第一个问题。

  1. 但是 OAuth2.0 是这里的解决方案吗?
  2. 我的 Facebook 注册是否正确?
  3. 当我想在我的 Ionic 应用程序上使用我自己的用户登录时,这些回调是如何工作的?

关于 OAuth2.0 似乎有很多不清楚的地方,我不想开始实施它,然后发现它不是解决我的问题的正确解决方案。如果您希望其他服务使用您的服务,我一直认为 OAuth2.0 是选择的正确系统。我错了吗?

【问题讨论】:

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


    【解决方案1】:

    好的。所以第一件事。如果您通过 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 请求电子邮件(假设您的应用需要电子邮件才能注册)。如果与您应用中注册的邮箱相同,则可以合并这些账户。如果不一样,那么您应该提供连接现有电子邮件/帐户的选项。

    您应该通过以下方式了解更多信息:https://developers.facebook.com/docs/facebook-login/multiple-providers

    【讨论】:

      猜你喜欢
      • 2014-03-29
      • 2021-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多