用户认证
学习如何在 Next.js 应用中配置和自定义 Better Auth 认证系统。
本指南介绍如何使用 Better Auth 进行认证配置。Better Auth 是一个灵活的认证库,可与 Next.js 和 Drizzle ORM 无缝集成。
概述
Better Auth 提供:
- 邮箱/密码认证(开箱即用)
- OAuth 第三方登录(Google、GitHub 等)
- 会话管理(安全 Cookie)
- 数据库适配器(Drizzle ORM)
配置
认证配置位于 apps/web/lib/auth.ts:
import { betterAuth } from 'better-auth'
import { drizzleAdapter } from 'better-auth/adapters/drizzle'
import { db } from '@workspace/db'
export const auth = betterAuth({
database: drizzleAdapter(db, {
provider: 'pg',
}),
emailAndPassword: {
enabled: true,
},
})客户端使用
在组件中使用认证客户端助手:
import { signIn, signUp, signOut, useSession } from '@/lib/auth-client'
export function AuthButton() {
const { data: session } = useSession()
if (session) {
return <button onClick={() => signOut()}>退出登录</button>
}
return <button onClick={() => signIn.email({ email, password })}>登录</button>
}服务端使用
在 Server Components 中检查认证状态:
import { auth } from '@/lib/auth'
import { headers } from 'next/headers'
export default async function ProtectedPage() {
const session = await auth.api.getSession({
headers: await headers(),
})
if (!session) {
redirect('/auth')
}
return <div>欢迎,{session.user.name}</div>
}数据库 Schema
认证相关表定义在 packages/db/src/schema.ts:
user— 用户账户session— 活跃会话account— OAuth 提供商关联verification— 邮箱验证令牌
添加 OAuth 提供商
添加 Google OAuth:
import { betterAuth } from 'better-auth'
export const auth = betterAuth({
// ... 现有配置
socialProviders: {
google: {
clientId: process.env.GOOGLE_CLIENT_ID!,
clientSecret: process.env.GOOGLE_CLIENT_SECRET!,
},
},
})受保护路由
创建可复用的认证检查:
// lib/auth-guard.ts
import { auth } from '@/lib/auth'
import { headers } from 'next/headers'
import { redirect } from 'next/navigation'
export async function requireAuth() {
const session = await auth.api.getSession({
headers: await headers(),
})
if (!session) {
redirect('/auth')
}
return session
}下一步
- 配置 OAuth 提供商实现社交登录
- 自定义认证 UI 组件
- 添加基于角色的访问控制