- node.js/
- Node.js AWS api网关和cognito集成
Node.js AWS api网关和cognito集成
Node.js AWS api网关和cognito集成,node.js,amazon-web-services,integration,amazon-cognito,aws-api-gateway,Node.js,Amazon Web Services,Integration,Amazon Cognito,Aws Api Gateway,我正在创建一个api,我只希望身份池中经过身份验证的用户可以访问它。api调用一个lambda函数,该函数返回“hello world”。当我在api中未设置身份验证时,它工作正常,但当我创建自定义授权程序并将其设置为api的身份验证方法时,它返回null
下面是我做过的事情的清单:
我正在使用联邦成员身份,并确保在authorizer.js中正确复制了身份池ID和区域
在创建自定义授权人时,我将在我的联邦成员身份中设置的身份验证角色ARN添加到执行角色中(不确定是否应该这样做)
在我的身份访
我正在创建一个api,我只希望身份池中经过身份验证的用户可以访问它。api调用一个lambda函数,该函数返回“hello world”。当我在api中未设置身份验证时,它工作正常,但当我创建自定义授权程序并将其设置为api的身份验证方法时,它返回null
下面是我做过的事情的清单:
我正在使用联邦成员身份,并确保在authorizer.js中正确复制了身份池ID和区域
在创建自定义授权人时,我将在我的联邦成员身份中设置的身份验证角色ARN添加到执行角色中(不确定是否应该这样做)
在我的身份访问管理中,我将AmazonaPigatewayInvokuelAccess策略附加到Cognito授权角色
当我没有传递任何头并进行api调用时,我收到一条未经授权的消息
当我在头中传递一个伪令牌并进行api调用时,我得到一条空消息
当我在报头中传递AWS提供的令牌并进行api调用时,我得到一条空消息
当我尝试在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和region。API网关最近启动了对Cognito用户池的第一方支持。您不必再使用Lambda设置自定义授权程序。只需在API网关中设置一个用户池授权器,并使用它对池中的用户进行身份验证。可以找到有关设置的详细信息
希望这有帮助,
Ritisha.我只是从这个开始,所以我可能是错的
我认为在这种情况下,认识到AWS提供两种不同的服务这一事实很重要:
用户池--身份提供者
身份池--联合身份管理服务
重要的是,用户池可以用作身份池的身份提供者
现在,关于您的问题,您会注意到您引用的链接用于为用户池设置自定义授权器。传递从Facebook收到的令牌与您拥有的代码不起作用。它需要是验证Facebook代币的代码
如果您对将API网关与标识池一起使用感兴趣,则需要使用标识池sdk生成一个临时访问令牌,然后该令牌可用于与端点交互
您可以将端点的授权设置设置为使用AWS\u IAM
,而不是使用自定义授权器
我认为,您遇到的问题在很大程度上是由于亚马逊的营销和文档记录不力造成的。将这两个服务(用户池和身份池)分类到“Cognito”下会比将它们视为两个独立的服务更令人困惑。通常情况下,文档或营销会说Cognito可以做到这一点或那一点,从而不清楚哪一个提供了哪一个功能。把它们都称为游泳池只会让事情变得更糟
更新:
一些详细介绍如何使用API网关和Cognito的资源:
您希望人们如何在看不到您实际代码的情况下帮助您?如果您单击我发布的链接,请转到“为Amazon Cognito用户池开发自定义授权人”一节,并查看步骤1,它告诉您下载一份蓝图,其中包含我为授权人使用的确切代码。我输入了我的userPoolId和region。我通过终端使用“CURL”命令进行其余的调用。这里堆栈溢出的问题必须包括粘贴在问题中的相关代码,以便在这里讨论主题。外部链接有消失或改变的习惯,使得这个问题无法作为长期参考。此外,我们需要在适当的上下文中查看您的代码,而不是在上下文中查看一些示例代码。我应该如何复制400多行代码并正确设置格式,以便它可以位于代码标记中?我尝试了复制粘贴,但它不能正常工作。我在链接上使用了99.999999999999999999%的示例代码。我所做的唯一修改是添加了cognito和region中的userPoolId,这是在其中一个步骤中指示的,我不打算向公众共享这些信息。好吧,为了有效地使用这个站点,您确实需要学习如何在这个站点中正确地格式化代码。然后,直接从帮助页面:寻求调试帮助的问题(“为什么这段代码不工作?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建一个最小、完整且可验证的示例。你有责任弄清楚如何包含这些信息。当我尝试这样做时,它说我需要创建一个cognito用户池(我还没有创建),而我已经有了一个联邦成员身份。我正在使用另一个身份提供商,如Facebook和Google来验证用户身份。如果我使用AmazonCognito创建自己的身份提供者,这看起来可能会起作用,但我正在尝试使用现有的身份提供者。有没有办法将其与联邦身份相结合?我一直在研究IAM,但运气不好。我已经在IAM中创建了一个身份提供者,但当用户登录时,我如何从中获取令牌?我使用的是Auth0提供的服务,从图中可以看出,当用户登录时,它会返回一个AWS令牌,但当您将此令牌传递给网关时,它会拒绝它。我不知道如何将Facebook单独添加为身份提供商(这就是为什么我是usi的原因)