如何在没有授权人的情况下通过 API Gateway 使 AWS Cognito 用户数据可供 Lambda 使用?

Posted

技术标签:

【中文标题】如何在没有授权人的情况下通过 API Gateway 使 AWS Cognito 用户数据可供 Lambda 使用?【英文标题】:How to make AWS Cognito User Data available to Lambda via API Gateway, without an Authorizer? 【发布时间】:2020-04-24 06:38:32 【问题描述】:

我有一个使用 AWS Cognito(通过 Amplify)进行用户登录的网站。 API 位于使用无服务器部署的单独堆栈上。

我正在尝试拥有一个 API 端点,该端点可以访问当前登录用户的 Cognito 用户池数据(用户名、电子邮件)如果可用。我能够实现这一点的唯一方法是通过 API Gateway 使用 cognito 用户池授权方。

例子:

functions:
  getMe:
    handler: /endpoints/myService.get
    events:
      - http:
          path: /myService
          method: GET
          cors: true
          authorizer:
            type: COGNITO_USER_POOLS
            authorizerId: $self:custom.apiGatewayAuthorizerId.$self:custom.stage

其中 authorizerId 设置为在 AWS 控制台的 API Gateway Authorizers 页面上找到的 6 个字符的 Authorizer ID。但是,这会阻止所有未经 Cognito 身份验证的流量。这不是我想要的,因为我有许多服务应该可供匿名用户和登录用户访问。我只想为已登录的用户个性化数据。

有没有办法允许流量并通过 API 网关将 cognito 用户参数传递给 Lambda如果它们可用

我能找到的关于 Cognito + API Gateway + Lambda 的所有资源都专门关于限制访问端点,而不是对请求的数据进行分层......

【问题讨论】:

你研究过认知触发器吗?docs.aws.amazon.com/cognito/latest/developerguide/… @ImranArshad 不幸的是,这些是用户与 Cognito 系统交互时发生的用户池触发器。我正在寻找一种将登录用户的 Cognito 用户数据传递给 Lambda如果用户已登录,而不限制匿名用户访问该 Lambda 的方法。 【参考方案1】:

基于上面的 cmets,您希望匿名用户和登录用户通过相同的网关端点吗?

您仍然可以使用相同的设置,但从 API Gateway 中删除身份验证并在您的应用程序中获取逻辑。

如果用户在登录时尝试访问您的服务,AWS amplify 将通过带有 Id 令牌的 Authorization 标头将其发送到 API Gateway,API Gateway 将按原样将此标头传递给应用程序。您必须在应用程序内部检查此 Authorization 标头并破解通过的打开 Id 令牌以查找用户声明/属性并执行您的逻辑。对于没有此令牌的任何其他用户,都可以被视为匿名用户。

如果您在请求中找到令牌,您仍然需要验证令牌,以确保它是有效令牌并在之后提取声明/属性。

【讨论】:

以上是关于如何在没有授权人的情况下通过 API Gateway 使 AWS Cognito 用户数据可供 Lambda 使用?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不经过注册用户身份验证的情况下保护公共API请求

在没有用户名和密码的情况下授权 Salesforce REST API

微服务如何在异步通信中做授权?

在未经授权的情况下调用 RESTful api 时遇到问题?

如何在没有登录页面的情况下将 Keycloak 与 Spring Boot(API) 集成

如何在没有用户交互的情况下使用 GMail API 创建草稿