Angular 2 + Rails + Auth0

Angular 2 + Rails + Auth0

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

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

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

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

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

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

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

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


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

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

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

Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2JlbmZyYW5rbGlubGFicy5hdXRoMC5jb20vIiwic3ViIjoiYXV0aDB8NTgzMDZmOTFjMDg4MTRlMDEwMTVmNDM0IiwiYXVkIjoiajNKdHpjYnNpTUkyR0JkRnZGb3FFTjM4cUtTVmI2Q0UiLCJleHAiOjE0Nzk4OTc3OTYsImlhdCI6MTQ3OTg2MTc5Nn0.2cGLY_e7jY0WL-ue4NeT39W4pdxJVSeOT5ZGd_xNmJk

"Bearer"之后,"eyJ0"开始的部分是JSON Web Token。从今以后,我将 JSON Web 令牌简称为 "token".

当Rails收到HTTP请求后,可以抓取token然后解码。在我的例子中,我使用 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 table 有一个 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 身份验证的教程,因为据我所知,none 当前存在。