【问题标题】:Angular 2 + Rails + Auth0Angular 2 + Rails + Auth0
【发布时间】:2017-04-03 23:41:11
【问题描述】:

我正在尝试弄清楚如何将 Auth0 与 Angular/Rails 应用程序一起使用。

我已经用一个仅限 Angular 的应用程序设置了 Auth0,它运行良好。我可以看到Auth0 docs for Rails,据我所知这是有道理的。

我不明白如何将前端身份验证与 Rails 连接起来,因为我在任何地方都找不到这方面的文档。

【问题讨论】:

  • 嗨,杰森,我也在搜索相同的内容,但没有运气。所以我采取了一种方式。并通过在 Rails 中创建一个 api 并在前端分别使用 facebook、google 身份验证来解决它(正如他们在文档中提到的那样)。
  • 注意:自从发布问题后,我写了一个blog post about this topic

标签: ruby-on-rails angularjs authentication auth0


【解决方案1】:

根据您提供的信息,我假设您希望拥有一个在 Angular 中实现前端并使用基于 Rails 的 API 来提供 Angular 前端所需服务的应用程序。

在这种情况下,您可以从 Auth0 方面将其建模为单个(客户端)应用程序,并执行以下操作之一:

  1. 将身份验证产生的 ID 令牌用于两个目的:
    • 向 Angular 应用程序提供有关当前经过身份验证的用户的信息,以便它可以满足任何适用的用户界面要求
    • 作为对 Angular 应用程序对 Rails API 的调用进行身份验证的一种方式,即 Rails API 使用基于令牌的身份验证系统,该系统接受 Auth0 颁发的 ID 令牌。
  2. 在 Rails API 上公开一个端点,Angular 可以使用该端点将在用户身份验证时收到的 ID 令牌与任何其他凭据交换,以后可以使用这些凭据访问 API。

第一个选项最容易实现,但您必须在每个请求中包含 ID 令牌。第二个会增加您的复杂性,但它可能会为您提供更大的灵活性。

如果这不能解决您的所有问题,您能否更新问题,提供有关您尝试完成的确切场景的更多详细信息。


最后一点,如果您的意图是提供一个 API,以后可以由不同范围的应用程序使用,那么保护它的最正确方法是使用基于令牌的系统,在该系统中,令牌将由符合 OAuth2 的授权服务器。

拥有自己的 OAuth2 授权服务器维护起来非常复杂,因此 Auth0 正在将其作为一项附加服务启用,该服务已可用于美国地区帐户的预览模式。这基本上允许获取作为身份验证过程的一部分的 ID 令牌,客户端应用程序使用该 ID 令牌来了解当前经过身份验证的用户,以及允许调用指定 API 的访问令牌。

【讨论】:

    【解决方案2】:

    好的,我想通了。如果我使用 Auth0 在 Angular 端进行身份验证,然后向我的 Rails 服务器发出 HTTP 请求,则该 HTTP 请求将具有一个 Authorization 标头,其值如下:

    承载eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2JlbmZyYW5rbGlubGFicy5hdXRoMC5jb20vIiwic3ViIjoiYXV0aDB8NTgzMDZmOTFjMDg4MTRlMDEwMTVmNDM0IiwiYXVkIjoiajNKdHpjYnNpTUkyR0JkRnZGb3FFTjM4cUtTVmI2Q0UiLCJleHAiOjE0Nzk4OTc3OTYsImlhdCI6MTQ3OTg2MTc5Nn0.2cGLY_e7jY0WL-ue4NeT39W4pdxJVSeOT5ZGd_xNmJk P>

    “承载”之后的部分,以“eyJ0”开头的部分,是JSON Web Token。以后我将 JSON Web Token 简称为“令牌”。

    当 Rails 收到 HTTP 请求时,它可以抓取并解码令牌。就我而言,我使用的是Knock

    Knock 期望我的 User 模型定义一个 from_token_payload 方法。这是我的样子:

    class User < ApplicationRecord
      def self.from_token_payload(payload)
        User.find_by(auth0_id_string: payload['sub'])
      end
    end
    

    我的user 表有一个auth0_id_string 列。如果我手动创建一个用户,其auth0_id_string 与我在解码的 Auth0 令牌中在sub 下找到的内容相匹配,那么我的from_token_payload 方法将找到该用户,并且 Knock 会为该令牌竖起大拇指。如果没有找到用户,请点赞。

    大致是这样的:

    1. Angular 要求 Auth0 对用户进行身份验证
    2. Auth0 发回 JSON Web 令牌
    3. Angular 将该 JSON Web 令牌发送到 Rails
    4. Rails 解码该令牌
    5. Rails 尝试查找与该令牌中的数据匹配的用户
    6. Rails 根据是否找到匹配用户发回 200 或 401

    缺少一些部分,但这就是要点。我可能最终会写一篇关于 Angular + Rails + Auth0 身份验证的教程,因为据我所知,目前还没有。

    【讨论】:

      猜你喜欢
      • 2016-08-04
      • 2016-09-25
      • 1970-01-01
      • 2017-12-08
      • 2018-08-27
      • 2017-08-31
      • 2018-05-25
      • 2016-12-25
      • 2017-01-10
      相关资源
      最近更新 更多