【问题标题】:AWS api gateway and cognito integrationAWS api 网关和 cognito 集成
【发布时间】:2023-03-08 08:41:02
【问题描述】:

我正在创建一个 api,我只希望我的身份池中经过身份验证的用户可以访问它。 api 调用返回“hello world”的 lambda 函数。当我在我的 api 中未设置身份验证时,它工作正常,但是当我创建自定义授权方并将其设置为我的 api 的身份验证方法时,它返回 null。

This is the link I used to help create my custom authenticator

这是我做过的事情的清单:

  1. 我正在使用联邦身份,并确保我在 authorizer.js 中正确复制了身份池 ID 和区域。

  2. 我添加了 Authenticated 角色,在我的联合身份中设置,ARN 在创建我的自定义授权方时进入执行角色(不确定我是否应该这样做)。

  3. 在我的身份访问管理中,我将 AmazonAPIGatewayInvokeFullAccess 策略附加到 Cognito 授权角色。

  4. 当我没有传递任何标头并进行 api 调用时,我收到一条未经授权的消息。

  5. 当我在标头中传递一个假令牌并进行 api 调用时,我收到一条空消息。

  6. 当我在标头中传递 AWS 提供的令牌并进行 api 调用时,我收到一条空消息。

  7. 当我尝试在 AWS 中测试 api 调用时,我得到了 200 的返回状态和“Hello World”消息

有人知道问题是什么以及如何解决吗?

-更新-
这是我从链接中的 authorizer.js 文件修改的区域。

console.log('Loading function');

var jwt = require('jsonwebtoken'); 
var request = require('request'); 
var jwkToPem = require('jwk-to-pem');

var userPoolId = '{REPLACE_WITH_YOUR_POOL_ID}';
var region = '{REPLACE_WITH_YOUR_REGION}'; //e.g. us-east-1
var iss = 'https://cognito-idp.' + region + '.amazonaws.com/' + userPoolId;
var pems;

我唯一做的就是添加我的同源 userPoolId 和区域。

【问题讨论】:

  • 您希望人们如何在没有看到您的实际代码的情况下帮助您?
  • 如果您单击我发布的链接,请转到“为 Amazon Cognito 用户池开发自定义授权方”部分并查看第 1 步,它会告诉您下载包含我使用的确切代码的蓝图为授权人。我输入了我的 userPoolId 和区域。我使用“curl”命令通过终端拨打了其余电话。
  • 此处有关堆栈溢出的问题必须包括粘贴到问题中的相关代码,以便在此处考虑主题。外部链接有消失或改变的习惯,使问题无法作为长期参考。此外,我们需要在适当的上下文中查看您的代码,而不是在其上下文中查看一些示例代码。
  • 我应该如何复制 400 多行代码并正确格式化,以便它可以在代码标签中?我尝试了复制粘贴,但它无法正常工作。我在链接上使用了 99.9999999999999999999999999% 的示例代码。我所做的唯一修改是添加了来自 cognito 和 region 的 userPoolId,这是在其中一个步骤中指示的,我不打算向公众共享该信息。
  • 嗯,您确实需要学习如何在此站点中正确格式化代码才能有效地使用此站点。然后,直接从帮助页面:寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定问题或错误以及在问题本身中重现它所需的最短代码.没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建一个最小、完整和可验证的示例。您有责任弄清楚如何包含该信息。

标签: node.js amazon-web-services integration amazon-cognito aws-api-gateway


【解决方案1】:

API Gateway 最近推出了对 Cognito 用户池的第一方支持。您不必再使用 Lambda 设置自定义授权方。只需在 API Gateway 中设置一个用户池授权器并使用它来验证池中的用户。有关设置的详细信息,请参见 here

希望这会有所帮助, 丽缇莎。

【讨论】:

  • 当我尝试这个时,它说当我已经拥有联邦身份时,我需要创建一个认知用户池(我尚未创建)。我正在使用 Facebook 和 Google 等其他身份提供商来验证用户身份。如果我使用 Amazon cognito 创建自己的身份提供者,这看起来可能会起作用,但我正在尝试使用现有的身份提供者。有没有办法将此与联合身份结合起来?
【解决方案2】:

我才刚刚开始,所以我可能错了。

我认为在这种情况下,认识到 AWS 提供两种独立的服务这一事实很重要:

  1. 用户池--身份提供者
  2. 身份池--联合身份管理服务

重要的是,用户池可以用作身份池的身份提供者。

现在关于您的问题,您会注意到您引用的链接是用于为 用户池 设置自定义授权方。传递您从 Facebook 收到的令牌不适用于您拥有的代码。它需要是用于验证来自 Facebook 的令牌的代码。

如果您有兴趣将 API 网关与身份池一起使用,那么您需要使用身份池 sdk 生成一个临时访问令牌,然后该令牌可用于与您的端点进行交互。

您可以将端点的授权设置设置为使用AWS_IAM,而不是使用自定义授权者。

我认为您遇到的问题在很大程度上是由于亚马逊的营销和文档不佳造成的。在“Cognito”下对这两个服务(用户池和身份池)进行分类会使事情变得更加混乱,而不是将它们视为两个独立的服务。很多时候文档或营销会说 Cognito 可以做这个或那个,这使得不清楚哪个提供了哪个功能。将它们称为两个池只会让事情变得更糟。

更新: 一些详细介绍如何使用 API Gateway 和 Cognito 的资源:

【讨论】:

  • 我一直在研究 IAM,但没有运气。我在 IAM 中创建了一个身份提供程序,但是当用户登录时如何从中获取令牌?我正在使用 Auth0 提供的服务,从图中看起来它在用户登录时返回了一个 AWS 令牌,但是当您将此令牌传递给网关时,它只是拒绝它。我不确定如何在 IAM 中单独添加 Facebook 作为身份提供者(这就是我使用 Auth0 的原因),然后从 IAM 获取令牌以在 api 网关上使用。有什么想法吗?
  • 要仅使用 Facebook 作为提供者,您需要一个自定义授权者。我不确定 Auth0,但我知道他们有一些关于如何将它与 AWS 一起使用的详细演练。如果您确实想将 Cognito 身份池与 Facebook 一起用作身份提供者之一,那么您可以在您的 API Gateway 资源上使用 IAM 身份验证。
  • 我将在我的答案的编辑中发布一些链接,这些链接指向一些资源,这些资源很好地解释了如何使用 Cognito 进行设置。
  • 如果您决定使用 Facebook 作为身份提供者的 Cognito 身份池,您可能需要查看一些有关如何实际向 Facebook 进行身份验证的 Facebook 文档。您需要从他们的 API 中获取一个令牌,然后您可以将其传递到您的 Cognito 身份池。
  • 我看不到他们如何在这些帖子中从 IAM 获取会话令牌并访问安全 api。我可以使用 Cognito 用户池获取 AWS 令牌,但是当用户已经使用另一个身份提供商创建了帐户时,他们必须创建一个帐户。我可以将此身份提供者的令牌传递给 Cognito,但我没有获得要使用的令牌。我尝试在 IAM 中为 Auth0 创建一个身份池并在 api 网关中使用 AWS_IAM 但这拒绝了 Auth0 提供的令牌,并且显然 auth0 从 IAM 获取令牌。
猜你喜欢
  • 2018-07-24
  • 2020-09-30
  • 1970-01-01
  • 1970-01-01
  • 2017-10-20
  • 2019-03-26
  • 2019-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多