← 目录

Part 5: AI 写登录认证

先看 SSO 效果 → 理解 OAuth2 流程 → AI 实现统一认证登录

登录认证是统一身份认证系统的核心。
先演示单点登录效果,理解 OAuth2 授权码流程,再让 AI 逐步实现。

① 登录页面

oauth-login.html
密码 / 短信 / 企业 Tab
前后端联动

② 后端登录接口

密码登录 + 短信登录
企业登录(两步流程)
Sa-Token 会话管理

③ OAuth2 授权码

authorize + token 接口
第三方跳转认证中心
SSO 单点登录

④ 第三方接入文档

AI 生成接入指南
接口参数 + 调用示例
一份文档搞定对接

Prompt 公式:角色 + 上下文 + 需求 + 约束

DO 好的 Prompt

我在用 Spring Boot 3 + Sa-Token 开发统一身份认证系统。请帮我写一个 UAS 密码登录接口:

需求:POST /api/uas/auth/login,接收 phone、password、captchaVerification。先校验滑动验证码,再查 u_user 表,BCrypt 比对密码,StpUasUtil.login() 建立会话,返回 Token + 用户信息。

约束:参数用 @Valid 校验,异常用 ServiceException,返回 AjaxResult。登录接口加 @Anonymous 注解(免认证访问)。

DON'T 差的 Prompt

帮我写一个登录功能
太模糊 → AI 不知道用什么框架、什么表、什么认证方式。

演示:单点登录效果(先看再做)

动手写认证代码之前,先看完整的单点登录效果(点击图片可放大)

Step 1:第三方应用 kangke.xyz:19999,点击右上角"登录"

Step 2:选择"统一身份登录" → 跳转认证中心

Step 3:统一认证中心,输入手机号+密码登录

Step 4:登录成功!自动跳回第三方,右上角显示用户名

URL 中的 OAuth2 参数

appid=KK7908440916616 → 标识第三方应用
redirect_uri → 登录成功后跳回的地址
scope=userinfo → 申请的用户信息范围
state → 防 CSRF 攻击的随机值

完整流程

登录成功 → 认证中心生成授权码 ?code=AUTH...
→ 跳回第三方 redirect_uri?code=xxx
→ 第三方后端用 code 换取 Access Token
→ 用户登录成功!再开其他应用无需重复登录(SSO)
目标:接下来的实战就是让 AI 帮你实现这套认证体系!

OAuth2 授权码模式流程

结合刚才的演示,理解完整的 OAuth2 授权码流程(点击图片可放大)

授权码模式(Authorization Code)

1
用户点击登录 → 第三方应用跳转认证中心
/oauth2/authorize?appid=xxx&redirect_uri=xxx&scope=userinfo&state=xxx
⬇
2
用户认证登录 → 输入手机号+密码(或短信登录)
⬇
3
用户授权确认 → 同意将信息分享给第三方应用
⬇
4
发放授权码 → 认证中心跳回 redirect_uri?code=AUTH_xxx&state=xxx
⬇
5
换取 Token → 第三方后端用 code + appSecret 换取 Access Token
⬇
6
获取用户信息 → 用 Token 调用 userinfo 接口,完成登录

为什么要授权码?

直接返回 Token 不安全(URL 中暴露 Token)。先用 code 临时凭证,再由后端用 appSecret 换取 Token,确保 Token 不会泄露到前端 URL。

SSO 单点登录

用户在认证中心登录后,再访问其他接入的应用时无需重复登录 → 只需授权确认即可。一次登录,处处通行。
核心角色:
Resource Owner = 用户
Client = 第三方应用
Authorization Server = UAS 认证中心

实战 1:实现 UAS 登录页面

登录页面是用户看到的第一个页面,也是三种登录方式的入口

Prompt 示例

请实现统一认证登录页面 oauth-login.html:

页面结构:
- 三个 Tab:密码登录、短信登录、企业登录
- 密码登录:手机号 + 密码 + 滑动验证码
- 短信登录:手机号 + 验证码(60秒倒计时)
- 企业登录:手机号 → 查企业列表 → 选择企业 + 密码

