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

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

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

外部提供商身份验证流程

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

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

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

当您使用增强型身份验证流程时,您的应用程序首先显示 GetID 请求中来自已授权 Amazon Cognito 用户池或第三方身份提供商的 ID 令牌。应用程序将该令牌交换为身份池中的身份 ID。然后,身份 ID 将用于 GetCredentialsForIdentity 请求中的相同身份提供商令牌。增强型工作流通过在后台执行 GetOpenIdTokenAssumeRoleWithWebIdentity 为您简化凭证检索。GetCredentialsForIdentity 返回 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 SDK for iOS(2.0.14)

  • Amazon SDK for Android(2.1.8)

  • Amazon SDK for JavaScript(2.1.7)

  • Amazon SDK for Unity(1.0.3)

  • Amazon SDK for Xamarin (3.0.0.5)

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

API 摘要

GetId

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

未经身份验证的访问

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

经过身份验证的访问

在您将应用程序配置为支持公共登录提供商(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,那么这可能是您在应用程序会话期间首先执行的调用。

未经身份验证的访问

要为未经身份验证的身份获取令牌,您只需身份 ID 本身。无法为经过身份验证的身份或禁用的身份获取未经身份验证的令牌。

经过身份验证的访问

如果您有一个经过身份验证的身份,您必须为已与该身份关联的登录名传递至少一个令牌。在 GetOpenIdToken 调用期间,所有传入的令牌都必须通过之前提到的同一验证;如果有任何令牌失败,整个调用都会失败。GetOpenIdToken 调用的响应中还包括身份 ID。这是因为您传入的身份 ID 可能不是返回的那个身份 ID。

关联登录名

如果您为未与任何身份关联的登录名传入令牌,该登录名将视为已“链接”到关联身份。您只能为每个公共提供商链接一个登录名。如果尝试将多个登录名链接到一个公共提供商,将导致 ResourceConflictException 错误响应。如果登录名只链接到一个现有身份,则 GetOpenIdToken 返回的身份 ID 将与传入的相同。

合并身份

如果您为目前未链接到给定身份,但链接到另一身份的登录名传入令牌,这两个身份将合并。两个身份一旦合并,其中一个身份会成为所有关联登录名的父项/所有者,另一个身份会被禁用。在这种情况下,将返回父项/所有者的身份 ID。如果此值不同,则必须更新本地缓存。Amazon Mobile SDKs 或 Amazon SDK for JavaScript in the Browser 中的提供商为您执行此操作。

GetOpenIdTokenForDeveloperIdentity

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

此 API 的负载包含一个登录映射,其中必须包含您的开发人员提供商密钥,以及作为系统中用户标识符的值。如果用户标识符尚未链接到现有身份,Amazon Cognito 创建新的身份,并为该身份返回新身份 ID 以及 OpenId Connect 令牌。如果用户标识符已关联,Amazon Cognito 返回预先存在的身份 ID 和 OpenId Connect 令牌。

关联登录名

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

合并身份

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

AssumeRoleWithWebIdentity

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

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

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