【问题标题】:Retrieve email from token | @auth0/auth0-spa-js从令牌中检索电子邮件 | @auth0/auth0-spa-js
【发布时间】:2019-08-22 17:31:42
【问题描述】:

我一直在尝试从 auth0-js 升级到 @auth0/auth0-spa-js,尽管我无法专心阅读来自令牌又是从await useAuth0().getTokenSilently()获得的

我使用jwt.io 来解密令牌,这就是我在有效负载中得到的:

{
  "iss": "https://TENANT_NAME.auth0.com/",
  "sub": "auth0|SOME_HASH",
  "aud": [
    "https://API_IDENTIFIER",
    "https://TENANT_NAME.auth0.com/userinfo"
  ],
  "iat": 1563699940,
  "exp": 1563786340,
  "azp": "SOME_OTHER_HASH",
  "scope": "openid profile email"
}

当我使用 auth0-js 时,我可以将 scope: "openid email" 添加到 new auth0.WebAuth({...}) 和瞧——我有 email 和 email_verified在解密令牌的有效负载中。

我相信2 part series of tutorials 无法回答我的问题,并且从我的 Apollo 配置中的钩子 getTokenSilently() 检索令牌本身也是一个挑战。但是,我喜欢 SPA 的重定向实现。请问,您能否建议一种在令牌的有效负载中包含 email 和 email_verified 的正确方法?

更新

通过阅读this piece of documentation on api-tokens,我了解到我从getTokenSilently() 获得的令牌称为访问令牌。直到今天,我一直在我的所有请求标头中使用 ID 令牌,这可能是一个不好的方法:

在符合 OIDC 的管道中,ID 令牌不应用作 API 令牌。

此外,文档说:

令牌不包含用户的任何信息,除了用户 ID(位于 sub 声明中)。

在许多情况下,您可能会发现检索其他用户信息很有用。您可以通过使用访问令牌调用 /userinfo API 端点来做到这一点。

我是通过关注the shell example 完成的。我已经使用我的访问令牌发送了请求,并且神奇地从 Auth0 的自定义 API 中获得了一个包含用户个人资料信息的对象。

我们已经接近了,将“sub”转换为驻留在 Auth0 的自定义 API 中的用户配置文件的算法是什么,我可以为我用 ruby​​ 编写的后端实现它?

【问题讨论】:

    标签: jwt access-token auth0


    【解决方案1】:

    是的,正如您提到的,ID 令牌不应用作 API 令牌。它们有不同的用法(您不希望 API 令牌太大,因为您在每个请求的标头中发送它)。

    要获取用户电子邮件,您只需获取 ID 令牌中给出的 UserProfile。为此,您只需调用getUser 而不是getTokenSilently。

    如果您想了解有关用户的更多信息,您有两种获取用户信息的方法:

    1. 您使用 Auth0 管理 API 根据用户 ID(在 ID 令牌的 sub 声明中)并使用 this API endpoint 获取用户信息。在 Ruby 中,您可以只使用一个基本的 HTTP 请求。

    2. 您使用规则始终在 ID 令牌中包含特定字段。例如,您可以在 ID 令牌中包含 user_metadata 和 app_metadata。这样,您无需额外的 API 调用即可使用它。为此,您需要生成a specific Rule that will run when ID Tokens (more general API doc)。

    将所有 user_metadata 和 app_metadata 添加到 ID 令牌的示例规则是:

    function (user, context, callback) {
      const namespace = 'your_url_namespace_just_for_cosmetic_but_required/';
      context.idToken[namespace + 'user_metadata'] = user.user_metadata;
      context.idToken[namespace + 'app_metadata'] = user.app_metadata;
      callback(null, user, context);
    }
    

    您的 ID 令牌中的信息将供您的前端使用。

    为了记录,this hard-to-find page上的更多规则示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-12
      • 2017-10-18
      • 2018-02-02
      • 2023-03-21
      • 2020-05-12
      • 1970-01-01
      • 2019-06-18
      • 2021-06-12
      相关资源
      最近更新 更多