# 认证系统使用指南
本文档说明如何在项目中使用认证系统。
## 认证流程
### 1. 应用启动流程
```
应用启动
↓
进入首页 (pages/index/index.vue)
↓
检查 Token
↓
┌─────────────┬─────────────┐
│ Token 有效 │ Token 无效 │
└─────────────┴─────────────┘
↓ ↓
显示首页 跳转登录页
```
### 2. 登录流程
```
用户点击登录
↓
获取微信 code
↓
调用后端登录接口
↓
保存 token 和用户信息
↓
跳转到首页
```
### 3. Token 验证流程
```
页面加载
↓
检查本地 token
↓
调用 GetUserProfile 接口验证
↓
┌─────────────┬─────────────┐
│ 验证成功 │ 验证失败 │
└─────────────┴─────────────┘
↓ ↓
更新用户信息 清除数据并跳转登录页
```
## 认证工具使用
### 引入认证工具
```javascript
import {
isLoggedIn,
getCurrentUser,
requireAuth,
logout
} from '@/utils/auth.js'
```
### 常用方法
#### 1. 检查是否已登录
```javascript
if (isLoggedIn()) {
console.log('用户已登录')
} else {
console.log('用户未登录')
}
```
#### 2. 获取当前用户信息
```javascript
const user = getCurrentUser()
if (user) {
console.log('用户昵称:', user.nickname)
console.log('用户头像:', user.avatar)
}
```
#### 3. 要求登录(未登录则跳转)
```javascript
// 在需要登录的页面中使用
onLoad() {
// 检查登录状态,未登录则跳转到登录页
if (!requireAuth()) {
return // 未登录,已跳转
}
// 已登录,继续执行
this.loadData()
}
```
#### 4. 登出
```javascript
async handleLogout() {
uni.showModal({
title: '提示',
content: '确定要退出登录吗?',
success: async (res) => {
if (res.confirm) {
await logout()
}
}
})
}
```
#### 5. 验证 Token
```javascript
import { validateToken } from '@/utils/auth.js'
async checkToken() {
const isValid = await validateToken()
if (isValid) {
console.log('Token 有效')
} else {
console.log('Token 无效')
}
}
```
#### 6. 刷新 Token
```javascript
import { refreshToken } from '@/utils/auth.js'
async refreshAuthToken() {
const success = await refreshToken()
if (success) {
console.log('Token 刷新成功')
} else {
console.log('Token 刷新失败')
}
}
```
## 在页面中使用
### 示例 1: 需要登录的页面
```vue
欢迎,{{ user.nickname }}
```
### 示例 2: 个人中心页面
```vue
{{ user.nickname }}
```
### 示例 3: 条件显示登录按钮
```vue
已登录
```
## 全局数据访问
### 在页面中访问全局用户数据
```javascript
const app = getApp()
// 获取 token
const token = app.globalData.token
// 获取用户信息
const user = app.globalData.user
// 检查是否需要刷新
if (app.globalData.shouldRefresh) {
// 执行刷新操作
this.refreshData()
app.globalData.shouldRefresh = false
}
```
## API 请求中的认证
AppServer 会自动在请求头中添加 Authorization,无需手动处理:
```javascript
import { AppServer } from '@/modules/api/AppServer'
const appServer = new AppServer()
// 自动携带 token
const result = await appServer.GetUserProfile()
```
## 错误处理
### Token 过期处理
当 API 返回 401 错误时,说明 token 已过期:
```javascript
const result = await appServer.GetUserProfile()
if (!result.success && result.error?.code === 'UNAUTHORIZED') {
// Token 过期,尝试刷新
const refreshSuccess = await refreshToken()
if (refreshSuccess) {
// 刷新成功,重试请求
const retryResult = await appServer.GetUserProfile()
} else {
// 刷新失败,跳转登录页
clearAuthData()
uni.reLaunch({ url: '/pages/login/login-page' })
}
}
```
## 注意事项
1. **首页自动检查**: 首页会自动检查登录状态,无需手动调用
2. **Token 格式**: Token 格式为 `Bearer `
3. **本地存储**: Token 和用户信息同时存储在 localStorage 和 globalData
4. **登出清理**: 登出时会清除所有认证相关数据
5. **页面刷新**: 使用 `reLaunch` 跳转登录页,确保页面栈清空
## 调试技巧
### 查看当前登录状态
```javascript
console.log('Token:', uni.getStorageSync('token'))
console.log('User:', uni.getStorageSync('user'))
console.log('RefreshToken:', uni.getStorageSync('refreshToken'))
```
### 清除登录状态(用于测试)
```javascript
import { clearAuthData } from '@/utils/auth.js'
// 清除所有认证数据
clearAuthData()
// 跳转到登录页
uni.reLaunch({ url: '/pages/login/login-page' })
```
### 模拟登录(用于开发测试)
```javascript
import { saveAuthData } from '@/utils/auth.js'
// 保存测试数据
saveAuthData(
'Bearer test-token',
'test-refresh-token',
{
id: 'test-user-id',
nickname: '测试用户',
avatar: 'https://...'
}
)
```
## 常见问题
### Q: 为什么每次打开应用都要重新登录?
A: 检查 token 是否正确保存到 localStorage,确认 `saveAuthData` 方法被正确调用。
### Q: 如何在多个页面间共享用户信息?
A: 使用 `getCurrentUser()` 方法或访问 `getApp().globalData.user`。
### Q: Token 过期后如何自动刷新?
A: 使用 `refreshToken()` 方法,建议在 API 返回 401 时自动调用。
### Q: 如何实现"记住我"功能?
A: Token 默认会保存到 localStorage,下次打开应用会自动恢复。
### Q: 如何处理网络错误?
A: 在 `validateToken` 失败时,可以选择不跳转登录页,而是显示错误提示。
## 相关文档
- [API 使用指南](./modules/api/API_GUIDE.md)
- [配置指南](./CONFIG_GUIDE.md)
- [登录指南](./LOGIN_GUIDE.md)