身份池(联合身份)身份验证流程 - Amazon Cognito
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

身份池(联合身份)身份验证流程

Amazon Cognito 可帮助您为终端用户创建在多个设备和平台间保持一致的唯一标识符。Amazon Cognito 还会向您的应用程序提供临时的、权限有限的凭证以访问资源。 Amazon 此页面介绍有关 Amazon Cognito 中的身份验证如何工作的基础知识,并解释了身份池中身份的生命周期。

外部提供商身份验证流程

使用 Amazon Cognito 进行身份验证的用户将通过一个多步骤流程来引导启动其凭证。Amazon Cognito 提供两个不同的通过公有提供商进行身份验证的流程:增强型流程和基本流程。

完成其中一个流程后,您可以访问由您的角色访问策略定义的其他 Amazon Web Services 流程。默认情况下,Amazon Cognito 控制台创建可访问 Amazon Cognito Sync 存储和 Amazon Mobile Analytics 的角色。有关如何授予额外访问权限的更多信息,请参阅 IAM 角色

增强型(简化的)身份验证流程

当您使用增强版身份验证流程时,您的应用程序首先在请求中提供来自授权的 Amazon Cognito 用户池或第三方身份提供商的 ID 或访问令牌。GetId应用程序将该令牌交换为身份池中的身份 ID。然后,身份 ID 将用于 GetCredentialsForIdentity 请求中的相同身份提供商令牌。增强的工作流程通过AssumeRoleWithWebIdentity在后台执行GetOpenIdToken和操作来简化凭证检索。 GetCredentialsForIdentity返回授权您的用户在一小时内访问 Amazon 资源的 Amazon API 凭证。

  1. GetId

  2. GetCredentialsForIdentity


                外部提供商增强型身份验证流程

基本(经典)工作流程

当您使用基本身份验证流程时,您的应用程序首先显示 GetID 请求中来自已授权 Amazon Cognito 用户群体或第三方身份提供者的 ID 令牌。应用程序将该令牌交换为身份池中的身份 ID。然后,身份 ID 将用于 GetOpenIdToken 请求中的相同身份提供商令牌。GetOpenIdToken 返回由身份池颁发的新 OAuth 2.0 令牌。然后,您可以在AssumeRoleWithWebIdentity请求中使用新令牌来检索 Amazon API 凭证。通过基本型工作流,您可以更精细地控制分发给用户的凭证。增强型身份验证流程的 GetCredentialsForIdentity 请求根据访问令牌的内容请求角色。经典工作流程中的AssumeRoleWithWebIdentity请求使您的应用程序能够更好地请求您配置了足够信任策略的任何 Amazon Identity and Access Management 角色的凭证。您也可以请求自定义角色会话持续时间。

  1. GetId

  2. GetOpenIdToken

  3. AssumeRoleWithWebIdentity


                外部提供商基本工作流程

已经过开发人员验证的身份验证流程

使用经开发人员验证的身份(身份池)时,客户端将使用包括 Amazon Cognito 外部代码的不同身份验证流程,在您自己的身份验证系统中验证用户。Amazon Cognito 外部代码如此处所示。

增强型身份验证流程

  1. 通过开发人员提供商登录(Amazon Cognito 外部代码)

  2. 验证用户登录(Amazon Cognito 外部代码)

  3. GetOpenIdTokenForDeveloperIdentity

  4. GetCredentialsForIdentity


                已经过开发人员验证的增强型身份验证流程

基本身份验证流程

  1. 通过开发人员提供商登录(Amazon Cognito 外部代码)

  2. 验证用户登录(Amazon Cognito 外部代码)

  3. GetOpenIdTokenForDeveloperIdentity

  4. AssumeRoleWithWebIdentity


                已经过开发人员验证的基本身份验证流程

我应该使用哪种身份验证流程?

对于大多数客户,增强型流程是正确的选择,因为它与基本流程相比可提供很多优势:

  • 用来在设备上获取凭证的网络调用少一个。

  • 所有调用都面向 Amazon Cognito,这意味着它的网络连接也少一个。

  • 角色不再需要嵌入到应用程序中,只需一个身份池 ID 和区域即可开始引导启动凭证。

自 2015 年 2 月起,Amazon Cognito 控制台显示使用增强型流程的示例代码。此外,如果您的身份池没有使用增强型流程所需的角色关联,控制台会显示一条通知。

以下是支持增强型流程的最低开发工具包版本:

SDK(最低版本)

  • Amazon 适用于 iOS 的 SDK (2.0.14)

  • Amazon 适用于 Android 的 SDK (2.1.8)

  • Amazon 适用于 JavaScript (2.1.7) 的软件开发工具包

  • Amazon 适用于 Unity 的 SDK (1.0.3)

  • Amazon 适用于 Xamarin 的软件开发工具包 (3.0.0.5)

如果您要使用的角色不只是在控制台中创建新身份池时配置的两个默认角色,请使用基本流程。

API 摘要

GetId

GetId API 调用是在 Amazon Cognito 中建立新身份所必需的第一个调用。

未经身份验证的访问

Amazon Cognito 能够在您的应用程序中授权未经身份验证的访客访问。如果您的身份池中已启用此功能,用户可以随时通过 GetId API 请求新的身份 ID。该应用程序应缓存此身份 ID,以对 Amazon Cognito 发出后续调用。 Amazon 移动版 SDK 和浏览器 JavaScript 中的 S Amazon DK 都有凭据提供商,可以为您处理缓存。

