使用AWS Cognito和AWS Lambda的服务到服务工作流程

时间:2019-04-14 09:38:53

标签: aws-lambda aws-api-gateway amazon-cognito

我对AWS Cognito和AWS Lambda并不陌生。到目前为止,我已经尝试使用Serverless并通过AWS Lambda部署了REST API。但是,我想将我的API供多个外部团体使用。因为这是一种服务到服务,所以没有最终用户直接调用我的API。我使该API可用于在其应用程序中使用该API的其他企业。通过API公开的所有功能都非常简单,这意味着它们不会调用任何其他AWS服务,例如Dynamo DB等。

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

1。问题,Cognito与API密钥:将AWS Cognito与AWS Lambda结合使用并通过API密钥和IP白名单限制访问有什么好处?一个比另一个安全吗?

假设我要使用AWS Cognito。由于这是一种服务到服务的情况,因此我已经读过,该标准是使用标记端点,其中grant_typeclient_credential。我在medium上找到了以下内容。前几个步骤包括

  1. 在AWS Cognito中创建用户池。
  2. 创建App客户端
  3. 添加资源服务器
  4. 启用client credentials的{​​{1}}复选框

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

3。问题,资源服务器:在这里,我完全被卡住了。这到底是什么意思?最后,我想要的是我的客户可以针对我的API发出发布请求,并通过Cognito授予访问权限。一些澄清,这是什么意思,以及如何在我的情况下适用。愿意在需要时分享更多见解。

下一部分是为API网关配置Cognito授权器。没关系

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

  1. 首先,我向客户提供他的App client secretclient_id

然后,客户端将执行以下工作流程:

  1. 每当他想使用通过API网关公开的我的API时,他都会首先使用提供的client_secretclient_id来获取他的承载令牌。
  2. 他使用此承载令牌通过client_secret标头中的承载令牌向API网关发出请求。
  3. 如果授予访问权限,则客户端将检索我的API的输出。

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

1 个答案:

答案 0 :(得分:1)

1个问题,Cognito与API密钥

您会看到here

  

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

     

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

因此用途有所不同,API密钥基本上用于计算客户使用量,而AWS Cognito在那里用于验证/授权对API的调用。

让我们说,您有一个要求,即跟踪用户调用您的API的次数不能超过100次。

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

您将遇到以下情况:

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

2。问题,应用客户端:

好吧,客户端ID和客户端密钥用于标识受信任的客户端(应用程序)而不是用户,并且每个应用程序都应具有自己的客户端ID,因此,如果调用方是应用程序而不是用户,那么请创建一个客户端每个单独应用的ID。请注意,必须对客户机密 保密,因此,如果调用方应用无法实现此目的,例如单页Javascript应用或本机应用,则不应发布该机密。

3。问题,资源服务器:

这是您的API服务器。

选中此page

  

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

     

大型部署可能具有多个资源服务器。   例如,Google的服务有数十个资源服务器,例如   作为Google Cloud平台,Google Maps,Google Drive,Youtube,   Google+等。这些资源服务器中的每一个都是   完全不同,但它们都共享同一台授权服务器。

4。问题,客户工作流程

here

中检查客户凭据授予
  

该过程的步骤如下:

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和应用程序客户端密钥,以冒号连接。       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.