如何从 PKCE 流程中的 Auth0 租户提供的 auth_token 获取用户信息

How to get User information from auth_token supplied by Auth0 tenant in PKCE flow

我刚刚从我的 Cordova Ionic5 移动应用程序成功实施了 PKCE Flow,然后使用 auth_token 对我的 .NET Core 3.1 Web Api 进行授权。

问题是我无法从我的 .NET Core Web 访问用户信息 Api: 姓名、电子邮件等

我真的需要知道刚刚通过身份验证的用户“是谁”。你能帮忙吗?

PKCE流程 代码在我的Startup.cs

services.AddAuthentication(options =>
            {
                options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            }).AddJwtBearer(options =>
            {
                options.Authority = _configuration["Auth0:Domain"];
                options.Audience = _configuration["Auth0:Audience"];
            });

...

app.UseAuthentication();
app.UseAuthorization();

默认情况下,访问令牌不会包含用户信息,例如 nameemail.

下面是 Auth0 租户的默认身份验证示例访问令牌(使用带有 SPA 的 PKCE 流)。

{
  "iss": "https://example.auth0.com/",
  "sub": "auth0|REDACTED",
  "aud": [
    "REDACTED",
    "https://example.auth0.com/userinfo"
  ],
  "iat": 1599312415,
  "exp": 1599398815,
  "azp": "REDACTED",
  "scope": "openid profile email"
}

您的应用程序还应该收到一个 id_token,它可能如下所示(假设对 /authorize 的请求包括 openid、配置文件和电子邮件范围)。

{
  "nickname": "joe.blogs",
  "name": "joe.blogs@example.com",
  "picture": "REDACTED",
  "updated_at": "2020-09-04T10:21:07.315Z",
  "email": "joe.blogs@example.com",
  "email_verified": false,
  "iss": "https://example.auth0.com/",
  "sub": "auth0|REDACTED",
  "aud": "REDACTED",
  "iat": 1599312415,
  "exp": 1599348415,
  "nonce": "REDACTED"
}

因此,您有几个选项可以将姓名和电子邮件发送到您的 back-end API。

  1. 在您的应用中,解析 id_token JWT 以获取姓名和电子邮件,然后将这些字段显式传递给您的 back-end API.
  2. 可以 通过 Auth0 rules 使用名称和电子邮件丰富访问令牌。这是将 email 添加到访问令牌的示例规则(注意:未经测试):
function addAttributes(user, context, callback) {
  context.accessToken.email = user.email;
  callback(null, user, context);
}

查看 Auth0 的文档 context object and user object 以查看您有权访问的内容...

我认为选项 #1 是更好的方法,因为; a) 我不喜欢在访问令牌中包含 PII,并且 b) 依赖访问令牌来获取姓名和电子邮件等信息可能会导致后续问题(例如,如果您的 back-end API 还需要使用没有此信息的 Auth0 M2M 令牌进行调用。

最后在您的.NET 应用程序中,您可以通过解析授权HTTP header 中的JWT 来获取您需要的信息。让我知道您是否需要有关这部分的更多信息(如果需要,我也可以提供帮助)...只是假设主要问题是您在 JWT 访问令牌中没有所需的用户信息(您如果你按照我的指示现在应该)...