2025-11-03 10:55:48 +08:00
|
|
|
|
# 邮箱验证码登录系统说明
|
|
|
|
|
|
|
|
|
|
|
|
## 📋 系统说明
|
|
|
|
|
|
|
|
|
|
|
|
系统**已完全禁用用户名密码登录**,现在**仅支持邮箱验证码登录**。
|
|
|
|
|
|
|
|
|
|
|
|
## 🔐 登录流程
|
|
|
|
|
|
|
|
|
|
|
|
### 1. 用户登录流程
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
输入邮箱 → 点击"获取验证码" → 接收邮件验证码 → 输入验证码 → 点击"登录/注册" → 进入系统
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 2. 详细步骤
|
|
|
|
|
|
|
|
|
|
|
|
1. **输入邮箱地址**
|
|
|
|
|
|
- 用户在登录页面输入邮箱地址
|
|
|
|
|
|
- 系统会验证邮箱格式
|
|
|
|
|
|
|
|
|
|
|
|
2. **获取验证码**
|
|
|
|
|
|
- 点击"获取验证码"按钮
|
|
|
|
|
|
- 系统调用腾讯云SES发送验证码邮件
|
|
|
|
|
|
- 按钮进入60秒倒计时状态(防重复发送)
|
|
|
|
|
|
|
|
|
|
|
|
3. **接收验证码**
|
|
|
|
|
|
- 用户查收邮箱中的验证码
|
|
|
|
|
|
- 验证码为6位数字
|
|
|
|
|
|
- 验证码有效期:5分钟
|
|
|
|
|
|
|
|
|
|
|
|
4. **输入验证码**
|
|
|
|
|
|
- 用户输入收到的6位数字验证码
|
|
|
|
|
|
- 系统会验证验证码格式
|
|
|
|
|
|
|
|
|
|
|
|
5. **完成登录**
|
|
|
|
|
|
- 点击"登录/注册"按钮
|
|
|
|
|
|
- 系统验证验证码是否正确
|
|
|
|
|
|
- 验证通过后:
|
|
|
|
|
|
- 如果用户存在:直接登录
|
|
|
|
|
|
- 如果用户不存在:自动注册新用户并登录
|
|
|
|
|
|
- 登录成功后生成JWT Token
|
|
|
|
|
|
- 跳转到个人主页
|
|
|
|
|
|
|
|
|
|
|
|
## ✅ 已实现的功能
|
|
|
|
|
|
|
|
|
|
|
|
### 后端功能
|
|
|
|
|
|
✅ **邮箱验证码登录接口** - `/api/auth/login/email`
|
|
|
|
|
|
- 验证邮箱验证码
|
|
|
|
|
|
- 自动注册新用户(如不存在)
|
|
|
|
|
|
- 生成JWT Token
|
|
|
|
|
|
- 返回用户信息
|
|
|
|
|
|
|
|
|
|
|
|
✅ **用户名密码登录已禁用** - `/api/auth/login`
|
|
|
|
|
|
- 返回提示信息:"系统已禁用用户名密码登录,请使用邮箱验证码登录"
|
|
|
|
|
|
|
|
|
|
|
|
✅ **验证码服务**
|
|
|
|
|
|
- 发送验证码邮件:`/api/verification/email/send`
|
|
|
|
|
|
- 验证验证码:`/api/verification/email/verify`
|
|
|
|
|
|
- 开发模式支持:`/api/verification/email/dev-set`
|
|
|
|
|
|
|
|
|
|
|
|
### 前端功能
|
|
|
|
|
|
✅ **登录页面**
|
|
|
|
|
|
- 邮箱输入框
|
|
|
|
|
|
- 验证码输入框
|
|
|
|
|
|
- 获取验证码按钮(带倒计时)
|
|
|
|
|
|
- 登录/注册按钮
|
|
|
|
|
|
- 表单验证
|
|
|
|
|
|
- 错误提示
|
|
|
|
|
|
|
|
|
|
|
|
✅ **登录流程**
|
|
|
|
|
|
- 发送验证码请求
|
|
|
|
|
|
- 验证码格式验证(6位数字)
|
|
|
|
|
|
- 调用邮箱验证码登录API
|
|
|
|
|
|
- Token存储
|
|
|
|
|
|
- 自动跳转
|
|
|
|
|
|
|
|
|
|
|
|
## 📝 API接口说明
|
|
|
|
|
|
|
|
|
|
|
|
### 1. 发送验证码
|
|
|
|
|
|
```
|
|
|
|
|
|
POST /api/verification/email/send
|
|
|
|
|
|
Content-Type: application/json
|
|
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
"email": "user@example.com"
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**响应**:
|
|
|
|
|
|
```json
|
|
|
|
|
|
{
|
|
|
|
|
|
"success": true,
|
|
|
|
|
|
"message": "验证码发送成功"
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 2. 邮箱验证码登录
|
|
|
|
|
|
```
|
|
|
|
|
|
POST /api/auth/login/email
|
|
|
|
|
|
Content-Type: application/json
|
|
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
"email": "user@example.com",
|
|
|
|
|
|
"code": "123456"
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**响应**:
|
|
|
|
|
|
```json
|
|
|
|
|
|
{
|
|
|
|
|
|
"success": true,
|
|
|
|
|
|
"message": "登录成功",
|
|
|
|
|
|
"data": {
|
|
|
|
|
|
"user": {
|
|
|
|
|
|
"id": 1,
|
|
|
|
|
|
"username": "user",
|
|
|
|
|
|
"email": "user@example.com",
|
|
|
|
|
|
...
|
|
|
|
|
|
},
|
|
|
|
|
|
"token": "eyJhbGciOiJIUzI1NiIs..."
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 🔒 安全特性
|
|
|
|
|
|
|
|
|
|
|
|
### 1. 验证码安全
|
|
|
|
|
|
- ✅ 验证码有效期:5分钟
|
|
|
|
|
|
- ✅ 验证码长度:6位数字
|
|
|
|
|
|
- ✅ 发送频率限制:60秒内只能发送一次
|
|
|
|
|
|
- ✅ 验证后自动删除,防止重复使用
|
|
|
|
|
|
|
|
|
|
|
|
### 2. 登录安全
|
|
|
|
|
|
- ✅ 必须验证验证码才能登录
|
|
|
|
|
|
- ✅ 用户名密码登录已完全禁用
|
|
|
|
|
|
- ✅ 使用JWT Token进行身份认证
|
|
|
|
|
|
- ✅ 自动注册用户时设置默认权限(ROLE_USER)
|
|
|
|
|
|
|
|
|
|
|
|
## 🎯 用户体验
|
|
|
|
|
|
|
|
|
|
|
|
### 优点
|
|
|
|
|
|
- ✅ 无需记忆密码
|
|
|
|
|
|
- ✅ 登录流程简单
|
|
|
|
|
|
- ✅ 自动注册新用户
|
|
|
|
|
|
- ✅ 安全可靠
|
|
|
|
|
|
|
|
|
|
|
|
### 注意事项
|
|
|
|
|
|
- ⚠️ 需要邮箱能够正常接收邮件
|
|
|
|
|
|
- ⚠️ 验证码有时效性(5分钟)
|
|
|
|
|
|
- ⚠️ 发送验证码有频率限制(60秒)
|
|
|
|
|
|
|
|
|
|
|
|
## 🛠️ 开发模式
|
|
|
|
|
|
|
|
|
|
|
|
### 开发环境配置
|
|
|
|
|
|
当 `tencent.ses.template-id=0` 时,系统进入开发模式:
|
|
|
|
|
|
|
|
|
|
|
|
- ✅ 不会实际发送邮件
|
|
|
|
|
|
- ✅ 验证码显示在日志中
|
|
|
|
|
|
- ✅ 可以使用开发接口手动设置验证码
|
|
|
|
|
|
|
|
|
|
|
|
### 开发模式测试
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 1. 发送验证码(开发模式)
|
|
|
|
|
|
POST /api/verification/email/send
|
|
|
|
|
|
{
|
|
|
|
|
|
"email": "test@example.com"
|
|
|
|
|
|
}
|
|
|
|
|
|
# 查看日志获取验证码
|
|
|
|
|
|
|
|
|
|
|
|
# 2. 或者直接设置验证码
|
|
|
|
|
|
POST /api/verification/email/dev-set
|
|
|
|
|
|
{
|
|
|
|
|
|
"email": "test@example.com",
|
|
|
|
|
|
"code": "123456"
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# 3. 使用设置的验证码登录
|
|
|
|
|
|
POST /api/auth/login/email
|
|
|
|
|
|
{
|
|
|
|
|
|
"email": "test@example.com",
|
|
|
|
|
|
"code": "123456"
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 📊 登录流程对比
|
|
|
|
|
|
|
|
|
|
|
|
### 旧流程(已禁用)
|
|
|
|
|
|
```
|
|
|
|
|
|
输入用户名 → 输入密码 → 点击登录 → 进入系统
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 新流程(当前)
|
|
|
|
|
|
```
|
|
|
|
|
|
输入邮箱 → 获取验证码 → 接收邮件 → 输入验证码 → 登录/注册 → 进入系统
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## ⚙️ 配置要求
|
|
|
|
|
|
|
|
|
|
|
|
### 必需配置
|
|
|
|
|
|
```properties
|
|
|
|
|
|
# 腾讯云SES配置
|
|
|
|
|
|
tencent.ses.secret-id=你的SecretID
|
|
|
|
|
|
tencent.ses.secret-key=你的SecretKey
|
|
|
|
|
|
tencent.ses.from-email=已验证的发信地址
|
|
|
|
|
|
tencent.ses.template-id=0 # 0=开发模式,实际ID=生产模式
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 🚀 使用示例
|
|
|
|
|
|
|
|
|
|
|
|
### 前端调用示例
|
|
|
|
|
|
|
|
|
|
|
|
```javascript
|
|
|
|
|
|
// 1. 发送验证码
|
|
|
|
|
|
const response = await fetch('/api/verification/email/send', {
|
|
|
|
|
|
method: 'POST',
|
|
|
|
|
|
headers: { 'Content-Type': 'application/json' },
|
|
|
|
|
|
body: JSON.stringify({ email: 'user@example.com' })
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
// 2. 登录(使用收到的验证码)
|
|
|
|
|
|
const loginResponse = await fetch('/api/auth/login/email', {
|
|
|
|
|
|
method: 'POST',
|
|
|
|
|
|
headers: { 'Content-Type': 'application/json' },
|
|
|
|
|
|
body: JSON.stringify({
|
|
|
|
|
|
email: 'user@example.com',
|
|
|
|
|
|
code: '123456' // 从邮箱获取的验证码
|
|
|
|
|
|
})
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
const result = await loginResponse.json()
|
|
|
|
|
|
if (result.success) {
|
|
|
|
|
|
// 保存token和用户信息
|
|
|
|
|
|
sessionStorage.setItem('token', result.data.token)
|
|
|
|
|
|
sessionStorage.setItem('user', JSON.stringify(result.data.user))
|
|
|
|
|
|
// 跳转到主页
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## ⚠️ 重要说明
|
|
|
|
|
|
|
|
|
|
|
|
1. **用户名密码登录已完全禁用**
|
|
|
|
|
|
- 即使调用 `/api/auth/login`,也会返回错误提示
|
|
|
|
|
|
- 所有登录必须通过邮箱验证码方式
|
|
|
|
|
|
|
|
|
|
|
|
2. **自动注册**
|
|
|
|
|
|
- 如果邮箱对应的用户不存在,系统会自动创建新用户
|
|
|
|
|
|
- 用户名自动从邮箱生成(邮箱@前面的部分)
|
|
|
|
|
|
- 默认角色:ROLE_USER(普通用户)
|
|
|
|
|
|
- 默认积分:50
|
|
|
|
|
|
|
|
|
|
|
|
3. **验证码管理**
|
|
|
|
|
|
- 验证码存储在内存中(重启服务会清除)
|
|
|
|
|
|
- 验证成功后自动删除
|
|
|
|
|
|
- 过期后自动清除
|
|
|
|
|
|
|
|
|
|
|
|
## 🔄 后续优化建议
|
|
|
|
|
|
|
|
|
|
|
|
如需进一步提升,可以考虑:
|
|
|
|
|
|
- 将验证码存储到Redis(支持分布式)
|
|
|
|
|
|
- 添加图形验证码防止机器人
|
|
|
|
|
|
- 支持手机号验证码登录
|
|
|
|
|
|
- 添加登录日志记录
|
|
|
|
|
|
|
|
|
|
|
|
## ✅ 总结
|
|
|
|
|
|
|
|
|
|
|
|
系统现在**完全使用邮箱验证码登录**,用户名密码登录已禁用。用户只需:
|
|
|
|
|
|
1. 输入邮箱
|
|
|
|
|
|
2. 获取验证码
|
|
|
|
|
|
3. 输入验证码
|
|
|
|
|
|
4. 完成登录/注册
|
|
|
|
|
|
|
|
|
|
|
|
安全和用户体验都得到了提升!
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-11-04 11:06:08 +08:00
|
|
|
|
|
2025-11-04 18:18:49 +08:00
|
|
|
|
|
2025-11-05 18:18:53 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-11-07 19:09:50 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|