我正在学习如何将 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)
经过多次痛苦和提问后,您发现您需要在请求中包含 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 时,它同时具有 和Id和Identifier。您可以在顶部的标题旁边找到标识符。据我所知,标识符是端点的 uri。
添加audience参数后,当用户登录时,收到的 accessToken 现在是一个 JWT 不记名令牌,可以与我的 API 一起使用。它仅包含所需的安全位,而不包含配置文件位。
要向 accessToken 添加权限,请在Auth0 仪表板中针对该 API进行以下更改:
| 归档时间: |
|
| 查看次数: |
5115 次 |
| 最近记录: |