概述
本文是记录的汇编,我试图了解使用Amazon Cognito实施身份验证和授权流程的概述。此外,上图是对官方说明图的补充和更正,以便您可以轻松理解。
Amazon Cognito的功能
Amazon Cognito大致分为三个功能:用户池,身份池和同步。我们尚未研究Sync,因为本文的身份验证和授权流程中未使用它。
关于用户池
用户池提供了存储和保留与用户相关的信息以及用户注册和登录(也可以通过Google,Facebook,Amazon等)功能的能力。在"身份验证和授权流程"中,我了解到它是处理身份验证的功能。
参考
- 官方文档-Amazon Cognito用户池
关于身份池
身份池将为您生成凭据。该凭证的内容是临时凭证,具有与身份池中设置的IAM角色相同的权限,并由AWS STS(安全令牌服务)针对每个用户请求发布。
授权一词从未出现在
身份池的官方AWS文档中,但是当我回顾IAM角色的角色时,这才有意义。提供了IAM角色以分配给授权实体,例如AWS服务。换句话说,我知道发出身份的身份池(严格来说是AWS STS)将是负责"身份验证和授权流程"中授权的功能。
仅通过将其概括起来很难理解,因此我着重于Identity池中的操作,并创建了下图以试图理解它。它不是AWS的官方图表,因此不准确,但是最终导致了理解。
参考
- 官方文档-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实施身份验证和授权流程