AWS api网关和cognito集成

plo*_*lot 4 integration amazon-web-services node.js amazon-cognito aws-api-gateway

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

这是我用来帮助创建自定义身份验证器的链接

这是我做的事情清单:

  1. 我使用的是Federate标识,并确保我在authorizer.js中正确复制了标识池ID和区域.

  2. 我在创建自定义授权程序时添加了Authenticated角色,在我的联邦身份中设置,ARN成为执行角色(不确定我是否假设这样做).

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

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

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

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

  7. 当我尝试在AWS中测试api调用时,返回状态为200,并显示"Hello World"消息

任何人都知道问题是什么以及如何解决它?

-Update-
这是我从链接中的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;
Run Code Online (Sandbox Code Playgroud)

我唯一做的就是添加了我的同源userPoolId和region.

key*_*eom 5

我刚刚开始这样做,所以我可能错了.

我认为在这种情况下,重要的是要认识到AWS提供了两个独立的服务:

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

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

现在关于你的问题,你会发现你所引用的链接是设置自定义授权的用户池.传递从Facebook收到的令牌将无法使用您拥有的代码.它需要是用于验证来自Facebook的令牌的代码.

如果您对使用带有标识池的API网关感兴趣,则需要使用标识池sdk生成临时访问令牌,然后可以使用该令牌与端点进行交互.

您可以设置要使用的端点的授权设置,而不是使用自定义授权程序AWS_IAM.

我认为您遇到的问题在很大程度上是由于亚马逊的营销和文档不佳造成的.对"Cognito"下的两个服务(用户池和标识池)进行分类会比将它们视为两个独立的服务更加混乱.通常情况下,文档或市场营销会说Cognito可以做到这一点或那样,使得不清楚哪一个提供哪种功能.将它们称为两个池只会让事情变得更糟.

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