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

Javascript 如何使用AWS Cognito对API网关进行身份验证,javascript,amazon-web-services,jwt,aws-api-gateway,amazon-cognito,Javascript,Amazon Web Services,Jwt,Aws Api Gateway,Amazon Cognito,我在API网关中开发了一个GraphQLAPI。我希望我的用户能够调用这个api,并在他们自己的应用程序中使用它。然而,数据是敏感的,我想使用Cognito对用户进行身份验证。 我有几个问题 1) 由于没有可供用户登录的“应用程序”,用户如何能够接收令牌,以便进行身份验证和查询API 2) 我相信代币每小时都会过期。我想这可能会让一些客户的开发人员感到沮丧,我可以为他们提供什么建议来处理每小时更新令牌的问题 3) 在阅读完文档之后,()-似乎我需要使用“Amazon Cognito CLI/SD

我在API网关中开发了一个GraphQLAPI。我希望我的用户能够调用这个api,并在他们自己的应用程序中使用它。然而,数据是敏感的,我想使用Cognito对用户进行身份验证。 我有几个问题

1) 由于没有可供用户登录的“应用程序”,用户如何能够接收令牌,以便进行身份验证和查询API

2) 我相信代币每小时都会过期。我想这可能会让一些客户的开发人员感到沮丧,我可以为他们提供什么建议来处理每小时更新令牌的问题

3) 在阅读完文档之后,()-似乎我需要使用“Amazon Cognito CLI/SDK或API将用户登录到所选的用户池,并获取身份令牌或访问令牌…”单击“SDK”会导致github repo。github repo表示SDK将不再开发,现在是AWS Amplify


这里有没有我遗漏的逻辑漏洞?

Amplify是AWS提供的一个完整的应用程序创建解决方案。因此,您开发Amplify应用程序的客户将使用AWS Amplify Cognito SDK。Web应用程序和其他应用程序将使用不同的库,或者只发布到您的cognito auth端点

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

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

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

  • 使用url查询字符串param grant_type=client_credentials,在标题中向身份验证域发布请求:
    authorization:Basic
    。这将返回一个Cognito签名的JWT(JSON Web令牌)

  • 然后客户端应用程序将使用此令牌调用您的api资源。每当调用使用此用户池作为授权者的API网关资源时,只需在授权头中放入有效令牌

  • 真的没有办法解决这个问题,这就是安全模型的工作原理。由于许多服务库/中间件为您处理这一点(例如Passport.js),联邦身份可能会更容易一些。。。比如可以选择通过facebook登录。但这仍然需要多个步骤和调用

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

    这有点乏味,但并没有那么令人沮丧。如果您的最终用户(客户端应用程序开发人员)正在开发更多开箱即用的应用程序/web应用程序解决方案,并且对此类问题没有丰富的经验,那么StackOverflow就是这样做的:)

    资源