使用 Lambda 授权方的 AWS Cognito 和 API 网关

Posted

技术标签:

【中文标题】使用 Lambda 授权方的 AWS Cognito 和 API 网关【英文标题】:AWS Cognito and API gateway using Lambda authorizer 【发布时间】:2019-11-18 14:22:43 【问题描述】:

我正在尝试使用 API 网关和 Lambda 函数创建 API。

基于用户组(而不是 Cognito 用户组),我想提供对单独 DynamoDB 表的访问权限。

我遵循的方法是,我为每组用户创建一个单独的 Cognito 用户池。

当用户登录时,他会通过相应的用户池进行身份验证。

为了调用后续的 API,我打算使用 Lambda 授权器。

用户将在 HTTP 标头请求中传递 ID 令牌,我想验证此 ID 令牌。

这是正确的方法吗?或者是否有更好的方法来实现此工作流程。

我们可以利用 Cognito 用户组吗?这会是一种安全的方法吗?

我想将一个用户组的表与另一个用户组的表严格分开。

我发现了以下链接,以验证 ID 令牌。

https://github.com/awslabs/aws-support-tools/blob/master/Cognito/decode-verify-jwt/decode-verify-jwt.js

【问题讨论】:

【参考方案1】:

AWS 提供了一些经过验证的架构和工具来简化上述用例。

上述用例不需要多个用户池。这可以通过单个用户池本身来处理。

一个简单的架构可以是UI->API网关->Lambda->DynamoDB

可以将 Cognito 用户池中的用户添加到组中并使用 IAM 策略进行设置。然后可以为 IAM 或 cognito 授权者配置 API 网关。每个用于访问不同 DynamoDb 表的 Lambda 都可以在 API 层进行授权。

在这种情况下不需要自定义授权人。

使用 AWS Amplify 进行用户身份验证和所有其他通信。 Amplify 将使用编写的任何额外代码自行处理令牌传递部分。在这种方法中,JWT 令牌可以在客户端 UI 层以及服务器代码 (lambda) 中被读取/验证和逻辑使用。 API网关默认使用相同的令牌进行授权(无需编写任何代码)。

Cognito 用户池和身份池是企业级 AWS 解决方案,AWS Amplify 补充了 Sigv4、SRP 等协议的高度安全实施,这些协议使用自定义代码实施起来非常困难和复杂。

【讨论】:

谢谢罗宾。我会尝试这种方法。就我而言,我正在构建一个多租户解决方案。因此,同一个电子邮件 ID(用户)可以是多个组的一部分。所以我不确定这种方法将如何工作。由于用户池对于所有组都是通用的,因此 Cognito 不允许我添加用户两次。此外,我目前没有使用 Amplify 进行 UI 开发。 对于多租户应用,请使用单独的用户池。请确保您在 DynamoDB 中有效地使用组织 ID 作为分区键 aws.amazon.com/blogs/database/… 谢谢。我正在为每个租户创建单独的用户池和表。

以上是关于使用 Lambda 授权方的 AWS Cognito 和 API 网关的主要内容,如果未能解决你的问题,请参考以下文章

如何让我的 Auth0 权限进入 AWS HTTP API Jwt 授权方的访问令牌的范围声明?

如何从 lambda 调用 IAM 授权的 AWS ApiGateway 端点?

AWS ApiGateway Lambda 代理访问授权者

使用无服务器框架的 lambda AWS 中的授权代码授予

在 API Gateway 中使用 AWS Lambda 授权方

如何在自定义授权方 AWS lambda 函数中访问 http 标头