请求/获取用于访问 API 的访问令牌 (Auth0)

Bre*_*ski 6 api auth0 next.js

我正在学习如何将 Auth0 与我们的 Next.js 应用程序一起使用。使用nexjs-auth0 SDK。我已成功通过 Auth0 进行身份验证并收到 ID 令牌和访问令牌(用于 Auth0 管理 api)。这似乎是事物的默认配置。我们设置了一个 API,它也将使用 Auth0 身份验证。在阅读了几个小时的文档后,我无法弄清楚如何获取用于 API 的 access_token。

我一直读到您不使用 API 的 ID 令牌(配置文件信息),而是使用访问令牌。此外,当您对用户进行身份验证(登录)时,它会读取以获取访问令牌。我一直无法弄清楚这一点。

我已经在 Auth0 中定义了应用程序和 API 端点。有一个用户设置并分配了一个角色。我对这个角色有几个范围。

我是否能够在同一登录调用中同时获取 API 的 ID 令牌和访问令牌,还是在用户登录后请求 API 访问令牌?我假设 API 访问令牌将是不记名 jwt 类型令牌。

Nic*_* K9 10

现在是 2021 年,Auth0 已使该nextjs-auth0库退出测试版。示例设置并未提及initAuth0()这一点,但如果您调用getAccessToken()Next API 路由,您仍然会得到一个如下所示的短令牌:vVuzVl6e0O-ydWeJXtvweASvhnWoav7w。这是因为Auth0 使用该audience参数来确定是提供不透明令牌还是 JWT。

要获取要放入标头中的 JWT 不记名令牌Authorization,您只需将受众和范围作为参数添加handleAuth()内部调用中pages/api/auth/[...auth0].js

// pages/api/auth/[...auth0].js
import { handleAuth, handleLogin } from '@auth0/nextjs-auth0';

export default handleAuth({
  async login(req, res) {
    try {
      await handleLogin(req, res, {
        authorizationParams: {
          audience: 'https://api.example.com/products', // or AUTH0_AUDIENCE
          // Add the `offline_access` scope to also get a Refresh Token
          scope: 'openid profile email read:products' // or AUTH0_SCOPE
        }
      });
    } catch (error) {
      res.status(error.status || 400).end(error.message);
    }
  }
});
Run Code Online (Sandbox Code Playgroud)

然后,从 API 路由中进行的调用getAccessToken()将返回 JWT,您可以使用它来调用 API:

// pages/api/widget/[id].js
import { getAccessToken, withApiAuthRequired } from '@auth0/nextjs-auth0';

export default withApiAuthRequired(async function widget(req, res) {
  try {
    const { accessToken } = await getAccessToken(req, res);
    const { id } = req.query

    const response = await fetch(`https://MY_API_DOMAIN/widget/${id}`, {
        headers: {
            Authorization: `Bearer ${accessToken}`
        }
    })
    const widget = await response.json()

    res.status(200).json(widget)
  } catch(error) {
    console.error(error)
    res.status(error.status || 500).end(error.message)
  }
});
Run Code Online (Sandbox Code Playgroud)


Bre*_*ski 5

经过多次痛苦和提问后,您发现您需要在请求中包含 API 的受众。对于Next.js-Auth0 SDK,我们这个问题的范围,这可以在初始化 Auth0 时完成。

在文件中lib/auth0.js

import { initAuth0 } from '@auth0/nextjs-auth0'

export default initAuth0({
  clientId: process.env.AUTH0_CLIENT_ID,
  clientSecret: process.env.AUTH0_CLIENT_SECRET,
  scope: process.env.AUTH0_SCOPE,
  audience: 'http://api.example.com/v1',
  domain: process.env.AUTH0_DOMAIN,
  redirectUri: process.env.REDIRECT_URI,
  postLogoutRedirectUri: process.env.POST_LOGOUT_REDIRECT_URI,
  session: {
    cookieSecret: process.env.SESSION_COOKIE_SECRET,
    cookieLifetime: process.env.SESSION_COOKIE_LIFETIME,
  },
})
Run Code Online (Sandbox Code Playgroud)

我将受众参数添加到该文件 ( audience: 'http://api.example.com/v1',),并将其设置为API Identifier来自 Auth0 仪表板的 。

这是另一个令人困惑的地方,因为当您在 Auth0 中设置自定义 API 时,它同时具有 和IdIdentifier。您可以在顶部的标题旁边找到标识符。据我所知,标识符是端点的 uri。

添加audience参数后,当用户登录时,收到的 accessToken 现在是一个 JWT 不记名令牌,可以与我的 API 一起使用。它仅包含所需的安全位,而不包含配置文件位。

要向 accessToken 添加权限,请在Auth0 仪表板中针对该 API进行以下更改:

  • 启用RBAC - true/on
  • 在访问令牌中添加权限 - true/on