mirror of
https://github.com/hansjone/oclaw.git
synced 2026-10-10 20:50:52 +08:00
change log in
This commit is contained in:
parent
9cf026f605
commit
8ca42dd973
211 changed files with 48417 additions and 109 deletions
255
uds-auth/README.zh.md
Normal file
255
uds-auth/README.zh.md
Normal file
|
|
@ -0,0 +1,255 @@
|
|||
# uds-auth
|
||||
|
||||
DeepSeek Harness 的UDS统一认证服务插件。利用现有UDS凭据实现自动单点登录(SSO),并提供多租户会话隔离。
|
||||
|
||||
## 特性
|
||||
|
||||
- **自动单点登录**: 已登录UDS的用户无需再次扫码即可访问系统
|
||||
- **多租户隔离**: 每个用户拥有独立的服务端会话,数据完全隔离
|
||||
- **灵活的会话存储**: 支持内存(开发环境)和Redis(生产环境)两种存储方式
|
||||
- **滑动过期**: 会话在活跃时自动延长,提升用户体验
|
||||
- **标准API**: 业务组件可通过 `getUserContext()` 轻松获取当前用户
|
||||
|
||||
## 安装
|
||||
|
||||
```bash
|
||||
dsh plugin --profile web add -w "github:your-org/uds-auth"
|
||||
```
|
||||
|
||||
本地开发安装:
|
||||
|
||||
```bash
|
||||
dsh plugin --profile web add -w "D:/code/gpt/uds-auth"
|
||||
```
|
||||
|
||||
然后重启DeepSeek Harness。
|
||||
|
||||
## 配置
|
||||
|
||||
复制 `config.default.yaml` 到配置目录并自定义:
|
||||
|
||||
```yaml
|
||||
udsAuth:
|
||||
baseUrl: https://uac.zte.com.cn
|
||||
systemCode: '100000456663'
|
||||
empNoHeader: X-Emp-No
|
||||
authValueHeader: X-Auth-Value
|
||||
langIdHeader: X-Lang-Id
|
||||
timeout: 5000
|
||||
|
||||
session:
|
||||
storeType: memory # 或 'redis'(生产环境)
|
||||
redisUrl: redis://localhost:6379
|
||||
cookieName: UDS_SESSION
|
||||
cookieMaxAge: 1800000 # 30分钟
|
||||
cookieSecure: true
|
||||
cookieHttpOnly: true
|
||||
cookieSameSite: strict
|
||||
slidingExpiration: true
|
||||
slidingInterval: 300000 # 5分钟
|
||||
|
||||
loginPageUrl: https://uac.zte.com.cn/portal/login.html
|
||||
```
|
||||
|
||||
## 使用方法
|
||||
|
||||
### 作为中间件
|
||||
|
||||
插件提供可集成到HTTP服务器的中间件:
|
||||
|
||||
```javascript
|
||||
import udsAuthPlugin from 'uds-auth'
|
||||
import { createServer } from 'http'
|
||||
|
||||
const config = {
|
||||
udsAuth: {
|
||||
baseUrl: 'https://uac.zte.com.cn',
|
||||
systemCode: '100000456663',
|
||||
},
|
||||
session: {
|
||||
storeType: 'memory',
|
||||
cookieMaxAge: 1800000,
|
||||
},
|
||||
loginPageUrl: 'https://uac.zte.com.cn/portal/login.html',
|
||||
}
|
||||
|
||||
// 初始化插件
|
||||
const ctx = {} // Cordis上下文
|
||||
const plugin = await udsAuthPlugin(ctx, config)
|
||||
|
||||
// 获取服务
|
||||
const { authMiddleware, apiHandlers } = plugin.services
|
||||
|
||||
// 在HTTP服务器中使用
|
||||
const server = createServer(async (req, res) => {
|
||||
const ctx = { req, res }
|
||||
|
||||
// 应用认证中间件
|
||||
await authMiddleware(ctx, async () => {
|
||||
// 如果ctx.userContext存在则用户已认证
|
||||
if (ctx.userContext) {
|
||||
res.writeHead(200, { 'Content-Type': 'application/json' })
|
||||
res.end(JSON.stringify({
|
||||
message: '你好 ' + ctx.userContext.username,
|
||||
user: ctx.userContext,
|
||||
}))
|
||||
} else {
|
||||
res.writeHead(401)
|
||||
res.end('未授权')
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
server.listen(3000)
|
||||
```
|
||||
|
||||
### 获取当前用户
|
||||
|
||||
业务组件可以访问当前用户上下文:
|
||||
|
||||
```javascript
|
||||
import { getUserContext, withUserContext } from 'uds-auth'
|
||||
|
||||
async function myBusinessLogic() {
|
||||
// 使用AsyncLocalStorage确保请求隔离
|
||||
await withUserContext(userContext, async () => {
|
||||
const user = getUserContext()
|
||||
|
||||
if (!user) {
|
||||
throw new Error('未认证')
|
||||
}
|
||||
|
||||
console.log('当前用户:', user.username)
|
||||
console.log('用户ID:', user.userId)
|
||||
console.log('部门:', user.department)
|
||||
|
||||
// 继续业务逻辑...
|
||||
})
|
||||
}
|
||||
```
|
||||
|
||||
### API端点
|
||||
|
||||
插件暴露以下端点:
|
||||
|
||||
- `POST /api/uds-auth/logout` - 登出并销毁会话
|
||||
- `GET /api/uds-auth/me` - 获取当前用户信息
|
||||
|
||||
集成示例:
|
||||
|
||||
```javascript
|
||||
import { createApiHandlers } from 'uds-auth'
|
||||
|
||||
const apiHandlers = createApiHandlers(config, sessionStore)
|
||||
|
||||
// 在路由中
|
||||
app.post('/api/logout', (req, res) => {
|
||||
apiHandlers.logout({ req, res })
|
||||
})
|
||||
|
||||
app.get('/api/me', (req, res) => {
|
||||
apiHandlers.getCurrentUser({ req, res })
|
||||
})
|
||||
```
|
||||
|
||||
## 会话存储
|
||||
|
||||
### 内存存储(开发)
|
||||
|
||||
```javascript
|
||||
const config = {
|
||||
session: {
|
||||
storeType: 'memory',
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
会话存储在进程内存中,重启后丢失。仅适用于开发环境。
|
||||
|
||||
### Redis存储(生产)
|
||||
|
||||
```javascript
|
||||
const config = {
|
||||
session: {
|
||||
storeType: 'redis',
|
||||
redisUrl: 'redis://your-redis-host:6379',
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
需要安装 `redis` 包:
|
||||
|
||||
```bash
|
||||
npm install redis
|
||||
```
|
||||
|
||||
会话跨重启持久化,支持分布式部署。
|
||||
|
||||
## 安全考虑
|
||||
|
||||
- Session Cookie设置了`HttpOnly`、`Secure`和`SameSite=strict`属性
|
||||
- Token值永远不会被记录到日志
|
||||
- Session ID使用`crypto.randomUUID()`生成
|
||||
- 不同用户的会话完全隔离
|
||||
|
||||
## 测试
|
||||
|
||||
运行测试:
|
||||
|
||||
```bash
|
||||
cd uds-auth
|
||||
node --test test/**/*.test.js
|
||||
```
|
||||
|
||||
或使用手动测试运行器:
|
||||
|
||||
```bash
|
||||
node test/config.test.js
|
||||
node test/session/memory-store.test.js
|
||||
node test/uds/client.test.js
|
||||
node test/uds/validator.test.js
|
||||
node test/middleware/auth-middleware.test.js
|
||||
node test/context.test.js
|
||||
node test/api.test.js
|
||||
```
|
||||
|
||||
## 项目结构
|
||||
|
||||
```
|
||||
uds-auth/
|
||||
├── lib/
|
||||
│ ├── config.js # 配置加载和验证
|
||||
│ ├── index.js # 插件入口
|
||||
│ ├── context.js # AsyncLocalStorage用户上下文
|
||||
│ ├── api.js # API处理器(登出、获取当前用户)
|
||||
│ ├── session/
|
||||
│ │ ├── store.js # 抽象会话存储基类
|
||||
│ │ ├── memory-store.js # 内存会话存储
|
||||
│ │ ├── redis-store.js # Redis会话存储
|
||||
│ │ └── factory.js # 会话存储工厂
|
||||
│ ├── uds/
|
||||
│ │ ├── client.js # UDS验证客户端
|
||||
│ │ └── validator.js # 凭据提取和验证
|
||||
│ └── middleware/
|
||||
│ ├── auth-middleware.js # 主认证中间件
|
||||
│ └── session-middleware.js # 会话管理中间件
|
||||
├── test/
|
||||
│ ├── config.test.js
|
||||
│ ├── context.test.js
|
||||
│ ├── api.test.js
|
||||
│ ├── session/
|
||||
│ ├── uds/
|
||||
│ ├── middleware/
|
||||
│ └── integration/
|
||||
├── docs/
|
||||
│ └── frontend-auth-analysis.md # 前端认证分析文档
|
||||
├── config.default.yaml # 默认配置
|
||||
├── cordis.patch.yml # DeepSeekHarness插件配置
|
||||
├── package.json
|
||||
├── README.md
|
||||
└── README.zh.md
|
||||
```
|
||||
|
||||
## License
|
||||
|
||||
MIT
|
||||
Loading…
Add table
Add a link
Reference in a new issue