本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
身份池(联合身份)身份验证流程
Amazon Cognito 可帮助您为终端用户创建在多个设备和平台间保持一致的唯一标识符。Amazon Cognito 还会向您的应用程序提供临时的、权限有限的凭证以访问资源。 AWS 此页面介绍有关 Amazon Cognito 中的身份验证如何工作的基础知识,并解释了身份池中身份的生命周期。
外部提供商身份验证流程
使用 Amazon Cognito 进行身份验证的用户将通过一个多步骤流程来引导启动其凭证。Amazon Cognito 提供两个不同的通过公有提供商进行身份验证的流程:增强型流程和基本流程。
完成其中一个流程后,您可以访问由您的角色访问策略定义的其他 AWS 服务 流程。默认情况下,Amazon Cognito 控制台
身份池接受来自提供商的以下工件:
提供商 | 身份验证神器 |
---|---|
Amazon Cognito 用户池 | ID 令牌 |
OpenID Connect () OIDC | ID 令牌 |
SAML 2.0 | SAML断言 |
社交提供者 | 访问令牌 |
增强型(简化的)身份验证流程
当您使用增强版身份验证流程时,您的应用程序会首先在请求中提供来自授权的 Amazon Cognito 用户池或第三方身份提供商的身份验证证明。GetId
-
您的应用程序在 GetID 请求中提供来自SAML授权的 Amazon Cognito 用户池或第三方身份提供商的身份验证证明(JSON网络令牌或断言)。
-
您的身份池会返回一个身份 ID。
-
您的应用程序在GetCredentialsForIdentity请求中将身份 ID 与相同的身份验证证明相结合。
-
您的身份池会返回 AWS 证书。
-
您的应用程序使用临时证书签署 AWS API请求。
增强型身份验证管理身份池配置中的IAM角色选择和凭据检索逻辑。您可以将身份池配置为选择默认角色,将基于属性的访问控制 (ABAC) 或基于角色的访问控制 (RBAC) 原则应用于角色选择。来自增强身份验证的 AWS 凭证有效期为一小时。
增强型身份验证中的操作顺序
-
GetId
-
GetCredentialsForIdentity
![显示增强身份验证流程的图表](images/amazon-cognito-ext-auth-enhanced-flow.png)
基本(经典)工作流程
当你使用基本的身份验证流程时,
-
您的应用程序在 GetID 请求中提供来自SAML授权的 Amazon Cognito 用户池或第三方身份提供商的身份验证证明(JSON网络令牌或断言)。
-
您的身份池会返回一个身份 ID。
-
您的应用程序在GetOpenIdToken请求中将身份 ID 与相同的身份验证证明相结合。
-
GetOpenIdToken
返回由您的身份池颁发的新 OAuth 2.0 令牌。 -
您的应用程序在AssumeRoleWithWebIdentity请求中显示新令牌。
-
AWS Security Token Service AWS STS) 返回 AWS 凭证。
-
您的应用程序使用临时证书签署 AWS API请求。
通过基本型工作流,您可以更精细地控制分发给用户的凭证。增强型身份验证流程的 GetCredentialsForIdentity
请求根据访问令牌的内容请求角色。经典工作流程中的AssumeRoleWithWebIdentity
请求使您的应用程序能够更好地请求您配置了足够信任策略的任何 AWS Identity and Access Management 角色的凭证。您也可以请求自定义角色会话持续时间。
基本身份验证中的操作顺序
-
GetId
-
GetOpenIdToken
-
AssumeRoleWithWebIdentity
![显示基本身份验证流程的图表](images/amazon-cognito-ext-auth-basic-flow.png)
已经过开发人员验证的身份验证流程
使用经开发人员验证的身份(身份池)时,客户端将使用包括 Amazon Cognito 外部代码的不同身份验证流程,在您自己的身份验证系统中验证用户。Amazon Cognito 外部代码如此处所示。
增强型身份验证流程
开发者提供商的增强身份验证中的操作顺序
-
通过开发人员提供商登录(Amazon Cognito 外部代码)
-
验证用户登录(Amazon Cognito 外部代码)
![显示开发者身份验证的增强型身份验证流程的示意图](images/amazon-cognito-dev-auth-enhanced-flow.png)
使用开发者提供商进行基本身份验证的操作顺序
-
在身份池之外实现逻辑以登录并生成开发者-提供商标识符。
-
检索存储的服务器端 AWS 凭证。
-
在使用授权 AWS 凭证签名的GetOpenIdTokenForDeveloperIdentityAPI请求中发送开发者提供商标识符。
-
使用请求应用程序凭证AssumeRoleWithWebIdentity。
![显示开发者身份验证的基本身份验证流程的示意图](images/amazon-cognito-dev-auth-basic-flow.png)
我应该使用哪种身份验证流程?
增强的流程是最安全的选择,开发人员的工作量最少:
-
增强的流程降低了API请求的复杂性、大小和速率。
-
您的应用程序无需向提出其他API请求 AWS STS。
-
您的身份池会评估您的用户应获得的IAM角色证书。您无需在客户端中嵌入角色选择逻辑。
重要
创建新的身份池时,最好不要默认激活基本(经典)身份验证。要实现基本身份验证,请先评估您的IAM角色对于 Web 身份的信任关系。然后在您的客户端中构建角色选择逻辑,并保护客户端免受用户修改。
基本身份验证流程将IAM角色选择的逻辑委托给您的应用程序。在此流程中,Amazon Cognito 会验证您的用户经过身份验证或未经身份验证的会话,并颁发一个令牌,您可以用该令牌交换证书。 AWS STS用户可以将基本身份验证中的令牌交换为任何信任您的身份池和 amr
/或已验证/未验证状态的IAM角色。
同样,请理解开发者身份验证是身份提供者身份验证的捷径。Amazon Cognito 信任授权GetOpenIdTokenForDeveloperIdentity请求的 AWS 凭证,无需对请求内容进行额外验证。保护授权开发者身份验证的密钥不被用户访问。
API摘要
- GetId
-
该GetIdAPI通话是在 Amazon Cognito 中建立新身份所需的第一个通话。
- 未经身份验证的访问
-
Amazon Cognito 能够在您的应用程序中授权未经身份验证的访客访问。如果您的身份池中启用了此功能,则用户可以随时通过请求新的身份 ID
GetId
API。该应用程序应缓存此身份 ID,以对 Amazon Cognito 发出后续调用。 AWS Mobile SDKs 和浏览器 JavaScript 中的 for 都有凭据提供商,可以为您处理此缓存。 AWS SDK - 经过身份验证的访问
-
当你将应用程序配置为支持公共登录提供商(Facebook、Google+、使用亚马逊登录或用苹果登录)时,用户还可以提供令牌(或 OAuth OpenID Connect),用于在这些提供商中识别他们。在对
GetId
的调用中使用时,Amazon Cognito 创建一个经过身份验证的新身份,或者是返回已与该特定登录关联的身份。Amazon Cognito 通过向提供商验证令牌并确保以下各项来实现此目的:-
令牌有效且来自已配置的提供商。
-
令牌未过期。
-
令牌与使用该提供商创建的应用程序标识符(如 Facebook 应用程序 ID)匹配。
-
令牌与用户标识符匹配。
-
- GetCredentialsForIdentity
-
GetCredentialsForIdentityAPI可以在您建立身份 ID 后调用。因此,此操作在功能上等同于调用GetOpenIdToken。AssumeRoleWithWebIdentity
为了让 Amazon Cognito 代表您拨打电话
AssumeRoleWithWebIdentity
,您的身份池必须具有与之关联的IAM角色。您可以通过 Amazon Cognito 控制台执行此操作,也可以通过操作手动执行此操作。SetIdentityPoolRoles - GetOpenIdToken
-
在您建立身份 ID 后GetOpenIdTokenAPI提出请求。IDs在您第一次请求后缓存身份,然后使用启动该身份的后续基本(经典)会话
GetOpenIdToken
。对
GetOpenIdToken
API请求的响应是 Amazon Cognito 生成的令牌。您可以将此令牌作为AssumeRoleWithWebIdentity请求中的WebIdentityToken
参数提交。在提交 OpenID 令牌之前,请在您的应用程序中进行验证。您可以使用自己的库SDK或类似的OIDC库aws-jwt-verify
来确认 Amazon Cognito 已发行令牌。OpenID 令牌的签名密钥 ID 或 kid
是 Amazon Cognito 身份 jwks_uri 文档中列出的密钥之一。这些密钥可能会发生变化。验证 Amazon Cognito 身份令牌的函数应定期更新它在 jwks_uri 文档中的密钥列表。Amazon Cognito 在 jwks_uri 缓存控制响应标头中设置刷新时长,而 max-age
当前设置为 30 天。- 未经身份验证的访问
-
要为未经身份验证的身份获取令牌,您只需身份 ID 本身。无法为经身份验证的身份或已停用的身份获取未经身份验证的令牌。
- 经过身份验证的访问
-
如果您有一个经过身份验证的身份,您必须为已与该身份关联的登录名传递至少一个令牌。在
GetOpenIdToken
调用期间,所有传入的令牌都必须通过之前提到的同一验证;如果有任何令牌失败,整个调用都会失败。GetOpenIdToken
调用的响应中还包括身份 ID。这是因为您传入的身份 ID 可能不是返回的那个身份 ID。 - 关联登录名
-
如果您为尚未与任何身份关联的登录名提交令牌,该登录名将视为已“关联”到关联身份。您只能为每个公共提供商链接一个登录名。如果尝试将多个登录名链接到一个公共提供商,将导致
ResourceConflictException
错误响应。如果登录名只链接到一个现有身份,则GetOpenIdToken
返回的身份 ID 将与传入的相同。 - 合并身份
-
如果您为目前未链接到给定身份,但链接到另一身份的登录名传入令牌,这两个身份将合并。两个身份一旦合并,其中一个身份会成为所有关联登录名的父项/所有者,另一个身份会被禁用。在这种情况下,将返回父项/所有者的身份 ID。如果此值不同,则必须更新本地缓存。 AWS 移动设备SDKs或浏览器 JavaScript 中的 AWS SDK提供商会为您执行此操作。
- GetOpenIdTokenForDeveloperIdentity
-
当使用经过开发者身份验证的身份时,该GetOpenIdTokenForDeveloperIdentity操作取代了GetOpenIdToken从设备中使用GetId和从设备中使用。由于您的应用程序使用 AWS 凭证签署对此API操作的请求,因此 Amazon Cognito 相信请求中提供的用户标识符是有效的。开发者身份验证取代了 Amazon Cognito 对外部提供商执行的令牌验证。
其有效载荷API包括
logins
地图。此地图必须包含开发者提供商的密钥和作为系统中用户标识符的值。如果用户标识符尚未关联到现有身份,Amazon Cognito 会创建新的身份,并为该身份返回新身份 ID 以及 OpenID Connect 令牌。如果用户标识符已关联,Amazon Cognito 返回预先存在的身份 ID 和 OpenID Connect 令牌。IDs在您第一次请求后缓存开发者身份,然后使用启动该身份的后续基本(经典)会话GetOpenIdTokenForDeveloperIdentity
。对
GetOpenIdTokenForDeveloperIdentity
API请求的响应是 Amazon Cognito 生成的令牌。您可以将此令牌作为AssumeRoleWithWebIdentity
请求中的WebIdentityToken
参数提交。在提交 OpenID Connect 令牌之前,请在您的应用程序中进行验证。您可以使用自己的库SDK或类似的OIDC库aws-jwt-verify
来确认 Amazon Cognito 已发行令牌。OpenID Connect 令牌的签名密钥 ID 或 kid
是 Amazon Cognito 身份 jwks_uri 文档中列出的密钥之一。这些密钥可能会发生变化。验证 Amazon Cognito 身份令牌的函数应定期更新它在 jwks_uri 文档中的密钥列表。Amazon Cognito 在 jwks_uri cache-control
响应标头中设置刷新时长,max-age
当前设置为 30 天。- 关联登录名
-
与外部提供商一样,提供尚未与身份关联的额外登录名会将这些登录名隐式关联到该身份。如果您将一个外部提供者登录名链接到一个身份,用户可以对该提供者使用外部提供者身份验证流程。但是,他们无法在调用
GetId
或GetOpenIdToken
时使用登录映射中的开发人员提供者名称。 - 合并身份
-
使用经过开发者身份验证的身份,Amazon Cognito 支持隐式合并和通过进行显式合并。MergeDeveloperIdentitiesAPI通过显式合并,您可以使用系统中的用户标识符将两个身份标记为单个身份。如果您提供了源和目标用户标识符,Amazon Cognito 会将其合并。您下次为任一用户标识符请求 OpenID Connect 令牌时,系统都会返回同一身份 ID。
- AssumeRoleWithWebIdentity
-
在你获得 OpenID Connect 令牌后,你可以通过向 AWS Security Token Service ()AWS STS的AssumeRoleWithWebIdentityAPI请求用它来换取临时 AWS 证书。
由于可以创建的身份数量没有限制,所以您务必要了解向用户授予的权限。为您的应用程序设置不同的IAM角色:一个用于未经身份验证的用户,一个用于经过身份验证的用户。Amazon Cognito 控制台可以在您首次设置身份池时创建默认角色。这些角色实际上没有被授予任何权限。修改它们以满足您的需求。
了解有关 角色信任和权限 的更多信息。
† 原定设置 Amazon Cognito 身份 jwks_uri
AWS 区域 | jwks_uri 文档的路径 |
---|---|
AWS GovCloud (美国西部) | https://cognito-identity.us-gov-west-1.amazonaws.com/.well-known/jwks_uri |
中国(北京) | https://cognito-identity.cn-north-1.amazonaws.com.cn/.well-known/jwks_uri |
欧洲(米兰)和非洲(开普敦)等选择加入区域 | https://cognito-identity. |
您还可以从颁发者推断出 jwks_uri,或者从 Amazon Cognito 推断出在 OpenID 令牌中收到的 iss
。OIDC标准发现端点<issuer>/.well-known/openid-configuration
列出了您的令牌的 jwks_ uri 的路径。