AWS api网关和cognito集成

时间:2016-08-12 02:42:04

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

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

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

以下列出了我所做的事情:

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

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

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

  4. 当我没有通过任何标题并拨打api电话时,我收到了未经授权的消息。

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

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

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

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

    -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;
    

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

2 个答案:

答案 0 :(得分:5)

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

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

  1. 用户池 - 身份提供商
  2. 身份池 - 联合身份管理服务
  3. 重要的是,用户池可以用作身份池的身份提供者。

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

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

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

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

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

答案 1 :(得分:0)

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

希望这有帮助, Ritisha。