Open WebUI 集成企业微信认证开发文档
1. 系统架构
1.1 技术栈
- 前端: Vue3 + TypeScript
- 后端: FastAPI
- 数据库: PostgreSQL
- 缓存: Redis
- 认证: 企业微信 OAuth2.0
1.2 系统模块
前端应用
认证模块
会话管理
企业微信OAuth
数据持久化
PostgreSQL
2. 数据库设计
CREATE TABLE users (
id SERIAL PRIMARY KEY,
wecom_userid VARCHAR(64) UNIQUE NOT NULL,
name VARCHAR(100) NOT NULL,
avatar_url TEXT,
department JSON,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
last_login_at TIMESTAMP WITH TIME ZONE
);
CREATE TABLE chat_sessions (
id SERIAL PRIMARY KEY,
user_id INTEGER REFERENCES users(id),
title VARCHAR(200),
model VARCHAR(50),
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE messages (
id SERIAL PRIMARY KEY,
session_id INTEGER REFERENCES chat_sessions(id),
role VARCHAR(20) CHECK (role IN ('user', 'assistant', 'system')),
content TEXT,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
3. 后端实现
3.1 配置文件
from pydantic_settings import BaseSettings
class Settings(BaseSettings):
DATABASE_URL: str = "postgresql://user:password@localhost:5432/openwebui"
REDIS_URL: str = "redis://localhost:6379"
WECOM_CORPID: str
WECOM_CORPSECRET: str
WECOM_AGENT_ID: int
WECOM_REDIRECT_URI: str
JWT_SECRET_KEY: str
JWT_ALGORITHM: str = "HS256"
ACCESS_TOKEN_EXPIRE_MINUTES: int = 60 * 24
class Config:
env_file = ".env"
3.2 认证服务
from fastapi import HTTPException
import httpx
from typing import Dict
class WecomAuthService:
def __init__(self, settings):
self.settings = settings
self.access_token = None
async def get_access_token(self) -> str:
async with httpx.AsyncClient() as client:
response = await client.get(
"https://qyapi.weixin.qq.com/cgi-bin/gettoken",
params={
"corpid": self.settings.WECOM_CORPID,
"corpsecret": self.settings.WECOM_CORPSECRET
}
)
data = response.json()
if data.get("errcode") != 0:
raise HTTPException(status_code=401, detail="获取access_token失败")
return data["access_token"]
async def get_user_info(self, code: str) -> Dict:
token = await self.get_access_token()
async with httpx.AsyncClient() as client:
response = await client.get(
"https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo",
params={
"access_token": token,
"code": code
}
)
return response.json()
3.3 数据模型
from sqlalchemy import Column, Integer, String, DateTime
from sqlalchemy.sql import func
from .database import Base
class User(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True, index=True)
wecom_userid = Column(String, unique=True, index=True)
name = Column(String)
avatar_url = Column(String)
created_at = Column(DateTime(timezone=True), server_default=func.now())
last_login_at = Column(DateTime(timezone=True), onupdate=func.now())
4. 前端实现
4.1 登录组件
4.2 用户状态管理
import { defineStore } from 'pinia'
export const useAuthStore = defineStore('auth', {
state: () => ({
user: null,
token: null,
}),
actions: {
async login(code: string) {
try {
const response = await fetch('/api/auth/wecom/login', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ code }),
})
const data = await response.json()
this.token = data.token
this.user = data.user
localStorage.setItem('token', data.token)
} catch (error) {
console.error('登录失败:', error)
throw error
}
},
},
})
5. 部署说明
5.1 环境要求
- Python 3.8+
- Node.js 16+
- PostgreSQL 13+
- Redis 6+
5.2 安装步骤
- 克隆项目并安装依赖
git clone https://github.com/open-webui/open-webui.git
cd open-webui
cd backend
pip install -r requirements.txt
cd ../frontend
npm install
- 配置环境变量
DATABASE_URL=postgresql://user:password@localhost:5432/openwebui
REDIS_URL=redis://localhost:6379
WECOM_CORPID=your_corpid
WECOM_CORPSECRET=your_secret
WECOM_AGENT_ID=your_agent_id
JWT_SECRET_KEY=your_secret_key
- 初始化数据库
cd backend
alembic upgrade head
- 启动服务
uvicorn main:app --host 0.0.0.0 --port 8000
cd ../frontend
npm run dev
6. 测试计划
6.1 单元测试
import pytest
from services.auth import WecomAuthService
async def test_wecom_auth():
service = WecomAuthService(settings)
token = await service.get_access_token()
assert token is not None
6.2 集成测试检查清单
- 企业微信扫码登录流程
- 用户信息同步
- 会话持久化
- Token 过期处理
- 并发会话管理
7. 安全考虑
- 所有API请求需要JWT认证
- 使用HTTPS进行传输加密
- 实现请求频率限制
- 定期清理过期会话
- 敏感信息加密存储
8. 维护建议
- 定期备份数据库
- 监控系统资源使用
- 记录详细的操作日志
- 定期更新依赖包
- 制定故障恢复方案