|
@@ -3,6 +3,7 @@
|
|
|
## 版本信息
|
|
## 版本信息
|
|
|
| 版本 | 日期 | 描述 | 作者 |
|
|
| 版本 | 日期 | 描述 | 作者 |
|
|
|
|------|------|------|------|
|
|
|------|------|------|------|
|
|
|
|
|
+| 2.3 | 2025-10-25 | 添加微信小程序环境自动登录获取openid故事US005-13,顺延原有故事编号 | John (PM) |
|
|
|
| 2.2 | 2025-10-25 | 添加小程序手机号获取集成故事US005-12,顺延原有故事编号 | John (PM) |
|
|
| 2.2 | 2025-10-25 | 添加小程序手机号获取集成故事US005-12,顺延原有故事编号 | John (PM) |
|
|
|
| 2.1 | 2025-10-20 | 添加车型和路线配置增强故事US005-04,顺延原有故事编号 | John (PM) |
|
|
| 2.1 | 2025-10-20 | 添加车型和路线配置增强故事US005-04,顺延原有故事编号 | John (PM) |
|
|
|
| 2.0 | 2025-10-19 | 添加样式迁移合规性修复故事US005-03,顺延原有故事编号 | John (PM) |
|
|
| 2.0 | 2025-10-19 | 添加样式迁移合规性修复故事US005-03,顺延原有故事编号 | John (PM) |
|
|
@@ -402,6 +403,179 @@ POST /api/v1/auth/phone
|
|
|
- E2E测试:完整手机号获取流程测试
|
|
- E2E测试:完整手机号获取流程测试
|
|
|
- 安全测试:数据加密和权限验证测试
|
|
- 安全测试:数据加密和权限验证测试
|
|
|
|
|
|
|
|
|
|
+### US005-13: 微信小程序环境自动登录获取openid
|
|
|
|
|
+**作为** 微信小程序用户
|
|
|
|
|
+**我希望** 在微信小程序环境中能够通过微信一键登录并获取我的openid
|
|
|
|
|
+**以便** 便捷使用出行服务,无需手动输入账号密码
|
|
|
|
|
+
|
|
|
|
|
+**验收标准**:
|
|
|
|
|
+- [x] 支持微信小程序 `wx.login` 获取code
|
|
|
|
|
+- [x] 实现openid获取API接口,接收小程序code
|
|
|
|
|
+- [x] 自动创建或关联用户账号
|
|
|
|
|
+- [x] 支持用户信息自动同步
|
|
|
|
|
+- [ ] 实现静默登录机制,用户无感知(应用启动时自动登录)
|
|
|
|
|
+- [x] 支持登录状态持久化
|
|
|
|
|
+- [x] 确保登录流程的安全性和可靠性
|
|
|
|
|
+- [x] 支持登录失败的重试机制
|
|
|
|
|
+- [x] 兼容现有用户认证系统
|
|
|
|
|
+
|
|
|
|
|
+**技术实现方案**:
|
|
|
|
|
+- **前端实现**: 微信小程序登录页面调用 `wx.login` API获取code,支持用户信息授权
|
|
|
|
|
+- **后端认证**: 使用微信官方SDK通过code获取openid和session_key
|
|
|
|
|
+- **用户管理**: 自动创建或关联用户账号,支持openid绑定
|
|
|
|
|
+- **会话管理**: session_key存储在Redis,JWT token用于认证
|
|
|
|
|
+
|
|
|
|
|
+**前端实现细节**:
|
|
|
|
|
+```typescript
|
|
|
|
|
+// 微信小程序登录页面登录逻辑
|
|
|
|
|
+const handleWechatLogin = async () => {
|
|
|
|
|
+ try {
|
|
|
|
|
+ // 1. 获取用户信息授权
|
|
|
|
|
+ const userProfile = await Taro.getUserProfile({
|
|
|
|
|
+ desc: '用于完善用户资料'
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ // 2. 获取登录code
|
|
|
|
|
+ const loginRes = await Taro.login();
|
|
|
|
|
+
|
|
|
|
|
+ if (!loginRes.code) {
|
|
|
|
|
+ throw new Error('获取登录凭证失败');
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 3. 使用RPC client调用后端小程序登录API
|
|
|
|
|
+ const response = await authClient['mini-login'].$post({
|
|
|
|
|
+ json: {
|
|
|
|
|
+ code: loginRes.code,
|
|
|
|
|
+ userInfo: userProfile.userInfo
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ if (response.status === 200) {
|
|
|
|
|
+ const { token, user, isNewUser } = await response.json();
|
|
|
|
|
+
|
|
|
|
|
+ // 4. 保存token和用户信息
|
|
|
|
|
+ Taro.setStorageSync('userInfo', user);
|
|
|
|
|
+ Taro.setStorageSync('mini_token', token);
|
|
|
|
|
+
|
|
|
|
|
+ Taro.showToast({
|
|
|
|
|
+ title: isNewUser ? '注册成功' : '登录成功',
|
|
|
|
|
+ icon: 'success',
|
|
|
|
|
+ duration: 1500
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ // 跳转到首页
|
|
|
|
|
+ setTimeout(() => {
|
|
|
|
|
+ Taro.switchTab({ url: '/pages/home/index' });
|
|
|
|
|
+ }, 1500);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ const errorData = await response.json();
|
|
|
|
|
+ throw new Error(errorData.message || '登录失败');
|
|
|
|
|
+ }
|
|
|
|
|
+ } catch (error) {
|
|
|
|
|
+ // 错误处理逻辑
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// 应用启动时调用
|
|
|
|
|
+App({
|
|
|
|
|
+ onLaunch() {
|
|
|
|
|
+ autoLogin();
|
|
|
|
|
+ }
|
|
|
|
|
+});
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+**后端实现细节**:
|
|
|
|
|
+- **服务位置**: `packages/server/src/modules/auth/mini-auth.service.ts`
|
|
|
|
|
+- **核心方法**: `miniLogin(code: string)`
|
|
|
|
|
+- **登录流程**:
|
|
|
|
|
+ 1. 使用code调用微信 `jscode2session` API获取openid和session_key
|
|
|
|
|
+ 2. 根据openid查找或创建用户账号
|
|
|
|
|
+ 3. 生成JWT token并返回给前端
|
|
|
|
|
+ 4. 保存session_key到Redis用于后续数据解密
|
|
|
|
|
+ 5. 支持用户信息更新(昵称、头像)
|
|
|
|
|
+
|
|
|
|
|
+**API设计**:
|
|
|
|
|
+```typescript
|
|
|
|
|
+// 小程序自动登录API
|
|
|
|
|
+POST /api/v1/auth/mini-login
|
|
|
|
|
+{
|
|
|
|
|
+ "code": "微信小程序登录获取的code",
|
|
|
|
|
+ "userInfo": {
|
|
|
|
|
+ "nickName": "用户昵称",
|
|
|
|
|
+ "avatarUrl": "头像URL"
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// 响应
|
|
|
|
|
+{
|
|
|
|
|
+ "token": "JWT认证token",
|
|
|
|
|
+ "user": {
|
|
|
|
|
+ "id": "用户ID",
|
|
|
|
|
+ "username": "用户名",
|
|
|
|
|
+ "nickname": "昵称",
|
|
|
|
|
+ "phone": "手机号",
|
|
|
|
|
+ "email": "邮箱",
|
|
|
|
|
+ "avatarFileId": "头像文件ID",
|
|
|
|
|
+ "registrationSource": "注册来源"
|
|
|
|
|
+ },
|
|
|
|
|
+ "isNewUser": true
|
|
|
|
|
+}
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+**API路由位置**:
|
|
|
|
|
+- **文件路径**: `packages/server/src/api/auth/mini-login/post.ts`
|
|
|
|
|
+- **路由注册**: 已在 `packages/server/src/api/auth/index.ts` 中注册
|
|
|
|
|
+- **认证中间件**: 无需登录状态验证(用于首次登录)
|
|
|
|
|
+- **错误处理**: 支持微信API错误、网络错误、用户创建失败等
|
|
|
|
|
+
|
|
|
|
|
+**用户实体扩展**:
|
|
|
|
|
+```typescript
|
|
|
|
|
+// 在User实体中已添加微信相关字段
|
|
|
|
|
+@Entity('users')
|
|
|
|
|
+export class UserEntity {
|
|
|
|
|
+ // 现有字段...
|
|
|
|
|
+
|
|
|
|
|
+ @Column({ name: 'openid', type: 'varchar', length: 255, nullable: true, unique: true })
|
|
|
|
|
+ openid!: string | null;
|
|
|
|
|
+
|
|
|
|
|
+ @Column({ name: 'unionid', type: 'varchar', length: 255, nullable: true })
|
|
|
|
|
+ unionid!: string | null;
|
|
|
|
|
+
|
|
|
|
|
+ @Column({ name: 'registration_source', type: 'varchar', length: 20, default: 'web' })
|
|
|
|
|
+ registrationSource!: string;
|
|
|
|
|
+}
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+**安全考虑**:
|
|
|
|
|
+- 使用微信官方SDK进行openid获取
|
|
|
|
|
+- session_key安全存储在Redis,不返回给前端
|
|
|
|
|
+- JWT token设置合理过期时间
|
|
|
|
|
+- 防止重复登录和会话劫持
|
|
|
|
|
+- 符合微信小程序安全规范
|
|
|
|
|
+- 用户隐私数据保护
|
|
|
|
|
+- 登录频率限制和防刷机制
|
|
|
|
|
+- 支持用户信息授权,符合微信隐私政策
|
|
|
|
|
+
|
|
|
|
|
+**依赖关系**:
|
|
|
|
|
+- **前置依赖**: US005-02 用户管理基础框架 ✅
|
|
|
|
|
+- **并行开发**: US005-12 小程序手机号获取集成 ✅
|
|
|
|
|
+- **技术依赖**: 微信小程序SDK、微信开放平台配置、JWT认证 ✅
|
|
|
|
|
+
|
|
|
|
|
+**测试策略**:
|
|
|
|
|
+- 单元测试:openid获取和用户关联逻辑测试
|
|
|
|
|
+- 集成测试:微信API调用和JWT生成测试
|
|
|
|
|
+- E2E测试:完整微信登录流程测试
|
|
|
|
|
+- 安全测试:会话管理和防刷机制测试
|
|
|
|
|
+- 兼容性测试:与现有用户系统的兼容性
|
|
|
|
|
+
|
|
|
|
|
+**实现状态总结**:
|
|
|
|
|
+- ✅ **后端API**: 完整实现,支持openid获取、用户自动创建、JWT认证
|
|
|
|
|
+- ✅ **前端页面**: 完整实现微信登录页面,支持用户信息授权
|
|
|
|
|
+- ✅ **数据模型**: 用户实体已扩展支持openid、unionid等字段
|
|
|
|
|
+- ✅ **会话管理**: session_key存储在Redis,支持后续数据解密
|
|
|
|
|
+- 🔄 **静默登录**: 应用启动时自动登录功能待实现
|
|
|
|
|
+- ✅ **安全机制**: 完整的错误处理、防刷机制和隐私保护
|
|
|
|
|
+
|
|
|
## 技术实现方案
|
|
## 技术实现方案
|
|
|
|
|
|
|
|
### 后端数据模型
|
|
### 后端数据模型
|
|
@@ -718,5 +892,5 @@ GET /api/v1/routes?startLocationId=123&endLocationId=456&date=2025-10-15&type=de
|
|
|
---
|
|
---
|
|
|
|
|
|
|
|
**文档状态**: 已更新
|
|
**文档状态**: 已更新
|
|
|
-**最后更新**: 2025-10-20
|
|
|
|
|
-**下次评审**: 2025-10-27
|
|
|
|
|
|
|
+**最后更新**: 2025-10-25
|
|
|
|
|
+**下次评审**: 2025-11-01
|