src/lib/auth/index.ts
NextAuth.js 认证配置模块,提供完整的用户认证解决方案。
概述
该模块是整个应用的认证核心,负责:
- 集成 NextAuth.js 5 (beta)
- 配置多种认证提供者(credentials, GitHub, Google, Azure, Apple)
- 自定义 Prisma Adapter 处理用户创建
- JWT 和 Session 回调管理
- 用户名生成和唯一性处理
主要导出
handlers
NextAuth 的 API 路由处理器,用于处理认证请求。
// 在 app/api/auth/[...nextauth]/route.ts 中使用
export const { GET, POST } = handlers;
signIn
登录函数,用于程序化触发登录流程。
import { signIn } from "@/lib/auth";
await signIn("github");
signOut
登出函数,用于程序化触发登出流程。
import { signOut } from "@/lib/auth";
await signOut();
auth
获取当前会话的辅助函数。
import { auth } from "@/lib/auth";
const session = await auth();
核心功能
1. 用户名生成
自动生成唯一的用户名:
- 首先尝试使用邮箱前缀(@ 之前的部分)
- 如果太短(少于 3 个字符),使用用户姓名
- 确保最小长度为 3 个字符
- 检查用户名是否已存在,自动添加序号后缀
2. 自定义 Prisma Adapter
扩展默认的 PrismaAdapter,添加以下功能:
- 自定义用户名处理
- GitHub 用户名存储(不可变)
- 支持认领无主账户(unclaimed accounts)
- 确保 GitHub 用户名唯一性
3. 动态提供者配置
支持从配置文件动态加载认证提供者:
- 支持新的
providers数组配置 - 向后兼容旧的
provider字符串配置 - 默认使用 credentials 提供者
4. JWT 回调
处理 JWT Token 的生命周期:
- 登录时从数据库查询用户信息
- 后续请求验证用户是否存在
- 支持显式更新(trigger: "update")
- 用户被删除时使 Token 失效
5. Session 回调
将 Token 数据注入到 Session 中:
- 用户 ID
- 用户角色
- 用户名
- 语言设置
- 头像 URL
类型扩展
模块扩展了 NextAuth 的类型定义:
// Session 类型扩展
interface Session {
user: {
id: string;
email: string;
name?: string | null;
image?: string | null;
role: string;
username: string;
locale: string;
};
}
// JWT 类型扩展
interface JWT {
id: string;
role: string;
username: string;
locale: string;
name?: string | null;
picture?: string | null;
}
环境要求
需要以下环境变量:
AUTH_SECRET- NextAuth 密钥- 根据启用的提供者需要相应的 OAuth 配置
注意事项
- 插件系统在使用前会自动初始化
- 所有用户创建都会通过自定义 Adapter 处理
- GitHub 登录用户会存储其 GitHub 用户名用于贡献者归属
- 支持认领预创建的无主账户(用于贡献者关联)