URL 参数处理:
页面从 URL 获取 appid, redirect_uri, scope, state,登录成功后将这些参数传递给后端,后端生成授权码后跳回 redirect_uri

技术栈:原生 HTML + CSS(无需框架),放在 Spring Boot 的 static 目录下,样式简洁现代

登录页的关键作用

1
OAuth2 入口 → 第三方跳转 /oauth2/authorize,未登录则重定向到此页面
⬇
2
用户选择登录方式 → 密码 / 短信 / 企业三个 Tab
⬇
3
调用后端 API → 登录成功后,后端生成授权码并跳回第三方
为什么用静态 HTML?UAS 认证中心是后端服务,登录页直接放在 static/ 下,无需额外部署前端项目,保持架构简单。

实战 2:UAS 密码登录

登录流程

1
前端 POST { phone, password, captchaVerification }
⬇
2
校验滑动验证码(AJ-Captcha)
⬇
3
查 u_user 表 → BCrypt 比对
⬇
4
StpUtil.login(userId) → 记录日志
⬇
5
返回 { token, userInfo }

Prompt 示例

请实现 UAS 密码登录接口:

接口:POST /api/uas/auth/login

流程:
1. 校验滑动验证码
2. 查 u_user 表,BCrypt 比对密码
3. StpUtil.login() 建立会话
4. 调用 loginLogService.recordLoginLog() 记录日志
5. 返回 Token + 用户信息

约束:登录方式记为 "password",IP 从请求获取

实战 3:短信登录

涉及的技术点

Redis 存验证码

Key: sms:手机号
Value: 6位随机数
过期: 5分钟

RabbitMQ 异步发送

短信 API 可能慢,异步发送让用户无需等待。
队列: sms.queue

Prompt 示例

请实现短信验证码登录:

发送接口:POST /api/uas/auth/sms/send
- 生成 6 位验证码,存 Redis(5 分钟)
- RabbitMQ 异步发送短信

登录接口:POST /api/uas/auth/login/sms
- 校验验证码(一次性,用完删除)
- 查 u_user,StpUtil.login(),记录日志

前端:登录页增加短信登录 Tab,发送按钮 60 秒倒计时

实战 4:企业登录(两步流程)

为什么是两步?

业务场景

一个用户可能关联多家企业,所以需要先选择企业再登录。

1
输入手机号 → 查关联企业列表
⬇
2
选择企业 → 输密码 → 登录

Prompt 示例

请实现企业用户登录,分两步:

第一步:GET /api/uas/auth/enterprise/list?phone=xxx
- 查 u_corp_user 表返回关联企业列表

第二步:POST /api/uas/auth/enterprise/login
- 接收 phone、password、enterpriseId
- 验证密码,StpUtil.login()
- 将 corpId 存入 Sa-Token Session
- 记录日志(登录方式: enterprise)

前端:登录页企业 Tab → 手机号 → 企业列表 → 选企业 → 密码

实战 5:OAuth2 授权码 + 第三方接入文档

登录接口跑通后,实现 OAuth2 授权码流程,并让 AI 生成第三方接入文档

Prompt 示例:OAuth2 授权码接口

请实现 OAuth2 授权码模式的核心接口:

1. 授权接口:GET /oauth2/authorize
- 检查用户是否登录(StpUasUtil)
- 校验 appid 是否合法(查 u_app 表)
- 未登录 → 重定向到 oauth-login.html
- 已登录 → 生成授权码 code,存 Redis(5分钟)
- 重定向到 redirect_uri?code=xxx&state=xxx

2. 令牌接口:POST /oauth2/token
- 校验 code + appid + appSecret
- 校验通过 → 返回 Access Token
- code 一次性使用,用完即删

3. 用户信息接口:GET /oauth2/userinfo
- 用 Token 查询用户信息并返回

Prompt 示例:生成第三方接入文档

