切换日光/暗黑模式
050. 用户注册认证配置与基础模型测试
学习目标
这一节进入用户注册、认证配置和基础模型测试。
学完后,你应该能理解:
- 注册时为什么不能明文存密码;
- 密码哈希为什么不能直接解密;
- 激活账号 token 的用途;
- JWT 配置项为什么要放进环境变量;
- 本地调试为什么可能临时关闭全局 token 校验;
- 为什么要给基础模型转换能力写测试。
注册的基本流程
用户注册时会提交用户名和密码。
后端不能把明文密码直接存进数据库。
更合理的流程是:
- 接收用户名和密码;
- 校验参数;
- 对密码做哈希;
- 把用户名和哈希后的密码写入用户表。
数据库里保存的是密文,不是用户输入的原始密码。
密码哈希
密码哈希通常不可逆。
也就是说,后端不能从哈希值还原出原始密码。
登录时的验证方式不是“解密数据库密码”,而是用同一个验证工具判断:
- 用户输入的明文密码;
- 数据库里保存的哈希值;
这两者是否匹配。
同一个明文密码每次生成的哈希值也可能不一样。
这是正常现象。
哈希工具会通过内部规则完成验证。
账号激活 token
注册后常见流程是给用户发送激活链接。
链接里会带一个激活账号用的 token。
用户点开链接后,后端根据 token 激活账号。
真实业务里,邮件、短信、微信登录、微信支付等能力通常都需要企业资质。
课程项目先采用更简单的方式:注册接口直接返回激活地址,让学习流程可以继续推进。
JWT 配置
认证相关配置放在环境变量里。
常见配置包括:
- JWT 签名密钥;
- JWT 算法;
- access token 过期时间;
- refresh token 过期时间;
- 激活 token 过期时间;
- 是否启用全局 token 校验;
- 白名单接口路径。
这些配置会被读取到 app_config 或对应配置对象里。
签名密钥
签名密钥用来生成和校验 token。
只要密钥没有泄漏,别人就很难伪造合法 token。
如果密钥泄漏,需要重新生成密钥并重启服务。
这样旧 token 会失效,用户需要重新登录。
这会带来影响,但比继续使用泄漏密钥更安全。
全局 token 校验
线上环境通常要开启全局 token 校验。
本地调试时,有时会临时关闭。
关闭后,中间件不会检查每个接口的 token,有利于调试某些业务接口。
但这只是本地便利。
涉及真实用户和线上数据时,认证校验必须保持开启。
白名单接口
不是所有接口都应该要求登录。
例如:
- 登录接口;
- 注册接口;
- 激活账号接口;
- 健康检查接口。
这些接口可以放到白名单里。
白名单文件用于告诉中间件:这些路径不做 token 校验。
基础模型转换测试
项目里的基础模型会提供对象和字典之间的转换能力。
例如把模型实例转成字典时,需要处理:
- 字段命名;
- 时间字段;
- 默认字段;
- 驼峰命名;
- 下划线命名。
这种能力很基础,但很容易在后续重构时被破坏。
所以需要写测试验证转换结果。
为什么测试很繁琐
测试代码有时不比业务代码短。
因为测试要明确写出:
- 构造什么对象;
- 期望哪些字段;
- 不期望哪些字段;
- 字段名应该是什么格式;
- 时间值如何比较。
它繁琐,但能帮你固定住基础能力。
这一节的重点
这一节把认证系统需要的配置和基础能力先铺好。
你需要记住:
- 密码不能明文保存;
- 哈希密码不能直接解密,但可以验证;
- token 依赖签名密钥;
- 本地调试便利不能替代线上安全;
- 基础模型转换值得写测试保护。