如何在没有授权人的情况下通过 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 使用?的主要内容,如果未能解决你的问题,请参考以下文章
在没有用户名和密码的情况下授权 Salesforce REST API
在未经授权的情况下调用 RESTful api 时遇到问题?