fengling-console-web/OIDC_INTEGRATION.md
Sam fa93d71725 feat: 添加OAuth2认证配置和实现
添加OAuth2认证相关配置文件和服务实现,包括环境变量配置、PKCE流程支持、token管理等功能。主要变更:
- 新增OAuth2配置文件
- 实现OAuth2服务层
- 更新请求拦截器支持token自动刷新
- 修改认证API和store以支持OAuth2流程
2026-02-07 17:47:11 +08:00

173 lines
4.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# OIDC 集成说明
## 概述
本项目已经使用 `oidc-client-ts` 库集成 OpenID Connect 认证,替换了原有的自定义登录实现。
## 新增文件
### 1. OIDC 配置
- `src/config/oidc.ts` - OIDC 客户端配置
### 2. OIDC 服务
- `src/services/oidc-auth.service.ts` - OIDC 认证服务封装
### 3. 回调页面
- `src/views/_core/authentication/callback.vue` - OIDC 登录回调处理页面
### 4. API 更新
- `src/api/core/auth.ts` - 更新为使用 OIDC token
### 5. Store 更新
- `src/store/auth.ts` - 更新为使用 OIDC 认证流程
## 修改文件
### 1. 路由配置
- `src/router/routes/core.ts` - 添加了 `/auth/callback` 路由
- `src/router/guard.ts` - 更新为使用 OIDC 认证检查
### 2. 请求拦截器
- `src/api/request.ts` - 更新为使用 OIDC 的 token 刷新
### 3. 环境配置
- `.env.development` - 添加 `VITE_AUTH_SERVER_URL` 配置
## 环境变量
`.env` 文件中配置以下变量:
```env
# OIDC认证服务器地址
VITE_AUTH_SERVER_URL=http://localhost:5132
```
## 认证流程
### 密码模式登录 (Resource Owner Password Credentials)
1. 用户在登录页面输入用户名和密码
2. 调用 `authStore.authLogin({ username, password })`
3. 使用 OIDC 的 `signinResourceOwnerCredentials` 方法直接获取 token
4. Token 存储到 store并在请求头中携带
5. 获取用户信息并设置到用户 store
### 授权码模式登录 (Authorization Code Flow)
1. 前端调用 `oidcAuthService.signinRedirect()` 重定向到认证服务器
2. 用户在认证服务器完成认证
3. 认证服务器重定向回 `/auth/callback?code=...`
4. 回调页面调用 `authStore.handleCallback()` 处理授权码
5. 换取访问令牌并存储
## Token 管理
### 自动续期
- 当 token 即将过期60秒前OIDC 服务会自动静默续期
- 如果静默续期失败,会重定向到登录页
### 手动刷新
```typescript
await authStore.refreshToken();
```
### 退出登录
```typescript
await authStore.logout();
```
## API 使用
### 使用 Access Token
API 请求会自动携带 Bearer token
```typescript
// 请求头会自动添加
Authorization: Bearer {access_token}
```
### 获取用户信息
```typescript
// 从 token claims 获取
const userInfo = getUserInfoFromToken(user);
// 或从服务器获取
const userInfo = await getUserInfoApi();
```
## 错误处理
### 常见错误
1. **invalid_grant** - 用户名或密码错误
2. **invalid_client** - 客户端 ID 无效
3. **expired_token** - Token 已过期
4. **invalid_token** - Token 无效
所有错误都会显示友好的提示信息,并重定向到登录页。
## 注意事项
1. **Token 存储**Token 存储在 localStorage 中,由 oidc-client-ts 管理
2. **CORS 配置**:认证服务器需要配置 CORS 允许前端域名
3. **HTTPS**:生产环境必须使用 HTTPS
4. **PKCE**:如果使用授权码模式,建议启用 PKCE 增强安全性
## 后端要求
认证服务器必须支持以下功能:
- OpenID Connect 1.0 兼容
- Resource Owner Password Credentials 授权类型
- Authorization Code 授权类型
- Refresh Token 支持
- Userinfo 端点
## 开发建议
1. 开发时使用 `http://localhost:5132` 作为认证服务器
2. 生产环境配置实际的认证服务器地址
3. 使用浏览器开发者工具的 Application 标签查看存储的 token
4. 监控网络请求,查看 OAuth 流程
## 迁移指南
如果你之前使用自定义的登录实现:
1. 删除旧的登录 API 调用
2. 替换为使用 `authStore.authLogin()` 方法
3. 确保 request 拦截器使用 OIDC token
4. 添加 `/auth/callback` 路由
5. 配置环境变量 `VITE_AUTH_SERVER_URL`
## 故障排除
### Token 过期问题
如果遇到 token 频繁过期:
1. 检查认证服务器的 token 有效期设置
2. 确保自动续期功能正常工作
3. 查看浏览器控制台的错误信息
### CORS 问题
如果遇到 CORS 错误:
1. 确保认证服务器配置了 CORS
2. 检查前端域名是否在允许列表中
3. 确认 `VITE_AUTH_SERVER_URL` 配置正确
### 回调失败
如果登录回调失败:
1. 检查 `redirect_uri` 是否匹配
2. 确认认证服务器返回的授权码
3. 查看浏览器控制台的详细错误信息