AWS Security Token Service (AWS STS) API 呼叫 AssumeRoleWithWebIdentity 失敗,並顯示「InvalidIdentityToken」錯誤。
簡短說明
如果您的 AssumeRoleWithWebIdentity API 呼叫失敗,您可能會收到類似下列訊息的錯誤:
「呼叫 AssumeRoleWithWebIdentity 作業時發生錯誤 (InvalidIdentityToken)。無法從您的身分提供者擷取驗證金鑰。」
在下列情況下,可能會發生此錯誤:
- 無法從公用網際網路存取身分提供者 (IdP) 的 .well_known 網址和 jwks_uri。
- 自訂防火牆封鎖了請求。
- 從 IdP 發出的 API 請求,在到達 AWS STS 端點時延遲超過 5 秒。
- STS 對您的 .well_known 網址或 IdP 的 jwks_uri 發出太多請求。
**注意:**由於此問題發生在用戶端,AWS CloudTrail 事件歷史記錄不會記錄此錯誤。
解決方法
驗證 .well_known 和 jwks_uri 的公開存取權
請確認 IdP 的 .well_known 網址和 jwks_uri 是否可公開存取。這可利用您的瀏覽器、Windows 命令或 Linux 命令加以檢查。若要這樣做,請完成下列其中一個動作:
若要檢查存取權限,請在瀏覽器中瀏覽至下列連結:
- https://BASE_SERVER_URL/.well-known/openid-configuration
- https://BASE_SERVER_URL/.well-known/jwks.json
-或-
執行下列命令:
Windows:
wget https://BASE_SERVER_URL/.well-known/openid-configuration
wget https://BASE_SERVER_URL/.well-known/jwks.json
Linux:
curl https://BASE_SERVER_URL/.well-known/openid-configuration
curl https://BASE_SERVER_URL/.well-known/jwks.json
**注意:**若要確認您是否能夠存取連結,請檢查請求回應中的 200 狀態碼。
檢查防火牆設定
如果無法存取 IdP 的 .well_known 網址和 jwks_uri,請檢查防火牆設定。請確定網域不在拒絕清單中。
視防火牆目前組態而定,可能需要將網域加入允許清單。
如果無法存取防火牆設定,請搭配來自其他網路的裝置 (例如手機) 使用瀏覽器。若要檢查瀏覽器的存取權限,請使用步驟 1中的指示。如果 Web 請求成功,則防火牆會封鎖該請求。
如果進行 AssumeRoleWithWebIdentity API 呼叫的伺服器是 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體,請檢查組態設定。如需指示,請參閱為什麼我無法連線託管在我的 EC2 執行個體的網站?
檢查作業延遲
檢查總作業延遲時間。這包括下列屬性:
- 來自 STS 的請求/回應時間
- 來自 IdP 的請求/回應時間
將 STS 延遲降至最低
針對 STS 服務使用 AWS 區域端點,而非全域端點。這會驗證請求是否路由到地理位置最接近的伺服器,以將延遲降至最低。如需詳細資訊,請參閱撰寫程式碼以使用 AWS STS 區域。
**注意:**對於 AWS SDK,Region 參數會將請求的目標端點路由至 sts_regional_endpoint 組態內進行呼叫的位置。
評估 IdP 延遲
IdP 會向 STS 端點發出請求。若要檢查對 STS 端點的請求是否花費太長時間,請在 IdP 日誌中分析 IdP 的傳出封包。
**注意:**如果從 IdP 到 STS 端點的請求花費超過 5 秒,則請求可能會逾時並失敗。您可以聯絡您的身分提供者,請求提高地理可用性,以降低此 API 呼叫的延遲。
(選用) 使用指數退避並增加重試次數
AssumeRoleWithWebIdentity API 取決於從身分提供者 (IdP)擷取資訊。為避免限流錯誤,大多數 IdP 皆包含 API 限制,並且 API 呼叫可能無法從 IdP 取得所需的金鑰。若 API 發生間歇性問題而無法到達您的 IdP 時,為協助成功擔任角色,請執行以下步驟:
減少發送至 .well_known 和 jwks_uri 的 STS 請求
如果您的 JSON Web 金鑰集 (JWKS) 設置了 Pragma: no-cache 或 Cache-Control: no-cache 回應標頭,則 STS 不會快取您的 JWKS。對於 ID_TOKEN 中參照但不在快取中的金鑰,STS 會執行回呼。在這種情況下,STS 可能會向您的 .well_known 網址和 jwks_uri 發出過多請求。
因此,若要減少來自 STS 的回呼,請確認您的 JWKS 未設定上述任一個回應標頭。這會允許 STS 快取您的 JWKS。
相關資訊
歡迎使用 AWS Security Token Service API 參照
如何解決 IAM 和 AWS STS 的 API 限流或「速率超出」錯誤?