【问题标题】:How to use AWS Cognito to authenticate API Gateway如何使用 AWS Cognito 对 API Gateway 进行身份验证
【发布时间】:2019-12-31 22:51:39
【问题描述】:

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

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

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

3) 通读文档后,(this specifically) - 似乎我需要使用“Amazon Cognito CLI/SDK 或 API 将用户登录到所选用户池,并获取身份令牌或访问令牌....”单击“SDK”会导致一个 github 存储库。该 github 存储库表示 SDK 将不再开发,现在是 AWS Amplify。

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

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

    确实没有办法解决这个问题,这就是安全模型的工作原理。也许联合身份会更容易,因为许多服务库/中间件会为您处理这个(例如 Passport.js)......就像可以选择通过 facebook 登录一样。不过,这仍然需要多个步骤和调用。

    至于令牌过期,没有办法改变过期时间(1小时)。我们所做的是,当我们收到令牌过期响应时,我们会自动调用另一个令牌并重试 API 调用。

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

    资源

    【讨论】:

      猜你喜欢
      • 2016-08-20
      • 1970-01-01
      • 2021-09-05
      • 1970-01-01
      • 2020-01-05
      • 2018-03-14
      • 1970-01-01
      • 2017-05-23
      • 2020-01-01
      相关资源
      最近更新 更多