src/lib/plugins/auth/credentials.ts
邮箱密码认证插件,实现传统的账号密码登录方式。
概述
该插件基于 NextAuth.js 的 Credentials Provider,提供标准的邮箱密码认证功能。
主要导出
credentialsPlugin
认证插件实例,实现了 AuthPlugin 接口。
import { credentialsPlugin } from "@/lib/plugins/auth/credentials";
功能特性
登录验证流程
- 数据校验
- 使用 Zod 验证邮箱格式 - 验证密码长度(最少 6 位)
- 用户查询
- 通过邮箱查询用户 - 检查用户是否存在且已设置密码
- 密码验证
- 使用 bcrypt 比对密码哈希 - 密码错误返回 null
- 返回用户信息
- 用户 ID - 邮箱地址 - 用户姓名 - 头像 URL
配置参数
登录表单字段
| 字段 | 类型 | 标签 |
|---|---|---|
| password | password | Password |
验证规则
const loginSchema = z.object({
email: z.string().email(), // 必须是有效邮箱
password: z.string().min(6), // 最少 6 位字符
});
使用方式
前端登录调用
import { signIn } from "next-auth/react";
const result = await signIn("credentials", {
email: "user@example.com",
password: "password123",
redirect: false, // 不自动跳转
});
if (result?.error) {
// 处理登录失败
} else {
// 登录成功
}
数据库要求
用户表需要包含以下字段:
id- 用户唯一标识email- 邮箱地址(唯一)password- 密码哈希(bcrypt)name- 用户姓名(可选)avatar- 头像 URL(可选)
密码安全
- 使用
bcryptjs进行密码哈希 - 默认使用 bcrypt 的 salt rounds(通常为 10)
- 不存储明文密码
注意事项
- 该插件依赖数据库中的密码字段
- OAuth 用户(如 GitHub 登录)可能没有设置密码
- 建议配合邮箱验证使用
- 生产环境建议使用 HTTPS