在 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 授权方,返回 AllowDeny 策略就是您要查找的内容。

这实质上授予 API Gateway 调用底层目标的权限。我知道乍一看这听起来很奇怪,但这就是它的工作原理。将Allow 策略视为true 返回语句(凭据匹配)之类的东西,而Deny 策略更像是false 返回语句(凭据不匹配/根据您的规则没有足够的权限等)。

为了让您摆脱困境,您可以简单地复制/粘贴docs 上可用的代码并根据自己的喜好修改身份验证方式(文档显示了一个使用带有AllowDeny 值的标头的示例,这绝对不是你想要的,这只是为了举例)。

所以,通过列举所有答案回到你的问题:

    是的,但它被称为 Lambda 授权方而不是 Lambda 网关 AllowDeny 策略分别用于有效/无效令牌。 如果 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 密钥的情况下使用使用计划吗?

从AWS API-Gateway中找出lambda名称

在 Cloudformation 模板中为 AWS API Gateway 使用 IAM 角色

在 AWS 中运行 spring boot 应用程序并且只允许通过 AWS API Gateway 访问