使用Amazon Cognito进行身份验证和授权流程-了解概述


概述

image.png

本文是记录的汇编,我试图了解使用Amazon Cognito实施身份验证和授权流程的概述。此外,上图是对官方说明图的补充和更正,以便您可以轻松理解。

Amazon Cognito的功能

Amazon Cognito大致分为三个功能:用户池,身份池和同步。我们尚未研究Sync,因为本文的身份验证和授权流程中未使用它。

关于用户池

用户池提供了存储和保留与用户相关的信息以及用户注册和登录(也可以通过Google,Facebook,Amazon等)功能的能力。在"身份验证和授权流程"中,我了解到它是处理身份验证的功能。

参考

  • 官方文档-Amazon Cognito用户池

关于身份池

身份池将为您生成凭据。该凭证的内容是临时凭证,具有与身份池中设置的IAM角色相同的权限,并由AWS STS(安全令牌服务)针对每个用户请求发布。

授权一词从未出现在

身份池的官方AWS文档中,但是当我回顾IAM角色的角色时,这才有意义。提供了IAM角色以分配给授权实体,例如AWS服务。换句话说,我知道发出身份的身份池(严格来说是AWS STS)将是负责"身份验证和授权流程"中授权的功能。

仅通过将其概括起来很难理解,因此我着重于Identity池中的操作,并创建了下图以试图理解它。它不是AWS的官方图表,因此不准确,但是最终导致了理解。

image.png

参考

  • 官方文档-AWS安全令牌服务
  • 官方文件-Amazon Cognito ID库
  • 类方法有限公司-Tomoto先生-完全了解IAM角色?什么是角色?

处理说明

1.认证过程

验证用户池。这是注册新用户信息或使用现有用户信息登录的过程。如果认证过程成功,将从用户池中返回以下响应。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
   "AuthenticationResult": {
      "AccessToken": "string",
      "ExpiresIn": number,
      "IdToken": "string",
      "NewDeviceMetadata": {
         "DeviceGroupKey": "string",
         "DeviceKey": "string"
      },
      "RefreshToken": "string",
      "TokenType": "string"
   },
   "ChallengeName": "string",
   "ChallengeParameters": {
      "string" : "string"
   },
   "Session": "string"
}

用户池返回的响应包含以下标记:

IdToken

包含有关经过身份验证的用户的声明(OIDC标准声明)。它主要用于从身份池请求AWS资源的凭证。到期日期在用户成功通过身份验证后一小时到期。无法使用过期的IdToken。

AccessToken

IdToken同样,它包含有关经过身份验证的用户的投诉(不包括ID信息)。它主要用于在用户池中添加,更改或删除用户属性。到期日期在用户成功通过身份验证后一小时到期。无法使用过期的AccessToken。您将需要使用RefreshToken重新发出它或重试身份验证。

刷新令牌

在获取新的AccessToken或IdToken时使用。此时,RefreshToken不会重新生成。如果RefreshToken过期,则需要再次尝试身份验证。默认情况下,它在用户成功通过身份验证后30天过期。可以将RefreshToken的到期日期设置为1到3650(天)范围内的任何值。

有关IdToken和AccessToken的补充

IdToken和AccessToken以JWT(Json Web令牌)格式存储。 JWT是有关在两方之间交换的轻量级实体的信息的集合,据说可以将一组信息表示为JSON对象,并作为字符串来启用数字签名和MAC以及信息的加密。 。

在应用程序外部使用AccessToken和IdToken时,请确保在批准Token之前检查Token的签名并进行篡改,并假设JWT可能已被恶意篡改,让我们验证一下它尚未完成。

参考

  • 官方文档-使用用户池令牌

  • 官方文档-JSON Web令牌验证

  • JSON Web令牌(JWT)
    draft-ietf-oauth-json-web-token-11

2.授权过程

通过使用身份验证过程获得的Token中包含的IdToken来请求AWS资源的凭证。如上文"关于身份池"部分中所述,此时获取的凭据是指与身份池中的IAM角色集具有相同特权的临时凭据。

默认情况下,凭据在颁发后一小时过期。通过将IAM角色设置为任意值,凭据可以在3600(1小时)到43200(12小时)秒之间到期。

如果授权过程成功,那么将从标识池中返回以下响应。使用其中包含的凭据创建签名的请求。

1
2
3
4
5
6
7
8
9
{
   "Credentials": {
      "AccessKeyId": "string",
      "Expiration": number,
      "SecretKey": "string",
      "SessionToken": "string"
   },
   "IdentityId": "string"
}

参考

  • 什么是IAM

  • 临时安全凭证

3.已签名的请求

最后,使用获得的凭据发出签名请求。 AWS正式提供了创建签名请求的过程,但是AWS提供了一个SDK,可轻松为每种语言创建签名请求。除非没有可用的SDK,否则请积极使用它。

参考

  • 签名版本4签名过程

  • 各种SDK

下次

我认为这将是以下之一。

  • 更好地了解Amazon Cognito
  • 使用Amazon Cognito和您喜欢的PHP实施身份验证和授权流程