You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Auth0与Next Auth中配置用户角色实现路由权限控制

解决方案:Auth0配置 + NextAuth权限控制实现

一、让Auth0角色出现在NextAuth的Token中

1. 确认用户角色已正确分配

先去Auth0控制台操作:

  • 进入用户管理 > 用户,找到目标测试用户
  • 切换到角色标签,确认已分配admin角色,且状态为已生效

2. 修改Post Login Action代码

你之前的Action里,event.user本身不包含角色信息,角色存储在event.authorization.roles中。修改Action代码,直接将角色写入ID Token:

exports.onExecutePostLogin = async (event, api) => {
  if (event.authorization?.roles) {
    // 若用户只有单个角色,直接写入单个值
    api.idToken.setCustomClaim("role", event.authorization.roles[0]);
    // 若用户有多个角色,可传入数组:api.idToken.setCustomClaim("roles", event.authorization.roles);
  }
};

保存并发布这个Action后,重新登录用户,就能在req.nextauth.token中看到role字段。

3. 验证NextAuth配置

确保你的[...nextauth].js中,Auth0 provider配置正确,若需要在session中也返回角色,可添加session回调:

import NextAuth from "next-auth";
import Auth0Provider from "next-auth/providers/auth0";

export default NextAuth({
  providers: [
    Auth0Provider({
      clientId: process.env.AUTH0_CLIENT_ID,
      clientSecret: process.env.AUTH0_CLIENT_SECRET,
      issuer: process.env.AUTH0_ISSUER_BASE_URL,
    }),
  ],
  callbacks: {
    async session({ session, token }) {
      session.user.role = token.role;
      return session;
    },
  },
});

二、在Middleware中调用Auth0管理API的方案可行性及配置

该方案可行,但不推荐作为首选——每次请求/admin路由都调用管理API会增加延迟,且消耗Auth0的API配额。如果必须使用,配置步骤如下:

1. 创建Auth0 Machine-to-Machine应用

  • 在Auth0控制台进入应用程序 > 应用,点击创建应用,选择Machine to Machine Applications
  • 关联Auth0 Management API,并授予read:users和read:roles权限
  • 记录该应用的Client ID、Client Secret和Domain

2. 在Middleware中调用管理API校验角色

修改middleware代码,在授权回调中调用Auth0管理API获取用户角色:

import { withAuth } from "next-auth/middleware";

// 获取Auth0管理API的访问令牌
async function getManagementApiToken() {
  const response = await fetch(`https://${process.env.AUTH0_DOMAIN}/oauth/token`, {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({
      client_id: process.env.AUTH0_M2M_CLIENT_ID,
      client_secret: process.env.AUTH0_M2M_CLIENT_SECRET,
      audience: `https://${process.env.AUTH0_DOMAIN}/api/v2/`,
      grant_type: "client_credentials",
    }),
  });
  const data = await response.json();
  return data.access_token;
}

export default withAuth(
  function middleware(req) {
    console.log(req.nextauth.token);
  },
  {
    callbacks: {
      async authorized({ token }) {
        if (!token?.sub) return false;
        // 获取管理API令牌
        const apiToken = await getManagementApiToken();
        // 调用管理API获取用户角色
        const response = await fetch(
          `https://${process.env.AUTH0_DOMAIN}/api/v2/users/${token.sub}/roles`,
          {
            headers: { Authorization: `Bearer ${apiToken}` },
          }
        );
        const roles = await response.json();
        // 校验是否有admin角色
        return roles.some(role => role.name === "admin");
      },
    },
  }
);

export const config = { matcher: ["/admin"] };

注意事项

  • 建议缓存管理API的访问令牌(比如存储在临时变量中,过期后再重新获取),避免每次请求都调用令牌接口
  • 该方案会增加请求延迟,优先推荐第一种直接将角色注入Token的方式

内容的提问来源于stack exchange,提问作者fweth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 16:03:15