了解 OAuth/OIDC 中的令牌交換
令牌交換是 OAuth 的一個擴展,允許受信任的客戶端在不需要用戶互動的情況下獲得新令牌,這在模擬、自動化、跨系統集成和令牌遷移的各種場景中非常有用。
令牌交換是 OAuth 的一個擴展,允許受信任的客戶端在不需要用戶互動的情況下獲得新令牌,這在模擬、自動化、跨系統集成和令牌遷移的各種場景中非常有用。
在 RFC 8693 中引入,令牌交換是允許受信任的客戶端交換現有令牌以獲得具有不同屬性或範圍的新令牌的一種 OAuth 擴展。這個機制對於服務、應用程序或終端用戶來說特別有用,可以通過預先授權的令牌獲取正常的 OAuth 訪問令牌,而無需經過完整的 OAuth 流程。
首先,我們來看看 OAuth 授權碼流程,這是獲取訪問令牌的最常見流程。
這是令牌交換流程:
主要的區別在於,在授權碼流程中,客戶端應用程序將用戶重定向到授權伺服器以獲取訪問令牌。而在令牌交換中,客戶端應用程序可以在不涉及用戶重定向的情況下與授權伺服器交換令牌。
這是因為在授權碼流程中,客戶端應用程序不是“受信任的”,需要知道用戶的憑證才能獲得訪問令牌。而在令牌交換中,客戶端應用程序被信任已經從用戶那裡獲得了令牌,並且授權伺服器將驗證令牌並簽發新令牌。
在令牌交換流程中,“Auth Server” 現在有兩個參與者:
令牌交換服務與授權碼流程中的“Auth Server”相同,而令牌發行者可以是第三方身份提供者,或從“Auth Server”分割為一個專門的服務。
令牌交換流程可以在不需要用戶互動的情況下進行,這在以下場景中很有用:
交換新訪問令牌是最常見的用例,我們將此作為示例。令牌交換不僅限於訪问令牌,還可以用於發行其他類型的令牌,如刷新令牌、ID 令牌等。
要執行令牌交換,需要在授權伺服器上註冊的客戶端應用程序。
而客戶端應用程序在啟動令牌交換流程之前必須擁有 subject_token,這個令牌通常由授權伺服器或受信任的第三方身份提供者授與。有了這個令牌,客戶端應用程序現在可以被“信任”來交換令牌,而無需用戶的憑證和交互。
客戶端向授權伺服器的令牌端點發送請求以交換現有令牌。這包括 subject_token(正在交換的令牌)以及可選的目標受眾、範圍和令牌類型。
grant_type: 必需。此參數的值必須是 urn:ietf:params:oauth:grant-type:token-exchange ,表示正在執行令牌交換。subject_token: 必需。用戶的 PAT。subject_token_type: 必需。subject_token 參數中提供的安全令牌類型。此參數的常見值是 urn:ietf:params:oauth:token-type:access_token,但可以根據交換的令牌而有所不同。resource: 可選。資源指標,有助於指定訪問令牌的目標資源。audience: 可選。訪問令牌的受眾,表示令牌的預期接收者,授權伺服器可能會使用 resource 的值,如果沒有指定 audience。scope: 可選。請求的範圍。此外,請求需要包括客戶端信息,可以編碼為基本身份驗證標頭或以表單數據的形式發送。
這是一個請求的示例: