Hash Web Token (HWT)

正式文件 議題 討論

無狀態的網路原生 token 協定,用於跨網域委派。

Token 由發行端來源簽署,任何能連接到 issuer(發行方)網域的一方均可驗證,並以明文或引用方式攜帶授權上下文。

狀態: 草案 v0.7。


HWT 的功能

HWT 不涵蓋的事項


Token 格式

hwt.signature.key-id.expires-unix-seconds.format.payload

六個以點分隔的欄位。點是欄位分隔符,不得出現在 key-idformat 或頂層名稱中。

format 宣告 codec。j(JSON)是唯一必要的 codec。額外的社群 codec 記錄於 CONVENTIONS.md。

到期時間是結構性的 — 超過 expires 值的 token 無條件無效,無論簽章是否有效。


委派鏈範例

三跳:身份提供者的使用者 → 編排代理人 → 工作服務 → 最終 API 目標。

根 token(由使用者持有,由 auth.example.com 發行):

{
  "iss": "https://auth.example.com",
  "sub": "user:4503599627370495",
  "tid": "root-a1b2",
  "authz": { "scheme": "RBAC/1.0.2", "roles": ["editor"] }
}

中間 token(由 agent.example.com 為工作服務發行):

{
  "iss": "https://agent.example.com",
  "sub": "svc:orchestrator",
  "aud": "https://worker.example.com",
  "tid": "mid-c3d4",
  "authz": { "scheme": "RBAC/1.0.2", "roles": ["editor"] },
  "del": [
    { "iss": "https://auth.example.com", "sub": "user:4503599627370495", "tid": "root-a1b2" }
  ]
}

最終衍生 token(由 worker.example.com 為目標 API 發行):

{
  "iss": "https://worker.example.com",
  "sub": "svc:worker",
  "aud": "https://api.target.example.com",
  "tid": "final-e5f6",
  "authz": { "scheme": "RBAC/1.0.2", "roles": ["editor"] },
  "del": [
    { "iss": "https://auth.example.com", "sub": "user:4503599627370495", "tid": "root-a1b2" },
    { "iss": "https://agent.example.com", "sub": "svc:orchestrator", "tid": "mid-c3d4" }
  ]
}

目標 API 以 worker.example.com 公開的金鑰驗證最終 token 的簽章,確認 del 鏈在結構上完整(由外層簽章涵蓋),並可將完整授權溯源追溯至原始使用者。授權在任何跳轉中均未提升 — 全程保持 roles: ["editor"]


金鑰探索

GET https://{issuer-domain}/.well-known/hwt-keys.json

JWKS 格式(RFC 7517)。每個金鑰的 alg 為必填。支援多個並行金鑰以進行輪換。

來源元資料

GET https://{issuer-domain}/.well-known/hwt.json

宣告 issuer URL、協定版本、支援的 authz schema、受眾設定、委派深度限制及端點 URL。


信任模型

信任錨點是 issuer 的網域,而非中央機構。驗證依賴 DNS 正確解析與 TLS 連接至 issuer 的 well-known 端點。建議的正式環境做法是預先註冊 issuer allowlist — verifier 拒絕不在清單中的 issuer 所發行的 token,將 key discovery 轉換為本地快取查詢,無需執行時 DNS 依賴。


文件

實作

參考程式庫

示例


授權條款

Apache License 2.0