在 API Gateway 中使用 AWS Lambda 授权方
Posted
技术标签:
【中文标题】在 API Gateway 中使用 AWS Lambda 授权方【英文标题】:Using AWS Lambda Authorizer in API Gateway 【发布时间】:2019-12-28 15:26:02 【问题描述】:我的 WEB API 托管在 Docker 中。我的 Angular 客户端将发送一个 JWT 令牌来访问这些 API 中的任何一个。在调用请求的 API 客户端之前,我想利用 AWS API Gateway 功能添加授权检查。从docs 我看到我们可以利用 Lambda Authorizer 概念来实现这一点。但话又说回来,当我想出一个可以验证用户的 DOT NET CORE API 时,为什么还要使用 Lambda Authorizer。
-
我的 Lambda 网关对我的案例有意义吗?
如果是这样,lambda Authorizer 的输出是什么?一个简单的真/假说明令牌是否有效?
我看到这就是响应应该/可能的样子。在我的情况下这应该如何转化为
"policyDocument":
"Version": "2012-10-17",
"Statement": [
"Action": "execute-api:Invoke",
"Resource": [
"arn:aws:execute-api:us-east-1:1234567:myapiId/staging/POST/*"
],
"Effect": "Allow"
]
,
"principalId": "Foo"
-
Lambda Authorizer 执行后 API 网关会发生什么?谁调用了客户端请求的我的实际 API?
【问题讨论】:
【参考方案1】:根据我对问题的理解,您想要验证调用您的 API 的用户。
您可以按照您已经提到的所有方式进行操作。 使用 Lambda Authorizers,您将获得 200 或 403 代码,而不是 true false。您可以按照以下链接设置您的授权人:
https://blog.codecentric.de/en/2018/04/aws-lambda-authorizer/
您还可以使用 AWS Cognito 来管理您的用户,它将大大简化您的工作。
【讨论】:
感谢您的回复。问题是我遇到的所有示例,包括您的示例(如果我没记错的话)正在返回策略以说明它应该调用哪个 AWS 资源 generatePolicy(principalId, 'Allow', event['methodArn'])。但是,在我成功的用户验证的情况下,它应该调用我的 dotnet core API【参考方案2】:如果您使用的是 Lambda 授权方,返回 Allow
或 Deny
策略就是您要查找的内容。
这实质上授予 API Gateway 调用底层目标的权限。我知道乍一看这听起来很奇怪,但这就是它的工作原理。将Allow
策略视为true
返回语句(凭据匹配)之类的东西,而Deny
策略更像是false
返回语句(凭据不匹配/根据您的规则没有足够的权限等)。
为了让您摆脱困境,您可以简单地复制/粘贴docs 上可用的代码并根据自己的喜好修改身份验证方式(文档显示了一个使用带有Allow
或Deny
值的标头的示例,这绝对不是你想要的,这只是为了举例)。
所以,通过列举所有答案回到你的问题:
-
是的,但它被称为 Lambda 授权方而不是 Lambda 网关
Allow
或 Deny
策略分别用于有效/无效令牌。
如果 Lambda 授权方以 Allow
策略响应,它将调用目标(可以是 Lambda 函数、SNS 主题、HTTP 端点 - 这很可能是您的情况 - 等等)。授权者将充当拦截器并决定是否代理对目标的调用。
【讨论】:
感谢您的详细解释。【参考方案3】:Amazon Cognito 可让您快速轻松地将用户注册、登录和访问控制添加到您的 Web 和移动应用程序。 Amazon Cognito 可扩展到数百万用户,并支持通过 SAML 2.0 使用社交身份提供商(例如 Facebook、Google 和 Amazon)以及企业身份提供商登录。
使用 Cognito 的优势: 托管服务,实现/监控/扩展的组件更少
通过门户、CLI 和模板轻松配置
支持多种身份验证流程(客户端、服务器端、OAuth2、自定义)
支持身份验证/注册事件上的 Lambda 触发函数
使用 JWT 签名令牌,可以在会话 cookie 中直接传递给客户端,并用于验证请求并传递相关 API 调用,因此可以通过无状态堆栈使用单个身份验证/授权方法 组成员身份,在访问令牌中提供可以用于授权(例如“Admin”组中的用户可以执行管理功能)
句柄:
用户组成员和属性存储
电子邮件/电话验证
用户邀请
登录/注册 UI 表单(可自定义)
密码重置
缺点:
对身份验证/授权的控制较少(仅限于 UI/流程自定义) 锁定的可能性(无法导出带有密码的用户进行迁移) Amazon Cognito 具有三种类型的授权人 Amazon Cognito 用户池 - 用户池授权方。 Amazon Cognito 联合身份 - AWS IAM 授权。 自定义 Lambda 身份提供程序 - 自定义 Autorizer【讨论】:
【参考方案4】:您只需将您的 dotnet core api 添加到“集成请求”选项卡,选择集成类型为 HTTP 并在 Endpoint URL 字段中提及 dotnet core api
【讨论】:
以上是关于在 API Gateway 中使用 AWS Lambda 授权方的主要内容,如果未能解决你的问题,请参考以下文章
在 API Gateway 中使用 AWS Lambda 授权方
使用 AWS API Gateway 进行 API 版本控制
在 AWS API Gateway 中,我可以在不附加 API 密钥的情况下使用使用计划吗?