You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
TL;DR
aevatar 通过
NyxIdRemoteCapabilityBroker作为RFC 8693 客户端调 NyxID
POST /oauth/token,覆盖 ADR-0018 broker 模式所需的最小请求集。当前不是完整 RFC 8693 客户端实现,未来若要支撑跨服务委托链 / 跨 IdP 互通 /
受众约束等场景,需要按本帖清单补齐。
对侧 NyxID 服务端的同类讨论:
ChronoAIProject/NyxID#575
Context
agents/Aevatar.GAgents.Channel.Identity/Broker/NyxIdRemoteCapabilityBroker.cs:24-25—
grant_type/subject_token_type常量(
urn:nyxid:params:oauth:token-type:binding-id是私有 URI)NyxIdRemoteCapabilityBroker.cs:167-225—IssueShortLivedByBindingIdAsync,构造 form 调
/oauth/tokenNyxIdRemoteCapabilityBroker.cs:357-365—TokenResponse反序列化形状ADR-0018 的目标是"零长期用户 secret + 5 分钟短期 token",因此实现了
RFC 8693 的子集就够用;本帖不质疑这个目标,只是把 RFC 完整性差距
显式记录下来,避免未来误以为我们已经"完整实现 RFC 8693"。
现状摘要(实际发出的请求 / 反序列化的响应)
请求端发送的 form 字段(
NyxIdRemoteCapabilityBroker.cs:178-185):grant_typeurn:ietf:params:oauth:grant-type:token-exchangesubject_tokenbinding_id(NyxID 不透明指针)subject_token_typeurn:nyxid:params:oauth:token-type:binding-id(私有 URI)scopeactor_tokenactor_token_typerequested_token_typeaudienceresource客户端鉴权用 HTTP Basic(
ApplyClientSecretBasic,L316-321)。响应端反序列化的字段(
TokenResponseL357-365):access_token/id_token/binding_id/scope/token_type/expires_in。未声明
issued_token_type(RFC 8693 §2.2.1 必需字段被悄悄丢弃)。错误处理仅区分 HTTP 400 +
{"error":"invalid_grant"}→BindingRevokedException(L197-204);其他 OAuth error code 全部EnsureSuccessStatusCode()抛通用异常。Gaps(按 RFC 8693 章节对照)
§2.1 请求参数
actor_token/actor_token_type缺失:当前只能表达"主体(用户)同意客户端以自己身份调用",不能表达"A 在 actor B 的身份代理下行事"
这一 RFC 8693 §1.3
核心语义。一旦 aevatar 自己变成"代用户调下游服务(也用 NyxID 鉴权)"
的中介,就需要
actor_token来诚实传递 actor 身份,并让最终服务能审计真主与 actor。
requested_token_type缺失:现在只能拿access_token;如果未来场景需要拿
id_token(向其他 OIDC RP 出示)或jwt(自描述、跨域可验证),需要补此参数。
audience/resource缺失:当前签发的短期 token 没有受众限定,完全靠 NyxID 自己的 client / scope 边界来约束。一旦 token 被泄漏到
非预期的下游服务,没有
RFC 8707 /
RFC 8693 §2.1
的受众绑定可阻止误用。
§2.2.1 响应
issued_token_type不解析:TokenResponse字段表里没有这个字段;即使服务端按 RFC 写回,客户端也不会用。理由是当前调用点只关心
"我拿到一个 access_token",但若未来响应类型是动态的(例如
requested_token_type=jwt时拿urn:ietf:params:oauth:token-type:jwt),客户端必须读这个字段才能正确处理。
§2.2.2 错误处理
invalid_grant,对invalid_request/invalid_scope/invalid_target/unsupported_token_type等没有分类映射,失败时排障靠日志里的截断 body(
Truncate(body, 256))。Token type URI
urn:nyxid:...URI 作为subject_token_type:是 ADR-0018有意选择(明确表示"这是 NyxID broker binding,不是任何标准 token"),
但意味着客户端代码 不可移植到非 NyxID 的 RFC 8693 服务器。
已经"做对了"的部分
urn:ietf:params:oauth:grant-type:token-exchangegrant_type;client_secret_basic客户端认证;invalid_grant做了 ADR-0018 要求的 source-of-truth 同步(NyxID 主动 revoke → aevatar 事件化撤销本地 binding,详见 ADR-0018
Decision §第 4 条)。
Future Work(如果需要"完整 RFC 8693 客户端",按此顺序补)
按收益从高到低:
issued_token_type(成本低、立刻让客户端 RFC 兼容)。只需在
TokenResponse加一行字段并写到日志/审计上下文。IsInvalidGrant推广为TryParseOAuthError返回结构化OAuthError { code, description, uri },按 code 抛不同异常或返回
Result。audience/resource支持(中等成本,需要 ADR)。需要先在CapabilityScope上下文里建模"这个 token 给谁用",再在 NyxID 端实现audience 检查;客户端只是把参数透传过去。
requested_token_type支持(中等成本)。客户端要先有"我需要哪种token"的业务输入,再考虑实现。
actor_token链路(高成本,跨 ADR)。需要重新设计 aevatar 内部"actor 身份"的建模——目前 aevatar 不持有自己的 NyxID 身份做 actor,
要补这一层。优先级最低:除非出现"代用户调下游服务,且下游服务也用
NyxID"这个明确业务场景,否则不值得做。
subject_token_type:长期看,如果 NyxID 端把 brokerbinding 也用标准 URI(如
urn:ietf:params:oauth:token-type:jwt,把binding_id包成 JWT),客户端就能用标准 URI;这要 NyxID 先动。参考
Beta Was this translation helpful? Give feedback.
All reactions