TL;DR:Auth0 是企业级身份验证提供商,支持 SAML、SSO、SCIM 及自定义规则。在 auth0.com 创建租户和应用,配置回调 URL,接入 SDK,完成跳转。当你需要让 IT 部门接入企业身份提供商时,选 Auth0 而非 Clerk。
Auth0 是企业级身份验证提供商,由 Okta 收购,专为需要 SAML / SSO / SCIM 的场景而生。相比 Clerk,它的管理界面更复杂,但规则自定义能力更强。当你的身份验证需求包括"Fortune 500 的 IT 部门可以接入自己的身份提供商"时,Auth0 是正确的选择。
对于独立 SaaS 来说,Auth0 过于重量级。它真正适合的是面向 IT 部门销售的 B2B 产品。
前往 auth0.com/signup ↗ 注册账号。免费套餐:B2C 每月 7,500 个活跃用户,或开启 SSO 的 B2B 场景 50 个 MAU。
注册时需要填写租户名称和所在地区。租户是顶层容器,其他所有内容(应用、连接、规则)都归属于它。大多数团队会按环境划分租户(开发、预发布、生产)。
进入 Auth0 控制台 → Applications → Create Application。填写以下信息:
点击 Create 后,你将获得 Domain、Client ID 以及(机密应用)Client Secret。
AUTH0_DOMAIN=your-tenant.auth0.com
AUTH0_CLIENT_ID=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
AUTH0_CLIENT_SECRET=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # NEVER in browser
AUTH0_AUDIENCE=https://yourapp.com/api # for API auth (Step 8)
在应用设置页滚动到 Application URIs,添加以下内容:
http://localhost:3000/api/auth/callback, https://yourapp.com/api/auth/callbackhttp://localhost:3000, https://yourapp.comhttp://localhost:3000, https://yourapp.com地址必须精确匹配。末尾斜杠、http 与 https 的区别、端口号——都会影响匹配结果。保存配置。
Auth0 控制台 → Authentication → Database 用于邮箱/密码登录。或者:
Authentication → Social 用于 Google、GitHub、Apple、Microsoft、Facebook 等社交登录——一键开启;Auth0 提供默认的开发者凭证,也可以粘贴你在各提供商后台创建的自有凭证(生产环境推荐)。
Authentication → Enterprise 用于 SAML、ADFS、Azure AD / Microsoft Entra ID、Google Workspace、Okta、OneLogin——这些正是你的企业客户 IT 部门希望接入的选项。
npm install @auth0/nextjs-auth0
配置环境变量(参见步骤 2)。创建 API 路由:
// app/api/auth/[auth0]/route.ts
import { handleAuth } from '@auth0/nextjs-auth0';
export const GET = handleAuth();
包裹你的应用:
// app/layout.tsx
import { UserProvider } from '@auth0/nextjs-auth0/client';
export default function RootLayout({ children }) {
return (
<html>
<body>
<UserProvider>{children}</UserProvider>
</body>
</html>
);
}
其他框架的快速入门:React、Vue、Angular、Express、Python、Java、.NET、iOS、Android ↗。
<a href="/api/auth/login">Sign in</a>
<a href="/api/auth/logout">Sign out</a>
点击登录后,用户会被重定向到 Auth0 的 Universal Login 页面——这是 Auth0 托管的登录界面。用户在此完成身份验证,Auth0 随后携带 session cookie 跳回你的应用。
Universal Login 支持自定义:控制台 → Branding → Universal Login,可调整颜色、Logo 和文案。如需更深度定制(使用自己的 UI),请使用内嵌登录流程(更复杂;内嵌文档 ↗)。
// Server side (Next.js)
import { getSession } from '@auth0/nextjs-auth0';
export default async function Dashboard() {
const session = await getSession();
if (!session) redirect('/api/auth/login');
return <div>Hello {session.user.name}</div>;
}
// Client side
import { useUser } from '@auth0/nextjs-auth0/client';
export function Profile() {
const { user, isLoading } = useUser();
if (isLoading) return null;
if (!user) return <a href="/api/auth/login">Sign in</a>;
return <img src={user.picture} alt={user.name} />;
}
对于独立的后端 API(而非仅依赖 session),Auth0 会签发 JWT,由你的服务器负责验证。
Auth0 控制台 → Applications → APIs → Create API。设置 Identifier(例如 https://yourapp.com/api)——这将作为 JWT 的 audience 使用。
在你的 API 中:
npm install jose
import { jwtVerify, createRemoteJWKSet } from 'jose';
const JWKS = createRemoteJWKSet(new URL(
`https://${process.env.AUTH0_DOMAIN}/.well-known/jwks.json`
));
export async function verifyAuth(req) {
const auth = req.headers.get('authorization');
if (!auth?.startsWith('Bearer ')) return null;
const token = auth.slice(7);
try {
const { payload } = await jwtVerify(token, JWKS, {
issuer: `https://${process.env.AUTH0_DOMAIN}/`,
audience: process.env.AUTH0_AUDIENCE,
});
return payload; // contains sub (user ID), permissions, etc.
} catch {
return null;
}
}
JWKS 轮换、签名验证——一切由 jose 处理。JWT 文档 ↗。
Auth0 的 Actions 可在身份验证流程的关键节点(登录后、注册前、发送密码重置邮件等)运行服务端 JavaScript。适用场景:
Auth0 控制台 → Actions → Flows → Login → Add Action → Build Custom。示例:
exports.onExecutePostLogin = async (event, api) => {
// Add a custom claim to the token
api.idToken.setCustomClaim('https://yourapp.com/role', event.user.app_metadata?.role || 'member');
};
如果你的客户是企业(每家企业有多个用户),请使用 Organizations。每个组织可以独立配置连接、成员、品牌和管理员角色。
Auth0 控制台 → Organizations → Create Organization。成员通过 URL 参数 ?organization=org_xxx 登录对应组织。
这是 Auth0 在 B2B 场景中最具竞争力的功能之一——Clerk 和 Supabase Auth 现在也有类似概念,但 Auth0 的实现最为完善。Organizations 文档 ↗。
默认情况下,用户在登录 URL 中会看到 your-tenant.auth0.com。生产环境建议配置自定义域名(如 login.yourapp.com):
Auth0 控制台 → Settings → Custom Domains → Add Domain。在你的 DNS 提供商处添加所需的 CNAME 记录,等待验证完成。
需要 Essentials 套餐或更高级别。
audience: AUTH0_AUDIENCE。若缺少此参数,你会得到一个不透明 token 而非 JWT,导致后端无法验证。