用户认证流程分析文档
文档概述
本文档详细分析邮轮穿舱件管理系统小程序端的用户认证流程,涵盖登录、验证码登录、用户绑定和密码重置四个核心模块。通过分析相关页面的代码结构、接口调用和加密处理,提供完整的认证流程可视化。
认证架构概览
系统组件关系图
flowchart TD
A[用户界面] --> B[认证页面]
B --> C[API接口层]
C --> D[后端服务]
B --> E[加密工具]
B --> F[本地存储]
subgraph 认证页面
G[login页面]
H[loginCode页面]
I[bindUser页面]
J[forgetPassword页面]
end
subgraph API接口层
K[request.js]
L[bindUser.js]
end
subgraph 工具层
M[crypto.js]
N[本地存储管理]
end
G --> K --> D
H --> K --> D
I --> L --> D
J --> K --> D
G --> M
I --> N
认证流程总览
系统提供四种认证方式:
- 密码登录 - 传统用户名密码认证
- 微信授权登录 - 基于微信开放平台的快速登录
- 验证码登录 - 手机验证码认证
- 账户绑定 - 微信用户与系统账户关联
登录页面分析
页面功能结构
登录页面(login.js)提供两种登录方式:密码登录和微信授权登录。
核心数据模型
data: {
passwordInfo: {
account: '', // 用户名
password: '', // 密码
},
radioValue: '', // 协议选择状态
isCheck: false, // 是否同意协议
isPasswordSubmit: false, // 提交按钮状态
}
密码登录流程
sequenceDiagram
participant U as 用户
participant L as Login页面
participant W as 微信API
participant S as 后端服务
participant ST as 本地存储
U->>L: 输入账号密码
L->>L: 验证表单数据
U->>L: 点击登录
L->>W: wx.login()获取code
W-->>L: 返回code
L->>S: POST /wechat/loginWithUsrPwd
Note over L,S: {username, password, code}
S-->>L: 返回access_token
L->>ST: wx.setStorageSync('access_token')
L->>U: 跳转到个人中心
关键代码实现:
// 密码登录核心逻辑
async passwordLogin() {
const loginRes = await wx.login();
const res = await request('/wechat/loginWithUsrPwd', 'post', {
username: this.data.passwordInfo.account,
password: this.data.passwordInfo.password,
code: loginRes.code
});
await wx.setStorageSync('access_token', res.access_token);
wx.switchTab({ url: `/pages/my/index` });
}
微信授权登录流程
sequenceDiagram
participant U as 用户
participant L as Login页面
participant W as 微信API
participant S as 后端服务
U->>L: 点击微信登录
L->>W: wx.login()获取code
W-->>L: 返回code
L->>S: POST /wechat/loginWithAutoRegister
Note over L,S: {code}
S-->>L: 返回access_token
L->>U: 自动注册并登录
关键代码实现:
// 微信授权登录
async wechatLogin() {
const loginRes = await wx.login();
const res = await request('/wechat/loginWithAutoRegister', 'post', {
code: loginRes.code,
});
await wx.setStorageSync('access_token', res.access_token);
wx.switchTab({ url: `/pages/my/index` });
}
验证码登录页面分析
页面功能结构
验证码登录页面(loginCode.js)提供基于手机验证码的快速登录方式。
核心数据模型
data: {
phoneNumber: '', // 手机号码
sendCodeCount: 60, // 验证码发送倒计时
verifyCode: '', // 验证码
}
验证码登录流程
sequenceDiagram
participant U as 用户
participant LC as LoginCode页面
participant S as 后端服务
participant ST as 本地存储
U->>LC: 输入手机号获取验证码
LC->>S: 发送验证码到手机
U->>LC: 输入收到的验证码
LC->>S: GET /login/postCodeVerify
Note over LC,S: {code: verifyCode}
S-->>LC: 返回token
LC->>ST: 存储access_token
LC->>U: 跳转到个人中心
关键代码实现:
async login() {
const res = await request('/login/postCodeVerify', 'get', {
code: this.data.verifyCode
});
if (res.success) {
await wx.setStorageSync('access_token', res.data.token);
wx.switchTab({ url: `/pages/my/index` });
}
}
用户绑定页面分析
页面功能结构
用户绑定页面(bindUser/index.js)用于将微信用户与系统账户进行关联绑定。
核心数据模型
data: {
currentUser: { // 当前用户信息
id: null,
username: '',
email: '',
openid: '',
// ...其他字段
},
bindForm: { // 绑定表单数据
username: '',
password: ''
},
isUnbound: false, // 是否未绑定状态
showBindForm: false // 是否显示绑定表单
}
账户绑定流程
sequenceDiagram
participant U as 用户
participant BU as BindUser页面
participant W as 微信API
participant S as 后端服务
participant ST as 本地存储
BU->>S: GET /miniapp/user/userProfile
S-->>BU: 返回用户信息
alt 已绑定用户
BU->>U: 显示"已绑定"提示
else 未绑定用户
BU->>U: 显示绑定表单
U->>BU: 输入用户名密码
BU->>W: wx.login()获取code
W-->>BU: 返回code
BU->>S: POST /miniapp/bind
Note over BU,S: {username, password, code}
S-->>BU: 绑定成功
BU->>ST: 清除本地token
BU->>U: 跳转回登录页
end
关键绑定逻辑:
async onBindAccount() {
const loginRes = await wx.login();
const res = await request('/miniapp/bind', 'post', {
username: bindData.target_username,
password: bindData.password,
code: loginRes.code
});
if (res) {
wx.removeStorageSync('access_token');
wx.reLaunch({ url: '/pages/login/index' });
}
}
未绑定状态检测
系统通过用户名前缀UNBIND_来识别未绑定账户:
checkUnboundStatus(username) {
return username && username.startsWith('UNBIND_');
}
密码重置页面分析
页面功能结构
密码重置页面(forgetPassword/index.js)提供通过邮箱或手机重置密码的功能。
核心数据模型
data: {
account: '', // 账号(邮箱或手机)
loading: false // 加载状态
}
密码重置流程
sequenceDiagram
participant U as 用户
participant FP as ForgetPassword页面
participant S as 后端服务
U->>FP: 输入邮箱或手机号
FP->>FP: 验证账号格式
alt 格式正确
FP->>S: POST /login/forgetPassword
Note over FP,S: {account, type}
S-->>FP: 发送重置链接
FP->>U: 显示发送成功提示
else 格式错误
FP->>U: 显示错误提示
end
关键代码实现:
async sendResetLink() {
const isEmail = /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(this.data.account);
const isPhone = /^[1][3,4,5,7,8,9][0-9]{9}$/.test(this.data.account);
const res = await request('/login/forgetPassword', 'post', {
data: {
account: this.data.account,
type: isEmail ? 'email' : 'phone',
},
});
}
API接口层分析
请求封装模块
系统使用统一的请求封装(request.js)处理所有HTTP请求:
核心功能特性
- 自动Token管理:自动从本地存储获取并添加Authorization头
- 统一错误处理:标准化错误响应格式
- Mock支持:支持模拟数据延迟
function request(url, method = 'GET', data = {}) {
const header = { 'content-type': 'application/json' };
const tokenString = wx.getStorageSync('access_token');
if (tokenString) {
header.Authorization = `Bearer ${tokenString}`;
}
return new Promise((resolve, reject) => {
wx.request({
url: baseUrl + url,
method,
data,
header,
success(res) {
if (res.statusCode === 200 || res.statusCode === 201) {
resolve(res.data);
} else {
reject({
statusCode: res.statusCode,
message: res.data?.detail || '请求失败',
data: res.data
});
}
}
});
});
}
用户绑定API模块
bindUser.js提供专门的用户绑定相关接口:
// 获取当前用户信息
export const getCurrentUser = () => {
return request({
url: '/api/user/current',
method: 'GET'
});
};
// 绑定系统账户
export const bindAccount = (data) => {
return request({
url: '/api/bind/account',
method: 'POST',
data
});
};
加密处理分析
MD5加密实现
系统使用自定义的MD5加密函数处理敏感数据:
flowchart LR
A[原始字符串] --> B[MD5加密]
B --> C[32位哈希值]
B --> D[密码验证]
加密算法结构
export function md5(str) {
// MD5核心算法实现
function rotateLeft(value, amount) {
const lbits = (value << amount) | (value >>> (32 - amount));
return lbits;
}
function F(x, y, z) { return (x & y) | ((~x) & z); }
function G(x, y, z) { return (x & z) | (y & (~z)); }
function H(x, y, z) { return (x ^ y ^ z); }
function I(x, y, z) { return (y ^ (x | (~z))); }
// ... 完整的MD5算法实现
}
认证状态管理
Token生命周期管理
stateDiagram-v2
[*] --> 未认证
未认证 --> 认证中 : 开始登录
认证中 --> 已认证 : 登录成功
已认证 --> 令牌过期 : token过期
令牌过期 --> 认证中 : 重新认证
已认证 --> [*] : 用户登出
认证中 --> 未认证 : 登录失败
本地存储策略
- access_token:存储在
wx.setStorageSync('access_token') - 自动携带:通过request.js自动添加到请求头
- 安全清除:绑定成功后自动清除旧token
安全考虑与最佳实践
安全机制
- 微信Code保护:使用一次性code防止重放攻击
- Token自动管理:避免手动处理认证头
- 输入验证:客户端和服务端双重验证
- 错误信息模糊:不暴露具体错误细节
性能优化
- 异步处理:所有认证操作均为异步非阻塞
- 本地缓存:合理使用本地存储减少网络请求
- 错误恢复:完善的错误处理和用户引导
索引
邮轮穿舱件管理系统的认证架构设计合理,提供了完整的用户认证解决方案。系统通过四种不同的认证方式满足不同用户需求,结合微信生态提供了便捷的登录体验。API层设计规范,加密处理完善,具备良好的安全性和可维护性。
核心优势:
- 多认证方式覆盖全面使用场景
- 微信生态深度集成
- 统一的错误处理和状态管理
- 完善的用户绑定机制
改进建议:
- 可考虑增加生物识别认证支持
- 强化密码策略和复杂度要求
- 增加登录日志和异常检测