教程 / 后端集成 / 使用 Auth0 添加身份验证
📝 文字 ● 中级 更新于 2026-05-22

如何使用 Auth0 为应用添加身份验证?

TL;DR:Auth0 是企业级身份验证提供商,支持 SAML、SSO、SCIM 及自定义规则。在 auth0.com 创建租户和应用,配置回调 URL,接入 SDK,完成跳转。当你需要让 IT 部门接入企业身份提供商时,选 Auth0 而非 Clerk。

Auth0 是企业级身份验证提供商,由 Okta 收购,专为需要 SAML / SSO / SCIM 的场景而生。相比 Clerk,它的管理界面更复杂,但规则自定义能力更强。当你的身份验证需求包括"Fortune 500 的 IT 部门可以接入自己的身份提供商"时,Auth0 是正确的选择。

何时选择 Auth0

0
  • 选择 Auth0 的场景——你的客户是需要 SAML / Microsoft Entra ID / Okta SSO 的企业,你需要 SCIM 用户预配,你的身份验证逻辑有复杂的多租户规则,或者你需要一个其他应用可以使用的 OIDC 提供商。
  • 选择 Clerk——解决相同问题,但开发体验更友好,中等规模下成本更低。
  • 选择 Supabase Auth——如果你已经在使用 Supabase。
  • 选择手动 OAuth——如果你只需要接入 1–2 个提供商,且希望不依赖第三方服务自行掌控全局。

对于独立 SaaS 来说,Auth0 过于重量级。它真正适合的是面向 IT 部门销售的 B2B 产品。

注册并创建租户

1

前往 auth0.com/signup ↗ 注册账号。免费套餐:B2C 每月 7,500 个活跃用户,或开启 SSO 的 B2B 场景 50 个 MAU。

注册时需要填写租户名称和所在地区。租户是顶层容器,其他所有内容(应用、连接、规则)都归属于它。大多数团队会按环境划分租户(开发、预发布、生产)。

创建应用

2

进入 Auth0 控制台 → Applications → Create Application。填写以下信息:

  • Name——你的应用名称。
  • Application type(应用类型):
    • Single Page Application (SPA)——React、Vue、Angular 客户端渲染应用。
    • Regular Web Application——Next.js、Express、服务端渲染应用。
    • Machine to Machine——后端服务间鉴权,无用户参与。
    • Native——iOS、Android、Electron。

点击 Create 后,你将获得 DomainClient 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)

配置回调 URL

3

在应用设置页滚动到 Application URIs,添加以下内容:

  • Allowed Callback URLs——多个地址用逗号分隔:http://localhost:3000/api/auth/callback, https://yourapp.com/api/auth/callback
  • Allowed Logout URLs——登出后的跳转地址:http://localhost:3000, https://yourapp.com
  • Allowed Web Origins——SPA 刷新 token 所需:http://localhost:3000, https://yourapp.com

地址必须精确匹配。末尾斜杠、http 与 https 的区别、端口号——都会影响匹配结果。保存配置。

启用身份提供商

4

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 部门希望接入的选项。

身份提供商文档 ↗

安装 SDK(Next.js 示例)

5
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 ↗

添加登录 / 登出链接

6
<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),请使用内嵌登录流程(更复杂;内嵌文档 ↗)。

读取当前用户信息

7
// 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} />;
}

使用 JWT 保护 API

8

对于独立的后端 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 文档 ↗

使用 Actions 添加自定义逻辑

9

Auth0 的 Actions 可在身份验证流程的关键节点(登录后、注册前、发送密码重置邮件等)运行服务端 JavaScript。适用场景:

  • 向 JWT 添加自定义声明(如角色、套餐信息)。
  • 在注册时将用户同步到你的数据库。
  • 拦截黑名单邮箱地址的注册请求。
  • 对特定用户群体强制启用 MFA。

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');
};

Actions 文档 ↗

Organizations(适用于 B2B / 多租户)

10

如果你的客户是企业(每家企业有多个用户),请使用 Organizations。每个组织可以独立配置连接、成员、品牌和管理员角色。

Auth0 控制台 → Organizations → Create Organization。成员通过 URL 参数 ?organization=org_xxx 登录对应组织。

这是 Auth0 在 B2B 场景中最具竞争力的功能之一——Clerk 和 Supabase Auth 现在也有类似概念,但 Auth0 的实现最为完善。Organizations 文档 ↗

为企业客户配置 SAML / SSO

11

大多数团队选择 Auth0 的核心原因:企业 SSO 开箱即用。

Auth0 控制台 → Authentication → Enterprise → SAML → Create Connection。使用客户的 IdP 元数据进行配置,并绑定到对应组织。该组织的用户随后便可通过公司 IdP(Okta、Microsoft Entra ID、OneLogin 等)完成登录。

Enterprise 套餐还支持 SCIM 预配(通过 IdP 自动创建/停用用户)。SAML 文档 ↗ · SCIM 文档 ↗

价格涨幅快于 Clerk。免费套餐看起来很慷慨(B2C 7,500 MAU),但 Organizations、自定义域名、MFA 强制、SAML 等生产功能均需付费升级到 Essentials 套餐($35+/月)。达到一定规模后,Auth0 的费用通常是 Clerk 的 3–10 倍。在做决定前先算清楚账。Auth0 定价 ↗

自定义域名

12

默认情况下,用户在登录 URL 中会看到 your-tenant.auth0.com。生产环境建议配置自定义域名(如 login.yourapp.com):

Auth0 控制台 → Settings → Custom Domains → Add Domain。在你的 DNS 提供商处添加所需的 CNAME 记录,等待验证完成。

需要 Essentials 套餐或更高级别。

常见问题

13
  • 回调 URL 不匹配——初次集成最常见的错误。请将所有变体(localhost、生产地址、带斜杠和不带斜杠)都添加到 Allowed Callback URLs。
  • SPA 将 token 写入 JS 包——SPA 应用没有 Client Secret,浏览器端只有 Client ID。如果你的"SPA"需要 secret,实际上应该选择 Regular Web Application 类型。
  • token 在会话中途过期——Auth0 默认 token 有效期较短(1 小时)。如需更长的会话,请使用 refresh token 或在应用设置中延长有效期。
  • 忘记添加 API audience——从前端调用自己的 API 时,登录时需要传入 audience: AUTH0_AUDIENCE。若缺少此参数,你会得到一个不透明 token 而非 JWT,导致后端无法验证。

官方参考资料

接下来学什么