概述
Token Exchange(令牌交換)是基於 RFC 8693 標準協議的身份認證與授權機制,允許用戶端使用一個現有的安全性權杖(subject_token)向授權伺服器換取一個新的安全性權杖。該功能適用於需要身份傳遞、委託授權及最小許可權訪問的情境。
本文檔介紹如何在 IDaaS 中配置和使用 Token Exchange 功能。如需瞭解 Token Exchange 的更多概念性內容(如技術原理、應用情境等),請參閱什麼是 Token Exchange。
前提條件
已完成 Agent 身份安全配置,詳細配置可參考Agent 身份安全配置指導。
Token Exchange 在 Agent 身份安全配置中的 Agent 應用上預設開啟,無需單獨配置。
使用限制
限制項 | 說明 |
令牌簽發限制 | IDaaS 授權伺服器僅接受自身簽發的令牌進行交換 |
許可權限制 | 用戶端需具備目標受眾和許可權範圍的授權 |
令牌狀態限制 | 主體令牌必須在有效期間內且能被正確驗證 |
交換次數限制 | 令牌僅支援有限次數的交換,防止無限迴圈授權 |
令牌類型限制 | 當前僅支援 Access Token 之間的交換 |
操作步驟
步驟一:擷取初始存取權杖
在發起令牌交換之前,您需要先擷取一個有效主體令牌(subject_token)。可通過 OAuth 2.0 授權碼模式擷取。
步驟二:發起令牌交換請求
向 IDaaS 授權伺服器的令牌端點發起 POST 請求,交換新的存取權杖。
請求端點
POST https://{domain}/api/v2/iauths_system/oauth2/token其中 {domain} 為您的 IDaaS 執行個體訪問網域名稱。
請求參數
參數 | 類型 | 是否必需 | 樣本值 | 說明 |
grant_type | String | 是 |
| 固定值 |
subject_token | String | 是 |
| 代表主體身份的安全性權杖 |
subject_token_type | String | 是 |
| 主體令牌類型標識 |
requested_token_type | String | 否 |
| 請求的令牌類型標識,預設為 |
scope | String | 是 |
| 許可權範圍,格式: |
audience | String | 否 |
| 目標服務的邏輯標識,需與 scope 中的 audience 保持一致 |
client_id | String | 是 |
| 用戶端識別碼 |
client_secret | String | 是 |
| 用戶端密鑰 |
請求樣本
curl --location --request POST 'https://{domain}/api/v2/iauths_system/oauth2/token' \
--data-urlencode 'grant_type=urn:ietf:params:oauth:grant-type:token-exchange' \
--data-urlencode 'subject_token={subject_token}' \
--data-urlencode 'subject_token_type=urn:ietf:params:oauth:token-type:access_token' \
--data-urlencode 'requested_token_type=urn:ietf:params:oauth:token-type:access_token' \
--data-urlencode 'scope={audience}|{scope}' \
--data-urlencode 'audience={audience}' \
--data-urlencode 'client_id={client_id}' \
--data-urlencode 'client_secret={client_secret}'成功響應
{
"access_token": "eyJraWQiOiJBVVRIU0tFWVNYNDZ4bmRLN0RMdmM3NUx5Y0NuYkVFczFWTExQb2tzIiwiYWxnIjoiUlMyNTxxxx...",
"issued_token_type": "urn:ietf:params:oauth:token-type:access_token",
"token_type": "Bearer",
"expires_in": 3600,
"expires_at": 1772605468,
"scope": "user:read"
}響應參數說明
參數 | 類型 | 說明 |
access_token | String | 新頒發的存取權杖 |
issued_token_type | String | 頒發的令牌類型 |
token_type | String | 令牌類型,固定為 Bearer |
expires_in | Integer | 令牌有效期間,單位:秒 |
expires_at | Integer | 令牌失效時間戳記 |
scope | String | 令牌的許可權範圍 |
錯誤碼
HTTP 狀態代碼 | 錯誤碼 | 說明 | 解決方案 |
400 | invalid_grant | gant_type 不正確 | 檢查gant_type 是否正確 |
400 | invalid_request | 請求參數缺失或格式錯誤,主體令牌無效 | 檢查請求參數是否完整且格式正確,主體令牌是否有效 |
400 | invalid_target | 目標受眾或許可權範圍不合法 | 檢查 audience 和 scope 參數是否符合規範 |
401 | unauthorized_client | 用戶端未授權 | 檢查 client_id 和 client_secret 是否正確 |
步驟三:使用新令牌訪問資源
使用交換後的新令牌訪問目標資源服務。
curl --location --request GET 'https://{resource_server}/api/protected-resource' \
--header 'Authorization: Bearer {access_token}'其中:
{resource_server}:目標資源服務的訪問網域名稱{access_token}:步驟二中擷取的新存取權杖
典型應用情境
Agent 身份安全情境
在企業 Agent 服務整合情境中,Token Exchange 可實現安全的身份傳遞和委託授權。
情境描述
某企業部署了差旅規劃助手 Agent 和人力資源 MCP 服務。當員工通過差旅系統訪問 Agent 規划行程時,差旅規劃助手需要訪問人力資源 MCP 服務以擷取員工的職級資訊和差旅預算等資料。
服務節點對應關係
令牌交換工作流程 | Agent 身份安全情境 |
前端服務(Front Service) | 差旅系統 |
資原始伺服器 A | 差旅規劃助手 Agent |
資原始伺服器 B | 人力資源 MCP 服務 |
授權伺服器 | IDaaS 授權伺服器 |
優勢
安全地將授權傳遞到人力資源 MCP 服務
保留業務操作的主體身份資訊(員工),無需二次認證授權
完整的授權傳遞鏈路,便於溯源和審計
審計與溯源
控制台審計日誌
在 IDaaS 控制台日誌模組的調用日誌中,無論令牌交換請求是否成功,都會記錄一條事件類型為"Token 交換"的日誌。日誌中會記錄:
令牌交換的用戶端
賬戶(主體)
主體令牌等核心要素資訊
令牌內省能力
IDaaS 令牌交換所頒發的令牌為 JWT 格式,本身具備內省能力。IDaaS 授權伺服器在實現令牌交換能力時會自訂一個聲明 _idaas_imp 來記錄令牌交換的鏈路。
令牌 Payload 樣本
{
"sub": "user_xxxxxxxxxxxxxxxxxxxx",
"scope": "user:read",
"jti": "AT_03",
"iss": "https://{domain}/api/v2/iauths_system/oauth2",
"iat": 1772604268,
"nbf": 1772604268,
"exp": 1772605468,
"aud": "mcp-server",
"client_id": "app_03",
"_idaas_iid": "idaas_xxxxxxxxxxxxxxxxxxxx",
"_idaas_tag": "user-auth",
"_idaas_imp": {
"jti": "AT_02",
"client_id": "app_02",
"_idaas_imp": {
"jti": "AT_01",
"client_id": "app_01"
}
}
}欄位說明
欄位 | 說明 |
AT_03 和 app_03 | 本次令牌交換頒發的令牌 ID 和發起用戶端識別碼 |
AT_02 和 app_02 | 本次交換使用的主體令牌的 ID 和用戶端識別碼 |
AT_01 和 app_01 | 歷史前一次交換的主體令牌 ID 和用戶端識別碼 |