切换日光/暗黑模式
052. 登录日志与 Token 返回结构
学习目标
这一节把登录接口补完整。
学完后,你应该能理解:
- 后端如何拿到请求 IP;
- 登录日志为什么不能影响主登录流程;
- access token 和 refresh token 的区别;
- token 过期时间为什么要给前端提前量;
- 登录接口为什么用表单方式提交用户名密码;
- 返回用户信息时为什么要过滤敏感字段。
请求 IP
后端收到请求时,可以从 request 对象里拿到客户端 IP。
这个 IP 不一定是用户设备的真实局域网地址。
它更可能是用户出口网络或某个区域的公网地址。
所以它可以用于粗略定位和安全分析,但不能精确证明某个具体设备或具体个人。
IP 地址解析
IP 可以通过第三方服务转换成大致物理地址。
例如省份、城市、运营商等信息。
这类服务通常需要单独购买或配置。
课程项目先保留地址字段,实际写入时可以先为空。
重点是建立日志结构,而不是依赖某个外部解析服务。
登录日志模型
登录日志表可以记录:
- 登录用户;
- 登录 IP;
- IP 解析地址;
- 登录时间;
- 其他审计字段。
它的价值是后续排查异常登录、风控和用户行为审计。
日志失败不能阻断登录
登录日志属于辅助能力。
如果日志写入失败,不应该让已经认证成功的用户登录失败。
所以创建日志时可以单独开数据库 session,并用异常处理包住。
失败时记录错误日志即可,不影响主业务。
这类设计很常见:核心业务和审计日志要有边界。
创建 access token
access token 用来访问需要登录的接口。
它通常有效期较短。
payload 里会包含用户名、token 类型和过期时间。
前端请求业务接口时携带 access token,后端校验通过后才允许访问。
创建 refresh token
refresh token 用来换新的 access token。
它通常有效期更长。
当前端发现 access token 快过期时,可以用 refresh token 请求刷新。
这样用户不需要频繁重新登录。
为什么要给前端提前量
后端记录的 token 过期时间是最终有效期。
前端不能等到最后一秒才刷新。
因为请求从前端到后端有网络延迟。
前端看起来还没过期,请求到后端时可能已经过期。
所以返回给前端的过期时间通常会扣掉几秒到十几秒。
这个提前量能减少临界点失败。
登录返回结构
登录成功后,接口会返回:
- 公开用户信息;
- access token;
- access token 前端过期时间;
- refresh token;
- refresh token 前端过期时间。
前端拿到这些信息后,就能保存登录状态,并在后续请求里携带 token。
表单提交用户名密码
登录接口接收用户名和密码时,可以使用表单格式。
这和某些 OAuth2 工具类或安全库的默认习惯一致。
因此请求体不是 JSON,而是 form data。
调试接口时要注意请求格式。
敏感字段过滤
登录成功后,后端不能把内部用户模型原样返回。
尤其不能返回哈希密码。
应该先转换成公开用户结构,再返回给前端。
这能保证数据库字段增加时,不会不小心把敏感信息暴露出去。
这一节的重点
这一节完成了登录接口的主要闭环。
你需要记住:
- 登录日志是辅助能力,失败不阻断登录;
- access token 用于访问接口;
- refresh token 用于刷新登录状态;
- 前端过期时间要留提前量;
- 返回用户信息必须过滤敏感字段。