Appearance
认证流程
IM 前端的认证流程涉及 JWT Token 的获取、存储和使用。
登录流程
┌──────────┐ ┌──────────┐ ┌──────────┐
│ 登录页面 │ │ IM 后端 │ │ 主后端 │
└────┬─────┘ └────┬─────┘ └────┬─────┘
│ │ │
│ 1. POST /api/login │
│ { username, password } │
│───────────────>│ │
│ │ │
│ 2. 验证密码 │ │
│ (bcrypt) │ │
│ │ │
│ 3. 返回用户信息 + JWT │
│<───────────────│ │
│ │ │
│ 4. 存储到本地 │
│ - currentUser │
│ - im_token │
│ - token │
│ │ │
│ 5. 跳转首页 │
│ │ │Token 存储
登录成功后,前端将以下数据存入本地存储:
javascript
// 存储当前用户信息
uni.setStorageSync('currentUser', JSON.stringify(userData));
// 存储 IM Token(WebSocket 连接和 API 请求使用)
uni.setStorageSync('im_token', userData.token);
// 存储通用 Token
uni.setStorageSync('token', userData.token);Token 使用
REST API 请求
所有 IM API 请求通过 im_page_mixin 提供的 getImHeader() 方法携带认证信息:
javascript
// im_page_mixin.js
getImHeader() {
const token = uni.getStorageSync('im_token');
return {
'Authorization': 'Bearer ' + token
};
}请求示例:
javascript
this.middle.get(
config.imBaseURL + '/friends',
{},
{ header: this.getImHeader() }
);WebSocket 连接
WebSocket 连接时通过 URL 参数传递 token:
javascript
const token = uni.getStorageSync('im_token');
const ws = new WebSocket(`${wsURL}?token=${token}`);Token 过期处理
JWT 默认有效期为 7 天。Token 过期后:
- REST API 返回
401状态码 - WebSocket 连接返回
auth_error事件
WARNING
前端应捕获 401 响应并引导用户重新登录。
javascript
this.middle.get(config.imBaseURL + '/friends', {}, {
header: this.getImHeader()
}).then(res => {
if (res.code === 401) {
// Token 过期,跳转登录
uni.reLaunch({ url: '/partnerPages/login' });
return;
}
// 正常处理...
});登出
清除本地存储并跳转登录页:
javascript
uni.removeStorageSync('currentUser');
uni.removeStorageSync('im_token');
uni.removeStorageSync('token');
uni.reLaunch({ url: '/partnerPages/login' });