【验证码注册和登录表设计以及流程】

验证码登录注册功能表设计

针对手机/邮箱验证码登录和注册功能,我设计了以下表结构:

-- 验证码表 (love_auth_code_t)
CREATE TABLE love_auth_code_t (
    id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '验证码ID,主键',
    account VARCHAR(100) NOT NULL COMMENT '账号(手机号或邮箱)',
    code VARCHAR(10) NOT NULL COMMENT '验证码',
    type ENUM('PHONE', 'EMAIL') NOT NULL COMMENT '验证码类型:PHONE-手机 EMAIL-邮箱',
    scene ENUM('REGISTER', 'LOGIN', 'RESET_PWD', 'BIND_ACCOUNT') NOT NULL COMMENT '使用场景',
    status ENUM('UNUSED', 'USED', 'EXPIRED') DEFAULT 'UNUSED' COMMENT '使用状态',
    created_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    expired_time TIMESTAMP NOT NULL COMMENT '过期时间',
    verified_time TIMESTAMP NULL COMMENT '验证时间',
    INDEX idx_account (account),
    INDEX idx_created_time (created_time)
) COMMENT '验证码存储表';

-- 用户授权表 (love_user_auth_t)
CREATE TABLE love_user_auth_t (
    id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '授权ID,主键',
    user_id BIGINT NOT NULL COMMENT '关联的用户ID',
    identity_type VARCHAR(20) NOT NULL COMMENT '认证类型(PHONE, EMAIL, WECHAT, QQ等)',
    identifier VARCHAR(100) NOT NULL COMMENT '唯一标识(手机号/邮箱/第三方ID)',
    credential VARCHAR(255) NOT NULL COMMENT '凭证(密码/Token)',
    verified BOOLEAN DEFAULT false COMMENT '是否已验证',
    created_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    updated_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    UNIQUE INDEX idx_identity (identity_type, identifier),
    INDEX idx_user (user_id)
) COMMENT '用户授权信息表';

表结构说明

1. 验证码表 (love_auth_code_t)

字段名 类型 说明
id BIGINT 验证码ID,自增主键
account VARCHAR(100) 接收验证码的账号(手机号或邮箱)
code VARCHAR(10) 发送的验证码(6位数字)
type ENUM(‘PHONE’,‘EMAIL’) 验证码类型:手机或邮箱
scene ENUM(‘REGISTER’,‘LOGIN’,‘RESET_PWD’,‘BIND_ACCOUNT’) 使用场景:注册/登录/重置密码/绑定账号
status ENUM(‘UNUSED’,‘USED’,‘EXPIRED’) 验证码状态:未使用/已使用/已过期
created_time TIMESTAMP 验证码创建时间
expired_time TIMESTAMP 验证码过期时间(通常5-10分钟)
verified_time TIMESTAMP 验证时间(使用时间)

索引

  • idx_account: 基于账号的索引,用于快速查找验证码
  • idx_created_time: 基于创建时间的索引,用于清理过期数据

2. 用户授权表 (love_user_auth_t)

字段名 类型 说明
id BIGINT 授权ID,自增主键
user_id BIGINT 关联的用户ID(外键)
identity_type VARCHAR(20) 认证类型:PHONE/EMAIL/WECHAT/QQ等
identifier VARCHAR(100) 唯一标识(手机号/邮箱/第三方ID)
credential VARCHAR(255) 凭证(密码/Token)
verified BOOLEAN 是否已验证
created_time TIMESTAMP 创建时间
updated_time TIMESTAMP 更新时间(自动更新)

索引

  • idx_identity: (identity_type, identifier) 联合唯一索引,确保同一认证类型的标识唯一
  • idx_user: 用户ID索引,快速查找用户的认证方式

使用流程

注册流程

  1. 用户输入手机号/邮箱请求验证码
  2. 系统生成验证码并插入 love_auth_code_t
  3. 用户收到验证码后输入验证
  4. 验证 love_auth_code_t 中的验证码有效性
  5. 创建 love_user_t 用户记录
  6. 创建 love_user_auth_t 记录(类型为 PHONE/EMAIL)(目的是为了和第三方授权登录方式逻辑保持一致, 三方授权通过这个表可以在不需要注册情况下通过三方授权的token直接进入系统, 但是我们也可以同时在系统给他创建一个账号)

登录流程

  1. 用户输入手机号/邮箱请求验证码
  2. 系统生成验证码并插入 love_auth_code_t
  3. 用户收到验证码后输入验证
  4. 验证 love_auth_code_t 中的验证码有效性
  5. 通过 love_user_auth_t 找到关联的 user_id
  6. 返回用户信息和登录凭证

第三方登录流程

  1. 用户选择第三方登录(如微信)
  2. 获取第三方授权后,在 love_user_auth_t 中查找 identifier(微信openid)
  3. 如果存在则直接登录;如果不存在则创建新用户和关联的授权记录

优化建议

  1. 验证码发送频率限制

    • 可以在应用层实现:同一账号1分钟内只能发送1次
    • 同一IP每天最多发送50次验证码
  2. 验证码自动清理

    -- 定期清理过期验证码(每天执行)
    DELETE FROM love_auth_code_t 
    WHERE expired_time < NOW() - INTERVAL 1 DAY;
    
  3. 用户表调整建议
    love_user_t 表中添加:

    -- 添加最后登录时间字段(自动更新)
    last_login TIMESTAMP NULL DEFAULT NULL COMMENT '最后登录时间',
    
    -- 修改最后更新时间字段为自动更新
    last_update TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间',
    
  4. 安全增强

    • 验证码建议使用6位数字
    • 验证码有效期建议设置为5分钟
    • 验证码验证后立即标记为已使用
    • 敏感操作(如重置密码)需要二次验证

这个设计支持多种登录方式(手机、邮箱、第三方),同时保持了良好的扩展性和安全性。验证码表独立设计便于管理和清理过期数据,用户授权表支持一个用户绑定多种登录方式。

你可能感兴趣的:(数据库,微服务,数据库)