实现首轮协议与 Transit 签名 PoC #1

Merged
panxiao81 merged 3 commits from feat/initial-poc into main 2026-09-11 16:51:40 +00:00
Owner

内容

  • 实现 RFC 8693 最小请求解析及 client_id 约束
  • 使用 chi 建立固定 HTTP 路由骨架
  • 接入 OpenTelemetry trace/metric provider 与 otelhttp
  • 实现 RS256 JWT issuer
  • 实现 OpenBao Transit signer 与 JWKS 发布数据生成
  • 增加单元测试和真实 Transit 集成测试入口

验证

  • go test ./...
  • go vet ./...
  • git diff --check
  • OpenBao v2.6.1 Transit RS256 签名经发布 JWKS 和 go-jose 验签通过

边界

本 PR 是协议与签名 PoC,不包含可运行服务、Kubernetes TokenReview、策略数据库、CEL 或 OpenBao JWT auth 登录。

## 内容 - 实现 RFC 8693 最小请求解析及 client_id 约束 - 使用 chi 建立固定 HTTP 路由骨架 - 接入 OpenTelemetry trace/metric provider 与 otelhttp - 实现 RS256 JWT issuer - 实现 OpenBao Transit signer 与 JWKS 发布数据生成 - 增加单元测试和真实 Transit 集成测试入口 ## 验证 - go test ./... - go vet ./... - git diff --check - OpenBao v2.6.1 Transit RS256 签名经发布 JWKS 和 go-jose 验签通过 ## 边界 本 PR 是协议与签名 PoC,不包含可运行服务、Kubernetes TokenReview、策略数据库、CEL 或 OpenBao JWT auth 登录。
panxiao81 added 1 commit 2026-09-11 15:54:47 +00:00
@@ -0,0 +65,4 @@
return ExchangeRequest{}, requestError("invalid_scope", "scope is required")
}
for _, unsupported := range []string{"resource", "actor_token", "actor_token_type"} {
if form.Has(unsupported) {
Author
Owner

除非标准中明确规定需要返回错误,否则直接忽略就好了

除非标准中明确规定需要返回错误,否则直接忽略就好了
Author
Owner

已处理:未知扩展参数按 RFC 6749 忽略;resource 和 actor_token 是 RFC 8693 已定义参数,resource 改为 invalid_target,actor_token 因 RFC 要求验证而在 v1 返回 invalid_request,并补充测试。

已处理:未知扩展参数按 RFC 6749 忽略;resource 和 actor_token 是 RFC 8693 已定义参数,resource 改为 invalid_target,actor_token 因 RFC 要求验证而在 v1 返回 invalid_request,并补充测试。
panxiao81 marked this conversation as resolved
@@ -0,0 +1,97 @@
package signing
Author
Owner

等会你整个文件在用标准库重新实现JWT库?

等会你整个文件在用标准库重新实现JWT库?
Author
Owner

已处理:JWT protected header、JWS signing input 和 compact serialization 已改由 go-jose OpaqueSigner 完成,不再自行实现 JWT/JWS 编码。

已处理:JWT protected header、JWS signing input 和 compact serialization 已改由 go-jose OpaqueSigner 完成,不再自行实现 JWT/JWS 编码。
panxiao81 marked this conversation as resolved
@@ -0,0 +37,4 @@
router.Get("/healthz", endpoints.Health.ServeHTTP)
router.Get("/readyz", endpoints.Ready.ServeHTTP)
options := make([]otelhttp.Option, 0, 3)
Author
Owner

otel应该作为可选引入,不强制安装

otel应该作为可选引入,不强制安装
Author
Owner

已处理:纯 chi router 已移除 otelhttp 依赖路径;OTel 现在是启动层显式选择的独立 wrapper,未启用时不安装 instrumentation。

已处理:纯 chi router 已移除 otelhttp 依赖路径;OTel 现在是启动层显式选择的独立 wrapper,未启用时不安装 instrumentation。
panxiao81 marked this conversation as resolved
panxiao81 added 1 commit 2026-09-11 16:10:57 +00:00
@@ -0,0 +35,4 @@
type Issuer struct {
signer RS256Signer
now func() time.Time
Author
Owner

何意味?这个还有替换的可能吗

何意味?这个还有替换的可能吗
Author
Owner

已处理:移除了用于测试替换时间的 Issuer.now 字段。Issuer 现在固定持有 issuer/TTL,公开 Issue 使用当前时间,测试通过内部 issueAt 固定时间。

已处理:移除了用于测试替换时间的 Issuer.now 字段。Issuer 现在固定持有 issuer/TTL,公开 Issue 使用当前时间,测试通过内部 issueAt 固定时间。
panxiao81 marked this conversation as resolved
@@ -0,0 +63,4 @@
return "", fmt.Errorf("encode claims: %w", err)
}
opaque := &contextSigner{ctx: ctx, signer: i.signer, key: key}
Author
Owner

这部分是?

这部分是?
Author
Owner

已处理:删除了为 go-jose OpaqueSigner 捕获 context 的 contextSigner。JOSE 编码是纯本地计算,context 现在只传给 Transit RPC。

已处理:删除了为 go-jose OpaqueSigner 捕获 context 的 contextSigner。JOSE 编码是纯本地计算,context 现在只传给 Transit RPC。
panxiao81 marked this conversation as resolved
@@ -0,0 +45,4 @@
return &Issuer{signer: signer, now: time.Now}, nil
}
func (i *Issuer) Sign(ctx context.Context, claims Claims) (string, error) {
Author
Owner

流程看上去对,但代码太面条了,说不定这里建模是有问题的

流程看上去对,但代码太面条了,说不定这里建模是有问题的
Author
Owner

已处理:流程重构为本地 encode → Transit.Sign(ctx) → 本地 compact;调用方改为 IssueRequest,issuer 统一生成时效 claims,职责和控制流已拆开。

已处理:流程重构为本地 encode → Transit.Sign(ctx) → 本地 compact;调用方改为 IssueRequest,issuer 统一生成时效 claims,职责和控制流已拆开。
panxiao81 marked this conversation as resolved
@@ -0,0 +1,185 @@
package signing
Author
Owner

整个文件大概看了一眼问题跟jwt.go差不多

整个文件大概看了一眼问题跟jwt.go差不多
Author
Owner

已处理:Transit metadata 改为类型化 mapstructure 解码,key metadata 读取、签名响应解析和 JWKS 转换已拆分;并通过真实 OpenBao v2.6.1 集成测试。

已处理:Transit metadata 改为类型化 mapstructure 解码,key metadata 读取、签名响应解析和 JWKS 转换已拆分;并通过真实 OpenBao v2.6.1 集成测试。
panxiao81 marked this conversation as resolved
panxiao81 added 1 commit 2026-09-11 16:45:52 +00:00
panxiao81 merged commit 73dcebc533 into main 2026-09-11 16:51:40 +00:00
This repo is archived. You cannot comment on pull requests.
No Reviewers
No labels
1 Participants
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: panxiao81/workload-sts#1