我已经配置了一个 REST API 网关,它通过 Lambda 集成提供服务。此 API 由 AWS Lambda 授权程序保护,该授权程序验证作为请求中标头传递的 JWT 令牌是否有效。这意味着,只有拥有有效 JWT 令牌的注册用户才能调用此 API。然而,除了用户->API之外,我们还需要提供系统->API通信,这种通信不应该依赖于“系统用户”来调用API。
到目前为止,我已将 API 网关中的所有资源配置为使用 Lambda Authorizer 函数作为授权方法,这实现了用户 -> API 通信流程。
对于系统->API 通信,我正在考虑允许通过 IAM 角色进行通信。这个想法是系统可以承担 AWS 角色并使用 AWS SigV4 签署 HTTP 请求。这样,我就能够使用 REST API 网关资源策略来允许或拒绝系统通过 AWS 策略访问 API(验证特定角色作为主体),但这需要绕过此用例的 lambda 授权。
AWS 文档并不清楚这种混合用例的选项。看来,对于通过资源策略进行 IAM 角色授权,我需要更改 API 网关资源配置以使用 AWS_IAM 作为身份验证方法而不是 LAMBDA。尽管文档甚至提到了将 API 资源策略和 Lambda Authorizer 结合起来的可能性,但它看起来仅适用于阻止不是来自特定 VPC 或 IP 范围的请求(链接)。
总而言之,我想要实现的目标是:
User's requests --(JWT)--> Lambda Authorizer ---|
(Identity via Oauth) |
|-> API Gateway
System's requests --(SigV4)--> Resource Policy --|
(Identity via IAM Role)
因此,我没有找到一种方法以独占的方式为我的两个单独的用例提供授权流程,我发现每个 API 网关资源端点只能有一个授权流程。
有谁知道使用 REST API 网关是否可以实现我的目标?如果没有,是否有其他替代方案来解决这个问题?
事实上,每个资源的每个方法只能有一个授权者,因此不可能完全按照您的要求去做。
您可以做的是创建和维护两个具有相同资源、方法和集成集但授权者不同的 API 网关:一个用于您的用户,另一个用于系统。
另一种选择是维护您自己的 API 密钥集(不是网关附带的密钥,而是自我管理的密钥,例如 DynamoDB 中的记录或类似内容)并在自定义授权方中检查 JWT或这些密钥。
这将需要额外的工作:您必须弄清楚如何创建、存储、分发、检查和撤销这些密钥,因此绝对比仅使用 AWS 控制台创建角色并由您的服务承担它更困难。
验证某些角色的 V4 签名的服务是一个常见的问题,如果 AWS 提供了该服务,它将帮助您解决问题。