Auth0 - 从 refresh_token 获取 id_token

Auth0 - get id_token from refresh_token

在我们的 7+ 微服务中,我们依赖于 Auth0 id_token。交换 refresh_token (POST myapp.auth0.com/oauth/token) 时,我只返回 access_token 而不是 id_token.

如何用 Auth0 的 API 将 refresh_token 换成 id_token

从技术上讲,refresh_token 授权类型是 OAuth 2.0 的一部分,id_token 是 OpenID Connect 的一部分,OpenID Connect 是一种建立在 OAuth 2.0 之上的身份协议。

OAuth 2.0 的 refresh_token 授权类型允许更新访问令牌(仅)。 OpenID Connect 没有定义除此之外的其他行为是有充分理由的:id_token 被定义为用户身份验证事件的结果,因此没有用户交互的 "authentication refresh" 不会导致新的 id_token。用户可能已离开、注销或同时删除了 his/her 帐户。

刷新 id_token 应该通过再次将用户发送到 OpenID Connect 提供商来完成,而不是通过自主使用刷新令牌。

似乎授予刷新令牌是为了 Auth0 的新 API 授权功能。我正在寻找的端点是 /delegation.

示例 Node.js 代码:

const tokenClient = axios.create({
  baseURL: `https://${env.AUTH0_DOMAIN}`,
  headers: {
    'content-type': 'application/json'
  }
})

const refreshTokenClient = {
  getAccessToken: (refreshToken) => {
    // The official Node.js SDK for Auth0 does not
    // support this it would seem (it forces passing id_token)
    return tokenClient.post('/delegation', {
      client_id: env.AUTH0_CLIENT_ID,
      target: env.AUTH0_CLIENT_ID,
      grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',
      refresh_token: refreshToken,
      scope: 'openid',
      api_type: 'auth0'
    }).then(r => r.data)
  }
}