客户端、服务器、数据库和 Auth0 的一次性密码身份验证流程

One-Time-Password authentication flow with client, server, database and Auth0

我正在尝试使用 Auth0 通过 SMS 实现 OTP 身份验证流程(使用 Twillio 的 SMS 无密码连接)。

我们有一个移动应用程序,一个 API,一个数据库,我们使用 Auth0。

步骤:

  1. 用户输入 phone 个数字。
  1. 用户通过短信收到验证码
  1. 用户输入代码并收到 access_token、id_token 和 refresh_token
  1. 用户访问数据库中的资源。

这些是我的几个问题,但我对 OTP 的一般身份验证流程更加困惑。

Auth0 可帮助您处理身份验证过程,您的 API 需要确定用户在每个请求中可以访问和不能访问的内容。此过程称为授权。换句话说,身份验证从 client-side 开始,而 授权 从 server-side.

开始

身份验证(客户端)

在您的示例中,客户端直接将 phone 号码发送给 Auth0,Auth0(幕后的 Twillio)发回代码。

客户端将凭据(phone 号码和代码)发回给验证它们的 Auth0。一旦代码成功,Auth0 将访问信息封装在称为 访问令牌(JWT- JSON Web 令牌) 的东西中,并将身份信息封装在称为 ID 的东西中token. 更多关于代币的信息在这里 https://auth0.com/docs/tokens

移动应用程序在本地存储访问令牌和刷新令牌。

授权(后端)

当用户需要向受保护的 API 端点发出请求时,客户端应用程序必须将访问令牌与对 API 的请求一起发送,然后才能执行授权过程。 access_token 必须在它对受保护端点发出的每个请求的授权 header 中。

服务器验证访问令牌。如果 access_token 无效,请使用刷新令牌获取额外的访问令牌。如果有效,则服务器确定令牌持有者是否可以使用令牌中的信息访问请求的端点。

您的服务器(问题中的第 3 点)需要一些东西来启动授权过程。您将必须使用 JWT 策略验证访问令牌。如果您使用的是 nodejs,有一个名为 Passport 的好模块可以帮助您。

要配置 JWT 策略,您需要来自 Auth0 的两个值:Auth0 Issuer URLAuthO Audience。 您将通过在 Auth0 仪表板中创建 api 来获得这些值。

这意味着 Passport 验证全部由 Auth0 仪表板中您创建的租户 (api) 中的 Auth0 处理。 Auth0 确定了 logged-in 用户的身份,然后在负载 object 中传递有关用户的数据,您可以通过控制器和中间件在整个 request-response 周期中访问这些数据。

如果 access_token 无效,您的受保护端点例如 /account 会自动调用您的 JwtStrategy 配置逻辑并阻止请求。

这篇文章对我理解 OAuth 流程有很大帮​​助,我在这里引用了很多 :) https://auth0.com/blog/developing-a-secure-api-with-nestjs-getting-started/