经过身份验证的访问

在您将应用程序配置为支持公共登录提供商(Facebook、Google+、Login with Amazon 或 Sign in with Apple)后,用户也可以提供用于在这些提供商中识别他们的令牌(OAuth 或 OpenID Connect)。在对 GetId 的调用中使用时,Amazon Cognito 创建一个经过身份验证的新身份,或者是返回已与该特定登录关联的身份。Amazon Cognito 通过向提供商验证令牌并确保以下各项来实现此目的:

  • 令牌有效且来自已配置的提供商。

  • 令牌未过期。

  • 令牌与使用该提供商创建的应用程序标识符(如 Facebook 应用程序 ID)匹配。

  • 令牌与用户标识符匹配。

GetCredentialsForIdentity

在建立身份 ID 后,即可调用 GetCredentialsForIdentity API。此 API 在功能上等同于调用 GetOpenIdToken 随后调用 AssumeRoleWithWebIdentity

要让 Amazon Cognito 代表您调用 AssumeRoleWithWebIdentity,您的身份池必须具有与之关联的 IAM 角色。为此,您可以使用 Amazon Cognito 控制台,也可以通过 SetIdentityPoolRoles 手动操作实现此目的。

GetOpenIdToken

在建立身份 ID 后,即可发出 GetOpenIdToken API 请求。在您的第一个请求后缓存身份 ID,然后使用 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。如果此值不同,则必须更新本地缓存。浏览器中的 Amazon 移动 SDK 或 Amazon SDK JavaScript 中的提供商会为您执行此操作。

GetOpenIdTokenForDeveloperIdentity

使用已经过开发人员验证的身份时,GetOpenIdTokenForDeveloperIdentity API 将替代设备使用的 GetIdGetOpenIdToken。由于此 API 调用是由您的 Amazon 证书签名的,因此 Amazon Cognito 可以信任 API 调用中提供的用户标识符是有效的。这将替代 Amazon Cognito 对外部提供商执行的令牌验证。

此 API 的负载包含一个登录映射,其中必须包含您的开发人员提供商密钥,以及作为系统中用户标识符的值。如果用户标识符尚未关联到现有身份,Amazon Cognito 会创建新的身份,并为该身份返回新身份 ID 以及 OpenID Connect 令牌。如果用户标识符已关联,Amazon Cognito 返回预先存在的身份 ID 和 OpenID Connect 令牌。在您的第一个请求后缓存开发人员身份 ID,然后使用 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 天。

关联登录名

与外部提供商一样,提供尚未与身份关联的额外登录名会将这些登录名隐式关联到该身份。如果您将一个外部提供者登录名链接到一个身份,用户可以对该提供者使用外部提供者身份验证流程。但是,他们无法在调用 GetIdGetOpenIdToken 时使用登录映射中的开发人员提供者名称。

合并身份

借助已经过开发人员验证的身份,Amazon Cognito 支持隐式合并以及通过 MergeDeveloperIdentities API 进行显式合并。通过显式合并,您可以使用系统中的用户标识符将两个身份标记为单个身份。如果您提供了源和目标用户标识符,Amazon Cognito 会将其合并。您下次为任一用户标识符请求 OpenID Connect 令牌时,系统都会返回同一身份 ID。

AssumeRoleWithWebIdentity

在你获得 OpenID Connect 令牌后,你可以通过 AssumeRoleWithWebIdentity API 调用 Amazon Security Token Service (STS) 用它来换取临时 Amazon 证书。这个调用与直接使用 Facebook、Google+、Login with Amazon 或 Sign in with Apple 的情况并无不同。唯一的例外是您传递 Amazon Cognito 令牌,而不是其他某个公共提供商的令牌。

由于可以创建的身份数量没有限制,所以您务必要了解向用户授予的权限。为应用程序设置不同的角色:一个用于未经身份验证的用户,一个用于经过身份验证的用户。默认情况下,当您首次设置身份池时,Amazon Cognito 控制台会为您创建这些角色。这两个角色的访问策略将完全相同:它将授予用户访问 Amazon Cognito Sync 的权限,并且这些用户可将事件提交到 Amazon Mobile Analytics。您可以修改这些角色以满足您的需求。

了解有关 角色信任和权限 的更多信息。

† 原定设置 Amazon Cognito 身份 jwks_uri 文档包含有关在大多数 Amazon Web Services 区域中用于签署身份池令牌的密钥的信息。以下区域有不同的 jwks_uri 文档。

Amazon Cognito Identity JSON web key URIs in other Amazon Web Services 区域
Amazon Web Services 区域 jwks_uri 文档的路径
Amazon GovCloud (US-West) https://cognito-identity。 us-gov-west-1.amazonaws.com/.well-known/jwks_uri
China (Beijing) https://cognito-identity.cn-north-1.amazonaws.com.cn/.well-known/jwks_uri
Opt-in Regions like Europe (Milan) and Africa (Cape Town) https://cognito-identity.Region.amazonaws.com/.well-known/jwks_uri

您还可以从颁发者推断出 jwks_uri,或者从 Amazon Cognito 推断出在 OpenID 令牌中收到的 iss。OIDC 标准发现端点 <issuer>/.well-known/openid-configuration 列出了您的令牌的 jwks_uri 的路径。