请根据已实现的 OAuth2 接口,生成第三方接入文档(Markdown 格式):

内容包含:
1. 接入流程说明(授权码模式图)
2. 接口地址和参数说明
3. 请求/响应示例(curl + JSON)
4. 错误码对照表
5. SDK 调用示例(Java/Python)

参考接口:/oauth2/authorize、/oauth2/token、/oauth2/userinfo
一份 Prompt → 接口 + 文档一步到位。第三方开发者拿到文档就能直接对接。

用 MCP 测试登录流程

请用 MCP 测试登录功能和 OAuth2 完整流程:

场景 1 — UAS 密码登录:
1. 打开 http://localhost/login
2. 填入手机号 13800000001,密码 123456
3. 完成验证码 → 点击登录 → 检查返回 Token

场景 2 — 短信登录:
1. 先调用 /api/uas/auth/sms/send 发送验证码
2. 切到短信登录 → 输入验证码 → 登录

场景 3 — 企业登录:
1. 切到企业登录 → 输手机号 → 查到企业列表
2. 选择企业 → 输密码 → 检查返回

场景 4 — OAuth2 完整流程:
1. 打开第三方应用,点击"登录"
2. 自动跳转认证中心 → 登录
3. 检查 URL 中是否携带 code 参数
4. 用 code 调用 /oauth2/token 获取 Access Token

MCP 自动执行的调用

  • navigate_page → 打开登录页
  • take_snapshot → 识别输入框和按钮
  • fill → 填入用户名/手机号和密码
  • click → 点击登录
  • list_network_requests → 检查 API 响应
  • take_screenshot → 确认登录结果
四个场景,一个 MCP Prompt 搞定。包括完整的 OAuth2 端到端验证。

AI Code Review:审查认证代码

选中所有登录相关代码,输入:

请审查选中的认证代码,重点关注:
1. 安全性 — 密码是否明文日志?验证码是否一次性?有无限流防暴力破解?
2. Token 安全 — Token 是否泄露在 URL 中?过期时间是否合理?
3. 数据校验 — 手机号格式?密码强度?enterpriseId 合法性?
4. 异常信息 — 错误提示是否泄露系统信息(如"用户不存在"是否安全)?

AI 常见发现

  • "用户不存在"和"密码错误"应统一为"手机号或密码错误"
  • 验证码应限制发送频率(同一手机号 60 秒一次)
  • 登录失败 5 次应锁定账号

Review 的价值

AI 能快速扫描安全漏洞模式。
但业务逻辑错误需要你自己判断。最终决策权在你。

常见问题 & 调试方法

常见问题

  • 缺少 @Anonymous 注解 → 401 未认证
  • Content-Type 不匹配 → 415
    (前端 form-data,后端 @RequestBody)
  • Redis 验证码 key 不一致
    (发送用 sms:138xxx,校验用 sms:138XXXX0001)
  • BCrypt 比对失败
    (注册时没加密,或用了 MD5 而非 BCrypt)

调试万能公式

报错 → 贴给 AI → AI 分析 → 修复 → MCP 验证

把完整错误信息发给 AI,附上你的环境和项目信息。AI 通常能直接给出解决方案。

Part 5 小结:认证 + 测试 完整闭环

你学会了什么

✓
如何写清晰的 Prompt(角色 + 上下文 + 需求 + 约束)
✓
理解 OAuth2 授权码模式的完整流程
✓
如何让 AI 实现登录页面 + 后端登录接口
✓
如何让 AI 实现 OAuth2 授权码并生成第三方接入文档
✓
如何用 MCP 自动测试登录和 OAuth2 完整流程
✓
如何让 AI 做 Code Review 发现安全问题

下一节

Part 6: 总结 + 课后实战

核心功能全部跑通。回顾端到端流程,领取 OAuth2/SSO 课后任务。

端到端进度:
获取需求 ✅ → 初始化项目 ✅ → 管理功能 ✅ → 登录认证 ✅ → 测试 Review ✅