如何解決 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 的錯誤重試和指數退避。