如何解決 AWS STS AssumeRoleWithWebIdentity API 呼叫「InvalidIdentityToken」錯誤?

2 分的閱讀內容
0

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-cacheCache-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 限流或「速率超出」錯誤?

AWS 官方
AWS 官方已更新 1 年前