oclaw/uds-auth/README.zh.md
2026-09-08 00:28:58 +08:00

5.9 KiB
Raw Blame History

uds-auth

DeepSeek Harness 的UDS统一认证服务插件。利用现有UDS凭据实现自动单点登录(SSO),并提供多租户会话隔离。

特性

  • 自动单点登录: 已登录UDS的用户无需再次扫码即可访问系统
  • 多租户隔离: 每个用户拥有独立的服务端会话,数据完全隔离
  • 灵活的会话存储: 支持内存(开发环境)和Redis(生产环境)两种存储方式
  • 滑动过期: 会话在活跃时自动延长,提升用户体验
  • 标准API: 业务组件可通过 getUserContext() 轻松获取当前用户

安装

dsh plugin --profile web add -w "github:your-org/uds-auth"

本地开发安装:

dsh plugin --profile web add -w "D:/code/gpt/uds-auth"

然后重启DeepSeek Harness。

配置

复制 config.default.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服务器的中间件:

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)

获取当前用户

业务组件可以访问当前用户上下文:

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 - 获取当前用户信息

集成示例:

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

会话存储

内存存储(开发)

const config = {
  session: {
    storeType: 'memory',
  },
}

会话存储在进程内存中,重启后丢失。仅适用于开发环境。

Redis存储(生产)

const config = {
  session: {
    storeType: 'redis',
    redisUrl: 'redis://your-redis-host:6379',
  },
}

需要安装 redis 包:

npm install redis

会话跨重启持久化,支持分布式部署。

安全考虑

  • Session Cookie设置了HttpOnly、Secure和SameSite=strict属性
  • Token值永远不会被记录到日志
  • Session ID使用crypto.randomUUID()生成
  • 不同用户的会话完全隔离

测试

运行测试:

cd uds-auth
node --test test/**/*.test.js

或使用手动测试运行器:

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