AWS Security Token Service (AWS STS) API 调用 AssumeRoleWithWebIdentity 失败,出现“InvalidIdentityToken”错误。
简短描述
如果您的 AssumeRoleWithWebIdentity API 调用失败,那么您可能会收到一条类似于以下消息的错误:
“调用 AssumeRoleWithWebIdentity 操作时出错 (InvalidIdentityToken)。无法从您的身份提供者处检索验证密钥。”
此错误可能发生在以下情况下:
- 无法通过公共互联网访问身份提供者 (IdP) 的 .well_known URL 和 jwks_uri。
- 自定义防火墙阻止了相应请求。
- API 请求从 IdP 到达 AWS STS 端点时的延迟超过 5 秒。
- STS 向 IdP 的 .well_known URL 或 jwks_uri 发出的请求数量过多。
**注意:**由于此问题是在客户端出现的,因此 AWS CloudTrail 事件历史记录不会记录此错误。
解决方法
验证 .well_known 和 jwks_uri 的公共访问权限
验证 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 状态码。
检查防火墙设置
如果无法访问 IdP 的 .well_known URL 和 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 Key Set (JWKS) 设置了 Pragma: no-cache 或 Cache-Control: no-cache 响应标头,则 STS 不会缓存您的 JWKS。对于在 ID_TOKEN 中引用但不在缓存中的密钥,STS 会执行回调。在这种情况下,STS 可能会对您的 .well_known URL 和 jwks_uri 发出过多请求。
因此,为了减少来自 STS 的回调,请确认您的 JWKS 未设置其中任何一个响应标头。这样,STS 就会缓存您的 JWKS。
相关信息
欢迎使用 AWS Security Token Service API 参考
如何解决 IAM 和 AWS STS 的 API 节流或“超出速率”错误?