@eduwork/dsh-oidc 0.2.3 → 0.3.0-dev.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.en.md +6 -38
- package/CHANGELOG.md +7 -39
- package/CODE_OF_CONDUCT.en.md +1 -1
- package/CODE_OF_CONDUCT.md +1 -1
- package/CONTRIBUTING.en.md +1 -1
- package/CONTRIBUTING.md +1 -1
- package/README.md +21 -130
- package/README_EN.md +36 -0
- package/SECURITY.en.md +1 -1
- package/SECURITY.md +1 -1
- package/SUPPORT.en.md +1 -1
- package/SUPPORT.md +1 -1
- package/docs/EDUWORK-MIGRATION.en.md +3 -31
- package/docs/EDUWORK-MIGRATION.md +3 -31
- package/docs/account-extensions.en.md +6 -6
- package/docs/account-extensions.md +3 -3
- package/docs/architecture.en.md +12 -117
- package/docs/architecture.md +12 -118
- package/docs/compatibility.en.md +6 -62
- package/docs/compatibility.md +6 -62
- package/docs/decisions/0001-one-plugin-composition-boundary.en.md +2 -2
- package/docs/decisions/0001-one-plugin-composition-boundary.md +2 -2
- package/docs/desktop-host.en.md +54 -55
- package/docs/desktop-host.md +63 -64
- package/docs/development.en.md +44 -44
- package/docs/development.md +6 -6
- package/docs/dsh-integration.en.md +13 -48
- package/docs/dsh-integration.md +14 -49
- package/docs/ecnu-reference.en.md +4 -61
- package/docs/ecnu-reference.md +4 -61
- package/docs/enterprise-profile.en.md +10 -31
- package/docs/enterprise-profile.md +11 -32
- package/docs/gateway-auth/README.md +168 -0
- package/docs/gateway-auth/README_EN.md +70 -0
- package/docs/gateway-auth/experimental-oidc-llm.en.md +53 -0
- package/docs/gateway-auth/experimental-oidc-llm.md +53 -0
- package/docs/gateway-auth/litellm-setup.en.md +114 -0
- package/docs/gateway-auth/litellm-setup.md +114 -0
- package/docs/gateway-auth/oidc-llm-draft.en.md +141 -0
- package/docs/gateway-auth/oidc-llm-draft.md +141 -0
- package/docs/getting-started.en.md +17 -122
- package/docs/getting-started.md +16 -225
- package/docs/key-binding-protocol.en.md +10 -220
- package/docs/key-binding-protocol.md +10 -220
- package/docs/oidc-interoperability.en.md +1 -1
- package/docs/oidc-interoperability.md +1 -1
- package/docs/open-integration.en.md +11 -0
- package/docs/open-integration.md +11 -0
- package/docs/public-resource-protocol.en.md +8 -44
- package/docs/public-resource-protocol.md +8 -43
- package/docs/release-checklist.en.md +7 -61
- package/docs/release-checklist.md +7 -61
- package/docs/security-model.en.md +10 -132
- package/docs/security-model.md +10 -132
- package/docs/server-integration-contract.en.md +12 -811
- package/docs/server-integration-contract.md +12 -823
- package/examples/ecnu.enterprise-profile.example.json +14 -19
- package/examples/enterprise-profile.example.json +73 -78
- package/examples/identity-only.example.json +1 -1
- package/examples/litellm.enterprise-profile.example.json +9 -0
- package/examples/oidc-llm.enterprise-profile.example.json +12 -0
- package/examples/resources-discovery.example.json +6 -9
- package/lib/callback-page.js +5 -5
- package/lib/client.js +31 -48
- package/lib/desktop-oidc.js +7 -11
- package/lib/gateway-backend.js +443 -0
- package/lib/gateway-protocol.js +6 -0
- package/lib/index.js +14 -15
- package/lib/litellm-protocol.js +117 -0
- package/lib/model-resource-transport.js +19 -0
- package/lib/oidc-llm-protocol.js +88 -0
- package/lib/oidc.js +37 -323
- package/lib/profile.js +34 -40
- package/lib/provider/authorization-scope.js +46 -0
- package/lib/provider/index.js +11 -2
- package/lib/provider/transforms.js +0 -1
- package/lib/typert-schemas.js +1 -1
- package/lib/typert.host.js +38 -38
- package/lib/typert.remote-client.js +37 -37
- package/package.json +7 -6
- package/protocol/openapi.yaml +33 -240
- package/protocol/resources.openapi.yaml +8 -9
- package/schema/enterprise-profile.v1alpha1.schema.json +595 -193
- package/README.en.md +0 -186
|
@@ -1,138 +1,16 @@
|
|
|
1
|
-
# Security
|
|
1
|
+
# Security boundaries
|
|
2
2
|
|
|
3
3
|
[简体中文](security-model.md) | **English**
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
Profiles are explicitly configured trusted data. Discovery and token responses cannot select executable modules, inject branding scripts or choose arbitrary request destinations.
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
- Code + PKCE, one-use state and applicable nonce bind sign-in; desktop callbacks listen only on 127.0.0.1.
|
|
8
|
+
- OIDC validates signature, issuer, aud/azp, time, nonce, at_hash and UserInfo subject. ID Tokens returned during refresh are checked against the original identity.
|
|
9
|
+
- Validated discovery supplies model API endpoints. Host requests restrict destinations and redirects; extension reads accept bounded relative paths, GET and bounded bodies.
|
|
10
|
+
- Tokens stay in Host credential storage, never RPC, configuration, diagnostics or model metadata. Personal keys remain separate.
|
|
11
|
+
- Requests bind to authorization context. Logout or reauthorization cancels old calls; late responses cannot restore sessions or leak into another account. Refresh within the same authorization does not cancel valid calls.
|
|
12
|
+
- Local logout precedes best-effort Refresh Token revocation. Remote failure cannot restore local access. Servers determine issued Access Tokens' remaining lifetime.
|
|
8
13
|
|
|
9
|
-
|
|
10
|
-
- stable OIDC subject identifiers and optional display claims;
|
|
11
|
-
- model runtime API keys;
|
|
12
|
-
- organization/provider/model configuration;
|
|
13
|
-
- account and capability state.
|
|
14
|
+
The client no longer creates, reads or migrates organization model API keys. Old profiles are explicitly rejected and migration requires sign-in, without URL/token-shape guessing. Old keys are not bulk-deleted because independent configurations may still use them.
|
|
14
15
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
## Trust boundaries
|
|
18
|
-
|
|
19
|
-
1. Browser to DSH Host callback/UI.
|
|
20
|
-
2. DSH Host to OIDC Provider.
|
|
21
|
-
3. DSH Host to Key Binding service.
|
|
22
|
-
4. DSH Host to model gateway.
|
|
23
|
-
5. Plugin to DSH Credential Provider.
|
|
24
|
-
6. Trusted local executable plugin code versus declarative Enterprise Profile data.
|
|
25
|
-
|
|
26
|
-
The same institution may operate boundaries 2–4, but they remain separate protocol authorities and should use distinct audiences and credentials.
|
|
27
|
-
|
|
28
|
-
## Security controls in this repository
|
|
29
|
-
|
|
30
|
-
### OIDC
|
|
31
|
-
|
|
32
|
-
- Authorization Code + PKCE S256 only.
|
|
33
|
-
- Random state, nonce, and verifier.
|
|
34
|
-
- Ten-minute pending-flow expiry and bounded flow count.
|
|
35
|
-
- Fixed callback path and explicit public origin.
|
|
36
|
-
- Duplicate security-parameter rejection.
|
|
37
|
-
- RS256 signature/JWK/issuer/audience/azp/subject/nonce/time validation.
|
|
38
|
-
- `at_hash` validation when supplied.
|
|
39
|
-
- UserInfo `sub` equality with ID Token `sub`.
|
|
40
|
-
- Same-origin-only callback return path.
|
|
41
|
-
- HTTPS remote endpoints; explicit loopback-only HTTP development exception.
|
|
42
|
-
- One MiB maximum for OIDC and Key Binding JSON responses.
|
|
43
|
-
|
|
44
|
-
### Configuration
|
|
45
|
-
|
|
46
|
-
- Unknown keys rejected.
|
|
47
|
-
- 512 KiB profile bound.
|
|
48
|
-
- No remote adapter/module/tool/skill selection.
|
|
49
|
-
- Fixed Key Binding paths and fields.
|
|
50
|
-
- HTTPS production URLs without embedded credentials/fragments.
|
|
51
|
-
- PNG/WebP-only data logos; no SVG data URL.
|
|
52
|
-
- Only bounded brand token overrides.
|
|
53
|
-
|
|
54
|
-
### Secrets
|
|
55
|
-
|
|
56
|
-
- Public OIDC client; no client secret.
|
|
57
|
-
- Session and API key written only through DSH Credential Provider.
|
|
58
|
-
- The model adapter resolves the normalized Profile credential reference at request time; deterministic Provider-ID derivation is only the default when none is configured.
|
|
59
|
-
- Separate empty pi-ai auth store prevents ambient credentials shadowing the bound key.
|
|
60
|
-
- Credential response requires exact Provider ID.
|
|
61
|
-
- A native host's reported credential reference must match the Profile, preventing production/test cross-resolution.
|
|
62
|
-
- Logout clears both local session and model key.
|
|
63
|
-
|
|
64
|
-
## Host assumptions
|
|
65
|
-
|
|
66
|
-
The plugin assumes:
|
|
67
|
-
|
|
68
|
-
- Node.js TLS and DNS trust are correctly administered;
|
|
69
|
-
- DSH plugins and profile files are writable only by trusted administrators;
|
|
70
|
-
- the DSH WebServer listens exactly on `127.0.0.1` and exact `/oauth/callback` routing is not bypassed;
|
|
71
|
-
- the active Credential Provider protects confidentiality and isolates intended users;
|
|
72
|
-
- logs and crash reports do not dump credential values or request bodies;
|
|
73
|
-
- no reverse proxy, port forward, or tunnel exposes the local WebServer to other users;
|
|
74
|
-
- system time is reasonably synchronized.
|
|
75
|
-
|
|
76
|
-
If any assumption fails, the plugin alone cannot restore the security boundary.
|
|
77
|
-
|
|
78
|
-
## Single-user versus shared Web deployment
|
|
79
|
-
|
|
80
|
-
The Web backend stores one logical OIDC session per profile credential reference. In a local DSH process with a file-backed credential store, that is a **single-user process model**. Multiple browsers reaching the same process could observe or replace the same account state through the shared Host services.
|
|
81
|
-
|
|
82
|
-
The current Web backend therefore forces the DSH WebServer to listen on `127.0.0.1` and rejects both `publicBaseURL` and non-loopback hosts. It MUST NOT be exposed as a shared multi-user service.
|
|
83
|
-
|
|
84
|
-
A shared deployment requires the host—not this plugin—to provide:
|
|
85
|
-
|
|
86
|
-
- authenticated browser sessions;
|
|
87
|
-
- per-user service/request context;
|
|
88
|
-
- per-user Credential Provider namespaces;
|
|
89
|
-
- encrypted storage with rotation and backup policy;
|
|
90
|
-
- Secure, HttpOnly, SameSite cookies;
|
|
91
|
-
- CSRF protection for non-OIDC state-changing actions;
|
|
92
|
-
- tenant/subject isolation tests;
|
|
93
|
-
- session termination and administrator revocation;
|
|
94
|
-
- rate limiting and abuse monitoring.
|
|
95
|
-
|
|
96
|
-
Those capabilities require a future, separate host backend; they are not a reason to relax the current Web backend's loopback check. Until DSH exposes and this project tests those contracts, the supported Web topology is one trusted user per process/profile.
|
|
97
|
-
|
|
98
|
-
## SSRF and endpoint policy
|
|
99
|
-
|
|
100
|
-
OIDC metadata is remote-controlled after the trusted issuer is configured. The standard permits cross-origin endpoints, so the plugin accepts them only over HTTPS. This prevents an arbitrary network-HTTP downgrade but does not stop a malicious or compromised issuer from naming private HTTPS endpoints.
|
|
101
|
-
|
|
102
|
-
Operators SHOULD apply egress policy so the DSH process can reach only approved identity, Key Binding, and model origins. Cloud deployments SHOULD block metadata-service ranges and internal control planes at the network layer. DNS rebinding protections belong at the HTTP agent/egress proxy layer and are not implemented here.
|
|
103
|
-
|
|
104
|
-
## Browser security
|
|
105
|
-
|
|
106
|
-
The host SHOULD set a restrictive Content Security Policy. At minimum, review:
|
|
107
|
-
|
|
108
|
-
- `connect-src` for DSH/WebSocket traffic;
|
|
109
|
-
- `img-src` for HTTPS and approved `data:` images;
|
|
110
|
-
- `frame-ancestors 'none'` unless embedding is explicitly intended;
|
|
111
|
-
- `base-uri 'none'` and `object-src 'none'`;
|
|
112
|
-
- `Referrer-Policy: no-referrer` or similarly restrictive policy.
|
|
113
|
-
|
|
114
|
-
Remote brand images can reveal client IP/timing to their host even with no referrer. Package or proxy assets where that is unacceptable.
|
|
115
|
-
|
|
116
|
-
## Known limitations
|
|
117
|
-
|
|
118
|
-
- RS256 only; no algorithm agility yet.
|
|
119
|
-
- No PAR/JAR/JARM, DPoP, mTLS, or encrypted tokens.
|
|
120
|
-
- No RP-Initiated, front-channel, or back-channel logout.
|
|
121
|
-
- In-memory pending login state is lost on restart and is not cluster-shared.
|
|
122
|
-
- Discovery is cached for the process lifetime; emergency endpoint changes require restart.
|
|
123
|
-
- Native backend security depends on the host `enterpriseAccounts` implementation.
|
|
124
|
-
- Key Binding has no remote credential-revoke operation in v1.
|
|
125
|
-
- Dependency integrity relies on npm lockfile and release controls; the repository does not vendor DSH/pi-ai source.
|
|
126
|
-
|
|
127
|
-
## Security review checklist for deployments
|
|
128
|
-
|
|
129
|
-
- [ ] Exact issuer, client ID, redirect URI, and audiences approved.
|
|
130
|
-
- [ ] OIDC conformance and negative tests pass.
|
|
131
|
-
- [ ] Key Binding scopes and entitlement checks tested for cross-user/cross-tenant access.
|
|
132
|
-
- [ ] Provider/key mismatch and stale-key revocation tested.
|
|
133
|
-
- [ ] Credential Provider topology matches single-user or isolated multi-user requirements.
|
|
134
|
-
- [ ] Reverse proxy and CSP reviewed.
|
|
135
|
-
- [ ] Secrets absent from application, proxy, APM, and crash logs.
|
|
136
|
-
- [ ] Egress policy blocks unexpected private/metadata destinations.
|
|
137
|
-
- [ ] Dependency lockfile, install scripts, and licenses reviewed.
|
|
138
|
-
- [ ] Incident response contact and remote credential revocation procedure documented.
|
|
16
|
+
See [Profiles](enterprise-profile.en.md) and [protocols](gateway-auth/README_EN.md). Local Web is not a multi-user service.
|
package/docs/security-model.md
CHANGED
|
@@ -1,138 +1,16 @@
|
|
|
1
|
-
#
|
|
1
|
+
# 安全边界
|
|
2
2
|
|
|
3
3
|
**简体中文** | [English](security-model.en.md)
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
Profile 由发行方或本机用户明确配置,限制为数据。发现与 Token 响应不允许改写执行模块、品牌脚本或任意请求目的地。
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
- Code + PKCE、一次性 state 和适用的 nonce 绑定登录;桌面回调只监听 127.0.0.1。
|
|
8
|
+
- OIDC 校验签名、issuer、aud/azp、时间、nonce、at_hash 和 UserInfo sub;刷新返回 ID Token 时验证原身份。
|
|
9
|
+
- 模型 API 地址来自已校验的发现。Host 限制目的地址和重定向,机构资源读取只接受有界相对路径、GET 和有界正文。
|
|
10
|
+
- Token 由 Host 凭据服务保存,不通过 RPC、配置、诊断或模型元数据暴露。个人 Key 与机构 Token 分开。
|
|
11
|
+
- 请求绑定登录上下文;退出和重新授权取消旧请求,迟到响应不能恢复旧登录或流入新账户。相同授权的 Token 刷新不应误伤在途调用。
|
|
12
|
+
- 客户端先本地退出,再尽力撤销 Refresh Token;远程失败不恢复本地授权。已签发 Access Token 的剩余有效期由服务端控制。
|
|
8
13
|
|
|
9
|
-
|
|
10
|
-
- 稳定 OIDC subject 标识符和可选显示 claim;
|
|
11
|
-
- 模型运行时 API Key;
|
|
12
|
-
- 机构、Provider 和模型配置;
|
|
13
|
-
- 账号与能力状态。
|
|
14
|
+
客户端不再创建、读取或迁移机构模型 API Key。遇到旧配置明确拒绝,迁移需重新登录;不会凭 URL 或 Token 外观猜测兼容方式。旧 Key 不会被批量删除,以免影响其他独立配置。
|
|
14
15
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
## 信任边界
|
|
18
|
-
|
|
19
|
-
1. 浏览器到 DSH Host callback/UI。
|
|
20
|
-
2. DSH Host 到 OIDC Provider。
|
|
21
|
-
3. DSH Host 到 Key Binding 服务。
|
|
22
|
-
4. DSH Host 到模型网关。
|
|
23
|
-
5. 插件到 DSH Credential Provider。
|
|
24
|
-
6. 受信任的本地可执行插件代码与声明式 Enterprise Profile 数据之间。
|
|
25
|
-
|
|
26
|
-
同一机构可以运营第 2–4 项边界,但它们仍是彼此独立的协议权威,应该使用不同 audience 和凭据。
|
|
27
|
-
|
|
28
|
-
## 本仓库实现的安全控制
|
|
29
|
-
|
|
30
|
-
### OIDC
|
|
31
|
-
|
|
32
|
-
- 仅使用 Authorization Code + PKCE S256。
|
|
33
|
-
- 随机 state、nonce 和 verifier。
|
|
34
|
-
- 待处理流程十分钟过期,且数量受限。
|
|
35
|
-
- 固定 callback 路径和显式 public origin。
|
|
36
|
-
- 拒绝重复安全参数。
|
|
37
|
-
- 校验 RS256 签名、JWK、issuer、audience、azp、subject、nonce 和时间。
|
|
38
|
-
- 存在 `at_hash` 时校验它。
|
|
39
|
-
- UserInfo `sub` 必须等于 ID Token `sub`。
|
|
40
|
-
- Callback return path 只能同源。
|
|
41
|
-
- 远程 endpoint 必须 HTTPS;只有显式 loopback 开发环境可以使用 HTTP。
|
|
42
|
-
- OIDC 与 Key Binding JSON 响应最大 1 MiB。
|
|
43
|
-
|
|
44
|
-
### 配置
|
|
45
|
-
|
|
46
|
-
- 拒绝未知字段。
|
|
47
|
-
- Profile 最大 512 KiB。
|
|
48
|
-
- 不允许远程选择 adapter、module、tool 或 Skill。
|
|
49
|
-
- Key Binding 路径和字段固定。
|
|
50
|
-
- 生产 URL 使用 HTTPS,且不得包含凭据或 fragment。
|
|
51
|
-
- Data logo 只允许 PNG/WebP,不允许 SVG。
|
|
52
|
-
- 只覆盖有边界的品牌 token。
|
|
53
|
-
|
|
54
|
-
### 秘密
|
|
55
|
-
|
|
56
|
-
- 使用 OIDC public client,不使用 client secret。
|
|
57
|
-
- Session 和 API Key 只通过 DSH Credential Provider 写入。
|
|
58
|
-
- 模型 adapter 在请求时解析 Profile 规范化后的凭据引用;未配置时才按 Provider ID 确定性派生。
|
|
59
|
-
- 独立空 pi-ai auth store 防止环境凭据遮蔽已绑定 Key。
|
|
60
|
-
- 凭据响应必须精确匹配 Provider ID。
|
|
61
|
-
- Native 宿主报告的凭据引用必须与 Profile 一致,防止生产/测试环境交叉取 Key。
|
|
62
|
-
- 退出登录会清除本地会话和模型 Key。
|
|
63
|
-
|
|
64
|
-
## 宿主假设
|
|
65
|
-
|
|
66
|
-
插件假设:
|
|
67
|
-
|
|
68
|
-
- Node.js TLS 和 DNS 信任得到正确管理;
|
|
69
|
-
- DSH 插件和 Profile 文件只能由受信任管理员写入;
|
|
70
|
-
- DSH WebServer 精确监听 `127.0.0.1`,且 `/oauth/callback` 路由注册不会被绕过;
|
|
71
|
-
- 当前 Credential Provider 能保护机密性,并隔离目标用户;
|
|
72
|
-
- 日志和崩溃报告不会转储凭据值或请求 body;
|
|
73
|
-
- 没有反向代理、端口转发或隧道把本地 WebServer 暴露给其他用户;
|
|
74
|
-
- 系统时间基本同步。
|
|
75
|
-
|
|
76
|
-
任何假设失效时,插件无法独自恢复安全边界。
|
|
77
|
-
|
|
78
|
-
## 单用户与共享 Web 部署
|
|
79
|
-
|
|
80
|
-
Web 后端会按 Profile 凭据引用保存一个逻辑 OIDC 会话。在使用文件型凭据存储的本地 DSH 进程中,这属于**单用户进程模型**。访问同一进程的多个浏览器可能通过共用 Host 服务看到或替换同一账号状态。
|
|
81
|
-
|
|
82
|
-
因此,当前 Web backend 强制 DSH WebServer 监听 `127.0.0.1`,并拒绝 `publicBaseURL` 或非 loopback host。它不得作为共享多用户服务公开。
|
|
83
|
-
|
|
84
|
-
共享部署要求宿主而不是本插件提供:
|
|
85
|
-
|
|
86
|
-
- 已认证的浏览器 session;
|
|
87
|
-
- 每用户服务/请求上下文;
|
|
88
|
-
- 每用户 Credential Provider 命名空间;
|
|
89
|
-
- 带轮换和备份策略的加密存储;
|
|
90
|
-
- Secure、HttpOnly、SameSite Cookie;
|
|
91
|
-
- 对非 OIDC 状态变更操作的 CSRF 防护;
|
|
92
|
-
- tenant/subject 隔离测试;
|
|
93
|
-
- session 终止和管理员撤销;
|
|
94
|
-
- 限流和滥用监控。
|
|
95
|
-
|
|
96
|
-
上述能力需要由未来新的宿主 backend 实现;它们不是放宽当前 Web backend loopback 检查的理由。在 DSH 暴露并且本项目验证这些契约前,支持的 Web 拓扑是每个进程/Profile 仅供一名受信任用户使用。
|
|
97
|
-
|
|
98
|
-
## SSRF 与 endpoint 策略
|
|
99
|
-
|
|
100
|
-
配置受信任 issuer 后,OIDC 元数据仍由远端控制。标准允许跨 origin endpoint,因此插件仅在 HTTPS 下接受它们。这样可阻止任意网络 HTTP 降级,但不能阻止恶意或已被攻陷的 issuer 指向私有 HTTPS endpoint。
|
|
101
|
-
|
|
102
|
-
运维方应该实施出口策略,使 DSH 进程只能访问已批准的身份、Key Binding 和模型 origin。云部署应该在网络层阻断 metadata-service 地址段和内部控制面。DNS rebinding 防护属于 HTTP agent/出口代理职责,本插件尚未实现。
|
|
103
|
-
|
|
104
|
-
## 浏览器安全
|
|
105
|
-
|
|
106
|
-
宿主应该设置严格 Content Security Policy,至少审查:
|
|
107
|
-
|
|
108
|
-
- `connect-src`:DSH/WebSocket 流量;
|
|
109
|
-
- `img-src`:HTTPS 和批准的 `data:` 图片;
|
|
110
|
-
- `frame-ancestors 'none'`:除非明确需要嵌入;
|
|
111
|
-
- `base-uri 'none'` 和 `object-src 'none'`;
|
|
112
|
-
- `Referrer-Policy: no-referrer` 或同等严格策略。
|
|
113
|
-
|
|
114
|
-
即便没有 referrer,远程品牌图片仍可能向其宿主暴露客户端 IP 和访问时间。无法接受时,应打包资产或通过受控代理提供。
|
|
115
|
-
|
|
116
|
-
## 已知限制
|
|
117
|
-
|
|
118
|
-
- 只支持 RS256,尚无算法敏捷性。
|
|
119
|
-
- 不支持 PAR/JAR/JARM、DPoP、mTLS 或加密 token。
|
|
120
|
-
- 不支持 RP-Initiated、front-channel 或 back-channel logout。
|
|
121
|
-
- 进程重启会丢失内存中的待登录状态,且该状态不跨集群共享。
|
|
122
|
-
- Discovery 在进程生命周期内缓存;紧急 endpoint 变更需要重启。
|
|
123
|
-
- Native 后端安全性取决于宿主 `enterpriseAccounts` 实现。
|
|
124
|
-
- Key Binding v1 没有远程凭据撤销操作。
|
|
125
|
-
- 依赖完整性依靠 npm lockfile 和发布控制;仓库不 vendor DSH/pi-ai 源码。
|
|
126
|
-
|
|
127
|
-
## 部署安全审查清单
|
|
128
|
-
|
|
129
|
-
- [ ] 精确 issuer、client ID、redirect URI 和 audience 已获批准。
|
|
130
|
-
- [ ] OIDC 符合性和反向测试通过。
|
|
131
|
-
- [ ] Key Binding scope 和授权已测试跨用户/跨 tenant 访问。
|
|
132
|
-
- [ ] Provider/Key 不匹配和旧 Key 撤销已测试。
|
|
133
|
-
- [ ] Credential Provider 拓扑符合单用户或隔离多用户要求。
|
|
134
|
-
- [ ] 反向代理和 CSP 已审查。
|
|
135
|
-
- [ ] 应用、代理、APM 和崩溃日志中没有秘密。
|
|
136
|
-
- [ ] 出口策略会阻断意外的私有/metadata 目标。
|
|
137
|
-
- [ ] 依赖 lockfile、安装脚本和许可证已审查。
|
|
138
|
-
- [ ] 事故响应联系人和远程凭据撤销流程已记录。
|
|
16
|
+
仅身份模式、Token 模型模式及两种网关的配置边界见[Profile](enterprise-profile.md)与[协议说明](gateway-auth/README.md)。本机 Web 不可作为多人共享服务。
|