Skip to content

认证流程

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' });