Amazon Cognito
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

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

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

外部提供商身份验证流程

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

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

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

  1. GetId

  2. GetCredentialsForIdentity

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

基本 (经典) 工作流程

  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 控制台显示使用增强型流程的示例代码。此外,如果您的身份池没有使用增强型流程所需的角色关联,控制台将显示一条通知。

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

开发工具包 (最低版本)

  • 适用于 iOS 的 AWS 开发工具包 (2.0.14)

  • 适用于 Android 的 AWS 开发工具包 (2.1.8)

  • 适用于 JavaScript 的 AWS 开发工具包 (2.1.7)

  • 适用于 Unity 的 AWS 开发工具包 (1.0.3)

  • 适用于 Xamarin 的 AWS 开发工具包 (3.0.0.5)

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

API 摘要

GetId

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

未经身份验证的访问

Amazon Cognito 能够在您的应用程序中允许未经身份验证的来宾访问。如果您的身份池中已启用此功能,用户可以随时通过 GetId API 请求新的身份 ID。该应用程序应缓存此身份 ID,以对 Amazon Cognito 发出后续调用。AWS 移动开发工具包以及适用于浏览器中 JavaScript 的 AWS 开发工具包拥有可为您处理此缓存的凭证提供商。

经过身份验证的访问

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

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

  • 令牌未过期

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

  • 令牌与用户标识符匹配

GetCredentialsForIdentity

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

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

GetOpenIdToken

在建立身份 ID 后,即可调用 GetOpenIdToken API。如果您有缓存身份 ID,那么这可能是您在应用程序会话期间首先执行的调用。

未经身份验证的访问

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

经过身份验证的访问

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

链接登录名

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

合并身份

如果您为目前未链接到给定身份,但链接到另一身份的登录名传入令牌,这两个身份将合并。两个身份一旦合并,其中一个身份会成为所有关联登录名的父项/所有者,另一个身份会被禁用。在这种情况下,将返回父项/所有者的身份 ID。如果这个值不一致,您需要更新您的本地缓存 (如果您使用的提供商位于 AWS 移动开发工具包或者适用于浏览器中 JavaScript 的 AWS 开发工具包内,系统会为您处理这一问题)。

GetOpenIdTokenForDeveloperIdentity

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

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

链接登录名

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

合并身份

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

AssumeRoleWithWebIdentity

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

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

了解更多关于 角色信任和权限.