如何解决 AWS STS AssumeRoleWithWebIdentity API 调用错误“InvalidIdentityToken”?
上次更新日期:2022 年 5 月 18 日
AWS Security Token Service(AWS STS)API 调用 AssumeRoleWithWebIdentity 失败,错误类似于以下内容:
“An error occurred (InvalidIdentityToken) when calling the AssumeRoleWithWebIdentity operation.Couldn't retrieve verification key from your identity provider.(调用 AssumeRoleWithWebIdentity 操作时出错(InvalidIdentityToken)。无法从您的身份提供商处检索验证密钥。)”
简短描述
在以下情况下,可能会发生此错误:
- 无法从公共互联网访问身份提供商(IdP)的 .well_known URL 和 jwks_uri。
- 自定义防火墙正在阻止请求。
- IdP 发出的到达 AWS STS 终端节点的 API 请求延迟超过 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 中的错误重试和指数回退。