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

上次更新日期:2022-05-18

AWS Security Token Service (AWS STS) API 呼叫 AssumeRoleWithWebIdentity 失敗,並出現類似下列內容的錯誤:

「呼叫 AssumeRoleWithWebIdentity 作業時發生錯誤 (InvalidIdentityToken)。無法從您的身分提供者擷取驗證金鑰。」

簡短描述

在下列情況下,可能會發生此錯誤:

  • 無法從公有網際網路存取身分識別提供者 (IdP) 的 .well_known URL 和 jwks_uri。
  • 自訂防火牆封鎖了請求。
  • 從 IdP 發出的 API 請求,在到達 AWS STS 端點時,延遲超過 5 秒。

備註:此錯誤不會記錄在 AWS CloudTrail 事件歷史記錄中,因為故障發生在客戶端。

解決方案

1.    確認身分識別提供者 (IdP) 的 .well_known URL 和 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」狀態碼,確認是否能夠存取連結。

2.    如果無法存取 IdP 的 .well_known URL 和 jwks_uri,請檢查防火牆設定以確認網域不在拒絕清單之中。

視防火牆目前的設定而定,可能需要把網域加入允許清單。

如果無法存取防火牆設定,請搭配來自其他網路的裝置 (例如手機) 使用瀏覽器。利用步驟 1 的說明檢查瀏覽器的存取權限。如果 Web 請求成功,這代表請求遭到防火牆封鎖。

如果進行 AssumeRoleWithWebIdentity API 呼叫的伺服器為 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體,請確定組態設定正確無誤。如需指示,請參閱為什麼我無法連線托管在我的 EC2 執行個體的網站?

3.    檢查總操作延遲。

操作的縂延遲包含:

  • 來自 STS 的請求/回應時間
  • 來自 IdP 的請求/回應時間

將 AWS STS 延遲降至最低

針對 AWS STS 服務使用區域端點而非全球端點。這會驗證是否經由地理位置最接近的伺服器進行路由,以使延遲降至最低。如需詳細資訊,請參閱撰寫程式碼來使用 AWS STS 區域

備註:對於 AWS SDK,請求目的地端點會由 AWS 區域參數進行路由,此區域參數會在 sts_regional_endpoint 設定中加以呼叫。

評估 IdP 延遲

IdP 負責向 STS 端點發出請求。IdP 的傳出封包必須在 IdP 記錄檔進行分析,檢查對於 STS 端點的請求是否花費太長時間。

備註:如果從 IdP 到 STS 端點的請求花費超過 5 秒,則請求可能會逾時並失敗。您可聯絡您的身分提供者,請求提高地理可用性,降低此 API 呼叫的延遲。

4.    (選用) 利用指數退避。

利用指數退避,在錯誤回應的重試之間逐漸加長等待時間。AssumeRoleWithWebIdentity API 取決於從身分識別提供者 (IdP) 擷取資訊。大多數 IdP 包含 API 限制以避免調節錯誤,並且 API 呼叫可能無法從 IdP 中獲得所需的權杖。導入最大延時間隔擊最大重試次數。如需詳細資訊,請參閱 AWS 的錯誤重試和指數退避


此文章是否有幫助?


您是否需要帳單或技術支援?