如何使用AWS Cognito对API网关进行身份验证

时间:2019-08-27 18:03:50

标签: javascript amazon-web-services jwt aws-api-gateway amazon-cognito

我已经在API Gateway中开发了GraphQL API。我希望我的用户能够调用此api并在自己的应用程序中使用它。但是数据是敏感的,我想使用Cognito对用户进行身份验证。 我有几个问题...

1)由于没有可供他们登录的“应用”,用户将如何接收令牌以进行身份​​验证和查询API?

2)我相信令牌会每小时过期。我想这可能会使某些客户的开发人员感到沮丧,我可以为他们提供什么建议以使他们每小时更新一次令牌?

3)在阅读了文档(this specifically)之后-看来我需要使用“ Amazon Cognito CLI / SDK或API来将用户登录到选定的用户池并获取身份令牌或访问令牌...。”单击“ SDK”将导致github存储库。该github仓库说该SDK将不再开发,现在是AWS Amplify。

我在这里是否缺少逻辑漏洞?

1 个答案:

答案 0 :(得分:0)

Amplify是AWS不可或缺的应用程序创建解决方案。因此,您正在开发Amplify应用程序的客户将使用AWS Amplify Cognito SDK。 Web应用程序和其他应用程序将使用不同的库,或者仅发布到您的Cognito身份验证端点。

不管他们如何到达您的Cognito用户池,您要做的第一件事就是创建用户池,并在ApiGateway Api中创建授权方,然后在您要使用的Cognito中选择用户池。然后在您的资源中选择它以授权该特定资源。

创建用户池后,在用户池内部的左侧菜单上,应有一个“应用程序集成>域名”部分。在这里,您可以获取用户池auth公共域,或分配自定义域(您必须在dns中进行设置并将其分别连接到SSL证书)。这是Client Apps调用以获取Auth令牌的端点。

此过程取决于您使用的身份验证流程。但是出于说明目的,例如,使用客户端凭据身份验证流,您的客户端应用程序将:

  1. 使用url查询字符串param grant_type = client_credentials并在标头:authorization: Basic < Base64EncodedString of ClientID:ClientSecret >中向auth域发布请求。这将返回一个由Cognito签名的JWT(JSON Web令牌)

  2. 然后,客户端应用将使用此令牌来调用您的api资源。每当调用使用该用户池作为授权者的API网关资源时,您只需要在Authorization标头中放入一个有效的令牌即可。

实际上没有办法解决,这就是安全模型的工作方式。由于许多服务库/中间件为您处理了这一事实(例如Passport.js),因此联盟身份可能会更容易...就像可以通过Facebook登录一样。但这仍然需要多个步骤和调用。

对于令牌到期,无法更改到期时间(1小时)。我们所做的是,当我们获得令牌过期响应时,我们自动调用另一个令牌并重试API调用。

这有点乏味,但并不是那么令人沮丧。如果您的最终用户(客户端应用程序开发人员)正在开发更多现成的应用程序/网络应用程序解决方案,并且对此类事情不熟悉,那么这就是StackOverflow的目的:)

资源