我正在创建一个api,我只希望我的身份池中经过身份验证的用户可以访问它。该api调用一个lambda函数返回"hello world"。当我在api中设置无身份验证时,它工作得很好,但当我创建自定义授权器并将其设置为api的身份验证方法时,它返回null。
这是我用来创建自定义身份验证器的链接
这是我做的事情的列表:
-
我正在使用联邦身份,并确保我在authorizer.js中正确复制了身份池ID和区域。
-
我在创建我的自定义授权者时添加了Authenticated角色,设置在我的联邦身份中,ARN's到执行角色中(不确定我是否应该这样做)。
-
在身份访问管理中,我将AmazonAPIGatewayInvokeFullAccess策略附加到Cognito Authorization角色。
-
当我没有传递头文件并进行api调用时,我得到一个未经授权的消息。
-
当我在头中传递一个假令牌并进行api调用时,我得到一个空消息。
-
当我在头中传递AWS提供的令牌并进行api调用时,我得到一个空消息。
-
当我尝试在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;
我所做的唯一的事情是添加我的同源userPoolId和区域。
我刚开始这么做,所以我可能错了。
我认为在这种情况下,重要的是要认识到AWS提供了两种独立的服务:
- 用户池——一个身份提供者
- 身份池——联邦身份管理服务
重要的是用户池可以用作身份池的身份提供者。
现在关于您的问题,您会注意到您引用的链接是用于为User Pools设置自定义授权器的。传递您从Facebook收到的令牌将无法与您拥有的代码一起工作。它需要是用于验证来自Facebook的令牌的代码。如果你有兴趣使用API网关和身份池,那么你需要使用身份池sdk来生成一个临时访问令牌,然后可以用来与你的端点进行交互。
您可以将端点的授权设置设置为使用AWS_IAM
,而不是使用自定义授权器。
我认为你遇到的问题在很大程度上是由于亚马逊方面糟糕的营销和文档。将这两种服务(用户池和身份池)分类在"Cognito"之下会比将它们作为两个独立的服务来对待更令人困惑。文档或营销人员经常会说Cognito可以做这个或那个,这使得人们不清楚哪个提供了哪个功能。同时调用两个池只会让事情变得更糟。
更新:一些详细介绍如何使用API Gateway和Cognito的资源:
- 如何使用Cognito Id(+配置)调用AWS API网关端点?
- https://blogs.aws.amazon.com/javascript/post/Tx1F7FO6GDAIXD3/Authentication-with-Amazon-Cognito-in-the-Browser
- http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-generate-sdk.html how-to-generate-sdk-javascript
API Gateway最近推出了对Cognito用户池的第一方支持。您不应该再使用Lambda设置自定义授权器了。只需在API网关中设置用户池授权器,并使用它对池中的用户进行身份验证。设置的详细信息可以在这里找到。
希望这有帮助,Ritisha .