首页 > 解决方案 > 使用 AWS cognito 和 AWS Lambda 的服务到服务工作流程

问题描述

我对 AWS Cognito 和 AWS Lambda 比较陌生。到目前为止,我已经使用无服务器并通过 AWS Lambda 部署了我的 REST API。但是,我想让我的 API 可供多个外部方使用。由于这是对服务的服务,因此没有最终用户直接调用我的 API。我将 API 提供给在其应用程序中使用它的其他企业。通过 API 公开的所有功能都相当简单,这意味着它们不会调用任何其他 AWS 服务,例如 Dynamo DB 等。

我有几个问题,有些是相当高级别的问题,有些是针对 AWS Cognito 设置的。我决定将所有内容放在一篇文章中,因为它更加独立且更易于理解。

1. 问题,Cognito 与 API 密钥:结合使用 AWS Cognito 与 AWS Lambda 以及通过 API 密钥和 IP 白名单限制访问有什么优势?一个比另一个更安全吗?

假设我想使用 AWS Cognito。由于这是一个服务到服务的案例,我读过标准是在grant_typeis的地方使用令牌端点client_credential。我在medium上找到了以下内容。前几个步骤包括

  1. 在 AWS Cognito 中创建用户池。
  2. 创建应用客户端
  3. 添加资源服务器
  4. 启用client credentials复选框Allower OAuth flows

2.问题,App客户端:在添加的App客户端中,我找到了对应的App client idApp client secret。如果我将我的 API 暴露给多个不同的各方,我是否需要为每一方添加另一个 App 客户端?否则,他们使用所有相同的凭据。这是正确的方法吗?

3. 问题,资源服务器:这里我完全卡住了。这到底是什么意思?最后,我想要的只是我的客户可以对我的 API 进行发布请求,并通过 Cognito 授予访问权限。一些澄清这是什么以及这如何适用于我的情况将不胜感激。如果需要,非常乐意分享更多见解。

下一部分是为 API 网关配置 Cognito Authorizer。这应该没问题。

4. 问题,客户工作流程关于我的客户工作流程。我是否正确,这包括以下步骤:

  1. 首先,我向客户提供他的client_idclient_secret.

然后客户在他身边实施以下工作流程:

  1. 每当他想使用我通过 API Gateway 公开的 API 时,他首先使用他提供的client_idclient_secret检索他的不记名令牌。
  2. 他使用此不记名令牌向 API 网关发出请求,并在Authorization标头中使用不记名令牌。
  3. 如果授予访问权限,客户端将检索我的 API 的输出。

这是正确的还是我错过了什么?

标签: aws-lambdaaws-api-gatewayamazon-cognito

解决方案


1-问题,Cognito 与 API 密钥

好吧,你可以在这里看到。

Amazon Cognito 用户池让您可以为您的 REST API 创建可自定义的身份验证和授权解决方案。

使用计划让您向客户提供 API 密钥,然后跟踪和限制每个 API 密钥的 API 阶段和方法的使用

所以目的不同,API 密钥基本上用于计算客户使用情况,而 AWS Cognito 用于验证/授权对您的 API 的调用。

假设您有一个要求,跟踪用户调用您的 API 的次数不能超过 100 次。

然后使用 AWS Cognito,您将允许用户注册,您还将为同一用户提供 API 密钥,您将使用 Cognito 识别调用的来源,并且每次调用 API 网关将减少分配给用户 API 的限制按 1 键。

您将遇到以下情况:

  1. 当token(通过用户名和密码登录获得)和API Key有效时,调用成功。
  2. 当令牌错误/丢失时,您的调用者将获得 401 状态码。
  3. 当 API Key 错误/丢失时,您的调用者将获得 403 状态码。
  4. 当 API Key 正确但超出限制时,您的调用者将获得 429 状态码。

2.问题,App客户端:

好吧,客户端 ID 和客户端机密旨在识别受信任的客户端(应用程序)而不是用户,并且每个应用程序都应该有自己的客户端 ID,所以如果调用者是应用程序而不是用户,那么是的,为每个应用程序创建一个客户端 ID单独的应用程序。请注意,客户端机密必须保密,因此如果调用方应用无法做到这一点,例如单页 Javascript 应用或本机应用,则不应发布机密。

3.问题,资源服务器:

它是您的 API 服务器。

检查这个页面

资源服务器是 API 服务器的 OAuth 2.0 术语。资源服务器在应用程序获得访问令牌后处理经过身份验证的请求。

大规模部署可能有多个资源服务器。例如,谷歌的服务有几十个资源服务器,如谷歌云平台、谷歌地图、谷歌云端硬盘、Youtube、谷歌+等等。这些资源服务器中的每一个都是明显独立的,但它们都共享相同的授权服务器。

4. 问题、客户工作流程

在此处检查客户端凭据授予

该过程的步骤如下:

An app makes a POST request to https://AUTH_DOMAIN/oauth2/token, and specifies the following parameters:
    grant_type – Set to “client_credentials” for this grant type.
    client_id – The ID for the desired user pool app client.
    scope – A space-separated list of scopes to request for the generated access token.

In order to indicate that the app is authorized to make the request, the Authorization header for this request is set as “Basic

BASE64(CLIENT_ID:CLIENT_SECRET)“,其中 BASE64(CLIENT_ID:CLIENT_SECRET) 是应用程序客户端 ID 和应用程序客户端密码的 base64 表示,用冒号连接。Amazon Cognito 授权服务器返回具有以下键的 JSON 对象: access_token – 有效的用户池访问令牌。expires_in – 提供的访问令牌有效的时间长度(以秒为单位)。token_type – 设置为“承载”。

Note that, for this grant type, an ID token and a refresh token aren’t returned.
The app uses the access token to make requests to an associated resource server.
The resource server validates the received token and, if everything checks out, executes the request from the app.

推荐阅读