oclaw/uds-auth/lib/config.js
oliver df97c5e042
Some checks are pending
ci / test (push) Waiting to run
ci / test-postgresql (push) Waiting to run
fix(uds-auth): emergency login workspaces, Desktop key prompts, persistent sessions
Emergency (fallback / sealed-box) admins lost the workspace sidebar and saw
"sign-in failed / add API key" on DSH Desktop because the remote.mux opens
anonymously at boot and every early call was rejected terminally.

- gateway: anonymous workspace/follow reaches dsh-acl's empty baseline;
  anonymous streams are parked until the carrier aborts instead of failing;
  anonymous workspace/initializeDefault answers "nothing created"
- request-auth: a dead UDS_SESSION cookie no longer shadows a valid WS ticket
  or bridge (sync + async variants used by all callers)
- dsh-acl: /api/* waits (bounded 15s) for the gateway ACL during Host startup
  instead of 403, so the Desktop welcome read no longer fails
- desktop-bootstrap: key/account projection is best-effort per reference
- client: emit connection/reset after login so boot-time caches (settings
  describe mirror -> Settings > Models) re-read under the real principal
- sessions: absolute lifetime fixed at 7 days (was min(ttl, 7d) = 30 min);
  bridge expiry slides with its session; MemoryStore persisted to
  sessions.json (bearer hash only, userData AES-256-GCM sealed)
- README: session lifetime/persistence and DSH compatibility notes

Also includes previously uncommitted uds-auth 0.3.x work in this tree.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 02:11:09 +08:00

73 lines
2.5 KiB
JavaScript
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.

/**
* uds-auth 配置工具
* Config schema 定义在 lib/index.js(由 DSH host 提供 @deepseek-ai/schemastery)
* 这里只做纯 JS 的默认值和工具函数,不依赖 host 运行时
*
* 可配置字段(部署相关,在 DSH 设置面板可改):
* uacBaseUrl UAC 基础 URL
* userSearchUrl icenterapi 用户搜索接口
* loginSystemCode 业务系统 Code
* originSystemCode 来源系统 Code
*
* 内部常量(UDS 固定协议,不暴露给用户):
* uacQrVerifyPath, cookie 名称, header 名称, session 等
*/
const UDS_AUTH_SETTINGS_NAMESPACE = 'uds-auth'
// 可配置字段的默认值(与 lib/index.js 里 Config schema 保持一致)
const DEFAULT_CONFIG = {
uacBaseUrl: 'https://uac.zte.com.cn',
userSearchUrl: 'https://icenterapi.zte.com.cn/zte-km-icenter-addresearch/user/plain/docs/search',
loginSystemCode: '100000455558',
originSystemCode: '',
retainSkillCredentialsOnLogout: true,
skillCredentialTtlSeconds: 7 * 24 * 60 * 60,
outboundAllowedHosts: 'icenterapi.zte.com.cn,icentermsg.dt.zte.com.cn',
initialAdminEmpNo: '',
allowOpenRegistration: true,
allowRawAgentToken: false,
/** Empty = loopback Host only; reverse proxies must set explicit authorities. */
trustedHosts: '',
}
// 内部常量(不暴露)
const INTERNAL = {
uacQrVerifyPath: '/uacqr/auth/qrcode/verify.serv',
cookieEmpNo: 'PORTALSSOUser',
cookieAuthValue: 'PORTALSSOCookie',
altCookieEmpNo: 'ZTEDPGSSOUser',
altCookieAuthValue: 'ZTEDPGSSOCookie',
empNoHeader: 'X-Emp-No',
authValueHeader: 'X-Auth-Value',
session: {
storeType: 'memory',
redisUrl: 'redis://localhost:6379',
cookieName: 'UDS_SESSION',
cookieMaxAge: 1800000,
},
}
export { DEFAULT_CONFIG, INTERNAL, UDS_AUTH_SETTINGS_NAMESPACE }
export function loadConfig(custom = {}) {
return { ...DEFAULT_CONFIG, ...(custom || {}) }
}
export function buildVerifyUrl(uacBaseUrl, uacQrVerifyPath) {
if (/^https?:\/\//.test(uacQrVerifyPath)) return uacQrVerifyPath
return (uacBaseUrl.replace(/\/$/, '') + '/' + uacQrVerifyPath.replace(/^\//, ''))
}
export function validateConfig(config) {
if (!config?.uacBaseUrl) throw new Error('uacBaseUrl is required')
const checkHttps = (v, name) => {
if (v == null || v === '') return
let u
try { u = new URL(String(v)) } catch { throw new Error(`invalid_${name}`) }
if (u.protocol !== 'https:') throw new Error(`${name}_must_be_https`)
}
checkHttps(config.uacBaseUrl, 'uacBaseUrl')
checkHttps(config.userSearchUrl, 'userSearchUrl')
return true
}