目录
要点概括
本篇文章主要内容是NextAuth使用(包括会话管理) + 数据库存储(adapter) + 邮箱认证的内容
- NextAuth的使用
- 使用mailgun进行邮箱认证的详细配置流程
- NextAuth使用数据库进行持久性存储
- NextAuth会话管理
NextAuth与传统用户登录注册的区别
- 使用NextAuth无需存储密码,注册和登录是一体化的,但你也可以显式区分注册和登录的逻辑。
- 通过认证提供者(google, github, email等)进行用户认证
- 自带用户管理和会话管理,不需要创建额外的 API 路由来手动处理登录或注册
1 依赖包安装
- NextAuth
- 数据库相关:mongodb-adapter, mongoose
- 邮箱验证相关:nodemailer
npm install next-auth @next-auth/mongodb-adapter mongoose nodemailer
2 邮箱认证相关内容
详见之前的博客 - 使用mailgun进行邮箱认证的详细流程
3 配置 MongoDB 数据库
确保你有一个 MongoDB 数据库实例运行,可以是本地的或者云端的 MongoDB Atlas。记录好你的数据库连接字符串,存储在.env环境变量中。
MONGODB_URI=mongodb+srv://<username>:<password>@cluster0.0fvsbh4.mongodb.net/?retryWrites=true&w=majority&appName=Cluster0
Mongodb-adapter和Mongoose并不矛盾,可以同时使用
NextAuth MongoDB Adapter:这个适配器是专为 NextAuth 设计的,用于将用户会话和验证数据存储到 MongoDB 数据库中。它直接与 MongoDB 交互,管理用户会话和其他认证相关的数据。
NextAuth会产生用户和会话管理相关的数据表,通过mongodb-adapter连接到数据库中存储。我们可以同时使用mongoose和mongodb-adapter,但要注意数据的分离,让mongodb-adapter只存储用户和会话的相关数据表,让mongoose用于存储其他的数据表。
NextAuth的默认数据表
NextAuth会默认产生3个表:
- sessions
- users
- verification_tokens
1 verification_tokens
用于存储认证链接的时效性。每次发送认证邮箱链接的时候都会产生一条verification_tokens数据,当认证通过的时候,这条token就会被删除。
2 sessions
存储会话管理相关的内容,拥有唯一的sessionToken,用于维持用户的登录状态、保证用户的安全性、确保用户状态没有过期。
3 users
存储NextAuth相关的用户基本信息,通常包括以下字段:
- id:这是每个用户的唯一标识符。
- name:用户的全名或显示名。
- email:用户的电子邮件地址,用于认证和通信。
- emailVerified:一个日期时间戳,表示用户的电子邮件地址已验证的时间。如果电子邮件未验证,则此字段可能为空或不存在。
- image:用户的头像图片 URL。
- provider:表示用户使用哪种认证提供者(如 Google、Facebook 等)。
- providerAccountId:存储与特定提供者关联的账号标识符。
{
"id": "123",
"name": "John Doe",
"email": "john.doe@example.com",
"emailVerified": "2021-06-01T12:00:00.000Z",
"image": "https://example.com/avatar.jpg",
"createdAt": "2021-06-01T10:00:00.000Z",
"updatedAt": "2021-06-01T11:00:00.000Z",
"accounts": [
{
"provider": "google",
"providerAccountId": "google-account-id"
}
]
}
没有数据的字段默认不添加
Next中的数据库链接
在应用中进行统一的数据库连接管理,这里是一个最简单的数据库连接文件。
👉🏻 需要特别注意的是mongoose使用的mongodb的版本和bson版本需要向mongodb-adapter使用的mongodb版本和bson版本兼容