如何将Cognito令牌传递给Amazon API Gateway?

12

我正在开发基于Amazon API Gateway的Web应用程序。现在我创建了Facebook登录并成功登录到网站。但是当我调用另一个API时,一切都消失了。我认为每次调用API时都应该传递Cognito令牌。我对吗?

如果是这样的话,如何将Cognito令牌传递给API?像头文件那样吗?还是其他方式?

谢谢,


你说的“一切都消失了”是什么意思?在API网关API内部,你需要哪些有关调用者的信息? - Scott Willeke
你能提供一些样例代码和错误信息吗? - Mark Mercurio
@ScottWilleke 我的登录页面调用/doLogin API,然后我从Cognito获取令牌和ID。之后我进入受限页面,如个人资料,它会调用/showProfile API。目前/showProfile不知道我是否已登录。因此给出了“缺少身份验证令牌”的错误。我认为我应该将我的令牌和ID发送到每个API网关调用中,但是如何发送呢?像“Amazon-Cognito-Token”这样的标头?还是其他方式? - itulga
@user2882027,我不太清楚你的设置。/doLogin是否从getOpenIdToken返回openId令牌?您是否在/showProfile API上设置了AWS_IAM授权?如果是这样,您从浏览器调用它时使用哪些凭据?sts的假定角色凭证与Cognito OpenId令牌一起使用吗? - Mark Mercurio
@MarkMercurio 是的,/doLogin 从 getOpenIdToken 返回 openId 令牌。/doLogin 授权为 None,/showProfile 授权为 AWS_IAM。如果我调用 /doLogin 没有错误,但是 /showProfile 给出了“缺少身份验证令牌”的错误。如何使用凭据调用 /showProfile? - itulga
显示剩余2条评论
1个回答

16
您正在使用来自Cognito身份验证的"基本身份验证流程",这意味着您需要通过调用STS的"AssumeRoleWithWebIdentity"为您的用户获取凭证。以下是一些帮助文档:http://docs.aws.amazon.com/cognito/devguide/identity/concepts/authentication-flow/ 一旦拥有凭证,您可以实例化 API 网关客户端:
var client = apigClientFactory.newClient({ 
    accessKey: ACCESS_KEY, 
    secretKey: SECRET_KEY, 
    sessionToken: SESSION_TOKEN });

密钥和令牌来自于“AssumeRoleWithWebIdentity”调用的结果。

如果您已正确配置IAM角色和授权,则应能够访问API。

这是描述如何配置角色和授权的文档:http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-method-settings.html#how-to-method-settings-callers-console

此外,以下是启用CORS的方法 - http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-cors.html


我应该在我的Web界面的JS中使用apigClientFactory吗? - itulga
你之前使用的是什么? - Mark Mercurio
如何使用AJAX请求消耗受保护的网关API?哪些头文件是必要的?如何生成并设置它们?这里有一篇关于如何使用ajax调用受保护网关的博客文章,在该文章中,作者使用了x-api-key头文件。这就像JWT令牌,我该如何生成APIKEY或如何从AssumeRoleWithWebIdentity设置密钥和令牌到ajax请求中?http://dev.classmethod.jp/cloud/aws/call_amazon-api-gateway_from_browser/ - itulga
@user2882027,API Gateway的API密钥与Amazon Cognito生成的JWT完全不同。如果您想使用AWS凭据保护API,则请使用Mark提供的说明;如果您想使用API密钥,请参阅API Gateway文档。如果您正在尝试做其他事情,请尝试编辑您的帖子并提供更多详细信息。 - Bob Kinney
由于某些原因,我无法使用AssumeRoleWithWebIdentity返回的密钥和令牌调用API网关。我有一个具有所有正确策略的Cognito_Auth_Role,但是我会收到内部服务器错误。如果我将AdminAccess添加到此角色,则可以正常工作。 - johnny
就我个人而言,我认为最佳实践应该是定义一个 lambda 函数,该函数接受授权标头(例如来自 HTTP 请求的 BEARER 令牌),并运行一个 lambda 函数,该函数返回具有此答案中的逻辑的 IAM 策略。我认为亚马逊的这篇文章非常好。 - shicholas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接