src/lib/plugins/auth/credentials.ts

src/lib/plugins/auth/credentials.ts

邮箱密码认证插件,实现传统的账号密码登录方式。

概述

该插件基于 NextAuth.js 的 Credentials Provider,提供标准的邮箱密码认证功能。

主要导出

credentialsPlugin

认证插件实例,实现了 AuthPlugin 接口。

import { credentialsPlugin } from "@/lib/plugins/auth/credentials";

功能特性

登录验证流程

  1. 数据校验

- 使用 Zod 验证邮箱格式 - 验证密码长度(最少 6 位)

  1. 用户查询

- 通过邮箱查询用户 - 检查用户是否存在且已设置密码

  1. 密码验证

- 使用 bcrypt 比对密码哈希 - 密码错误返回 null

  1. 返回用户信息

- 用户 ID - 邮箱地址 - 用户姓名 - 头像 URL

配置参数

登录表单字段

字段类型标签
emailemailEmail
passwordpasswordPassword

验证规则

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)
  • 不存储明文密码

注意事项

  1. 该插件依赖数据库中的密码字段
  2. OAuth 用户(如 GitHub 登录)可能没有设置密码
  3. 建议配合邮箱验证使用
  4. 生产环境建议使用 HTTPS
← 返回目录