开始使用 Amazon Cognito

问:什么是 Amazon Cognito?
借助 Amazon Cognito,您可以轻松将用户注册和身份验证功能添加到自己的移动和 Web 应用程序。Amazon Cognito 还支持您通过外部身份提供商对用户进行身份验证,并提供临时安全凭证,以供访问您的应用程序在 AWS 中的后端资源或 Amazon API Gateway 后的服务。Amazon Cognito 可与支持 SAML 或 OpenID Connect 的外部身份提供商和 Facebook、Twitter、Amazon 等社交身份提供商配合使用,同时您也可以将其与您自己的身份提供商相整合。

此外,Amazon Cognito 还支持您在用户的多台设备之间同步数据,以便用户在切换设备或升级至新设备时能够获得一致的应用程序体验。您的应用程序可以将数据本地保存在用户的设备上,这样一来,即使设备处于离线状态,您的应用程序仍然可以运行,并且会在设备重新上线后自动同步相关数据。

借助 Amazon Cognito,您可以集中精力打造出色的应用程序体验,在处理用户管理、身份验证以及跨平台和设备的同步操作时,无需担心解决方案的构建、保护和扩展。

问:谁应该使用 Amazon Cognito?
Amazon Cognito 是专为想要将用户管理和同步功能添加到其移动和 Web 应用程序的开发人员设计的。开发人员可以使用 Cognito Identity 将注册和登录功能添加到他们的应用程序,以便用户能够安全访问其应用程序的资源。Cognito 还使得开发人员能够跨设备、平台和应用程序同步数据。

问:Amazon Cognito 如何上手?
您可以通过访问 AWS 控制台轻松入门。如果您没有 Amazon Web Services 账户,可以在登录控制台时创建一个。在针对用户管理创建了用户池,或针对联合身份或同步操作创建了身份池之后,您便可下载 AWS 移动软件开发工具包并将其与您的应用程序集成。或者,您也可以直接调用 Cognito 服务器端 API,来代替使用软件开发工具包。有关更多信息,请参阅我们的开发人员指南

问:Amazon Cognito 是否会暴露服务器端 API?
是。Cognito 会公开服务器端 API。您可以直接调用这些 API 来创建连接至 Cognito 的自定义接口。服务器端 API 在《开发人员指南》中予以说明。

问:Amazon Cognito 支持哪些平台?
选配的 AWS 移动软件开发工具包中包含对 Cognito 的支持,目前支持的平台有 iOS、Android、Unity 和 Kindle Fire。另外,适用于 JavaScript 的 AWS 开发工具包中也包含 Cognito。目前,适用于 iOS 和 Android 的 AWS 移动软件开发工具包和适用于 Cognito 的 JavaScript AWS 软件开发工具包均支持“Your User Pools”功能。请访问我们的资源页面,以下载软件开发工具包。

问:我必须使用 AWS 移动开发工具包吗?
不需要。Cognito 会以 Web 服务的形式公开其控制和数据 API。您可以使用自己的客户端库来直接调用服务器端 API。

 

问:我能否使用自己的身份提供商来支持用户注册和登录功能?

可以。借助 Cognito Identity,您可以轻松且安全地将注册和登录功能添加到自己的应用程序。您的用户可以使用电子邮件、手机号码或用户名进行注册和登录。您也可以实现增强型安全功能,例如电子邮件验证、电话号码验证和多重验证。借助 Cognito Identity,您还可以自定义工作流程,例如,向用户注册功能中添加特定于应用程序的逻辑,从而通过 AWS Lambda 进行欺诈检测和用户验证。要了解更多信息,请访问我们的文档。

问:什么是 User Pool?

User Pool 是您可以为自己的 Web 和移动应用程序配置的用户目录。User Pool 可以安全存储用户的资料属性。您可以使用 AWS 控制台、AWS CLI 或 AWS 开发工具包创建和管理 User Pool。

问:Cognito Identity 支持哪些用户资料信息?

开发人员可以使用基于 OpenID Connect 的标准用户资料属性(例如用户名、电话号码、地址、时区等)或进行自定义以添加特定于应用程序的用户属性。

问:我能否让我的应用程序用户使用电子邮件地址或电话号码注册或登录?

可以。您可以利用别名功能,让您的用户使用电子邮件地址与密码或电话号码与密码注册或登录。要了解更多信息,请访问我们的文档

问:我能否设置密码策略?

能。您可以在设置或配置“Your User Pool”时设置密码策略,例如密码强度和字符类型要求。

问:我能否验证用户在注册应用程序时使用的电子邮件地址和电话号码?

能。借助 Cognito Identity,您可以要求验证用户的电子邮件地址和电话号码,然后再向其提供对您应用程序的访问权限。在注册过程中,系统将向用户的电话号码或电子邮件地址发送验证码,用户必须输入该验证码才能完成注册并得到确认。

问:Cognito Identity 是否支持基于短信的 Multi-Factor Authentication (MFA)?

支持,您可以让最终用户使用基于短信的 MFA 登录您的应用程序。在基于短信的 MFA 启用之后,系统将提示用户输入密码(第一重安全要素 – 用户已知的信息),以及只能通过手机短信收到的安全码(第二重安全要素 – 用户拥有的信息)。

问:能否自定义用户注册和登录工作流程?

能。您可以自定义用户注册和登录工作流程,只需使用 AWS Lambda 向用户注册和登录流程添加特定于应用程序的逻辑即可。例如,您可以创建 AWS Lambda 函数,以识别欺诈或对用户数据执行额外验证。您可以在用户注册之前、确认之后、身份验证之前、身份验证过程中(自定义验证项目时)以及身份验证之后触发开发人员提供的 Lambda 函数。您也可以使用 Lambda 函数来自定义进行电子邮件验证、电话号码验证以及多重验证时发送的消息。

问:我能否在 Cognito 的 User Pool 中记住与应用程序用户关联的设备?

可以。您可以在 Cognito 的 User Pool 中记住用于访问您的应用程序的设备,并将记住的设备与您的应用程序用户关联。如果您设置了多重身份验证,您也可以让记住的用户设备不经过第二重验证。

问:如何将我的现有用户迁移到 Amazon Cognito 用户池中?

您可以使用我们的导入工具将您的现有用户迁移到 Amazon Cognito 用户池中。用户属性值将从一个 .csv 文件中导入,该文件可以通过控制台、我们的 API 或 CLI 进行上传。当导入的用户首次登录时,他们将确认自己的账户并使用已发送到其电子邮件地址或手机的代码创建新密码。使用导入工具无需额外付费。要了解更多信息,请参阅导入工具文档

导入工具不会迁移密码。如果您想保留用户当前的密码,您可能要考虑使用备用方法,以在转换阶段,用户登录您的应用程序时逐个进行迁移。借助此方法,您的应用程序在用户登录时将首先尝试使用您的 Cognito 用户池中的用户信息。如果该用户在用户池中不存在,您的应用程序将使用您现有认证系统中的用户信息,并暂时保留登录所用的用户名和密码。用户使用您现有的认证系统成功登录之后,您的应用程序将随后使用相同的用户名和密码在您的 Cognito 用户池中创建用户。此方法在转换阶段需要继续使用您现有的认证系统,但在转换阶段结束后,您可以使用我们的导入工具来导入剩余用户 (不导入其密码)。 

问:我能否使用 Cognito Identity 联合身份并提供对 AWS 资源的安全访问?
能。Cognito Identity 支持您通过外部身份提供商对用户进行身份验证,并提供临时安全凭证,以供访问您的应用程序在 AWS 中的后端资源或 Amazon API Gateway 后的服务。Amazon Cognito 可与支持 SAML 或 OpenID Connect 的外部身份提供商和 Facebook、Twitter、Amazon 等社交身份提供商配合使用,同时您也可以将其与您自己的身份提供商相整合。

问:Amazon Cognito Identity 支持哪些公共身份提供商?
您可以使用 Amazon、Facebook、Twitter、Digits、Google 和其他任何兼容 OpenID Connect 的身份提供商。

问:什么是 Identity Pool?
Identity Pool 是 Cognito Identity 用于保持应用程序的联合身份井然有序的容器。Identity Pool 将社交身份提供商提供的联合身份与唯一用户特定标识符相关联。Identity Pool 不存储任何用户资料。一个身份池可以关联到一个或多个应用。如果您为两个应用使用两个不同的身份池,则同一个终端用户在每个身份池中都会有一个不同的唯一识别符。

问:登录流程如何与公共身份提供商配合工作?
移动应用程序会使用提供商的软件开发工具包与身份提供商 (IdP) 进行验证。使用 IdP 对最终用户进行验证后,从 IdP 返回的 OAuth 或 OpenID Connect 令牌或 SAML 断言会由应用程序发送给 Cognito Identity,然后为用户返回一个新的 Cognito ID 和一组权限受限的临时 AWS 凭证。

问:我能否注册自己的用户并对其进行身份验证?
Cognito Identity 可与您现有的身份验证系统集成。只需一次 API 调用,您就可以根据自己的唯一用户标识符来检索最终用户的 Cognito ID。检索到 Cognito ID 和 Cognito Identity 提供的 OpenID 令牌之后,您便可使用 Cognito Identity 客户端软件开发工具包来访问 AWS 资源和同步用户数据。Cognito Identity 是完全托管的身份提供商,旨在让您能够更轻松地为自己的移动和 Web 应用程序实现用户注册和登录功能。

问:Cognito Identity 如何帮助我控制权限和安全访问 AWS 服务?
Cognito Identity 会向您的用户分配一组具有有限权限的临时凭证,用于访问您的 AWS 资源,因此您无需使用自己的 AWS 账户凭证。每名用户的权限均通过您创建的 AWS IAM 角色进行控制。您可以定义规则来为每名用户选择 IAM 角色;如果您在 Cognito 用户池中使用组,则可以按照组来分配 IAM 角色。Cognito Identity 还允许您为未经身份验证的访客用户单独定义一个具有有限权限的 IAM 角色。此外,您也可以使用 Cognito 为用户生成的唯一标识符来控制对特定资源的访问。例如,您可以为 S3 存储桶创建一项策略,只允许每位用户访问该存储桶中他们自己的文件夹。

问:使用公共身份提供商时,Amazon Cognito Identity 是否会存储用户的凭证?

不会,您的应用程序直接与受支持的公共身份提供商(Amazon、Facebook、Twitter、Digits、Google 或某个兼容 OpenID Connect 的提供商)通信来对用户进行身份验证。Cognito Identity 不接收或存储用户凭证。Cognito Identity 使用身份提供商提供的令牌来获取唯一用户标识符,然后使用单向哈希功能对其进行哈希处理,这样在将来就能够再次识别出同一用户,无需存储实际的用户标识符。

问:Cognito Identity 是否会从身份提供商处接收或存储与我的用户相关的保密信息?
不会。Cognito Identity 不会从身份提供商处接收任何保密信息(例如电子邮件地址、朋友列表等)。

问:有了 Cognito Identity,我是否还需要自己的后端身份验证系统?
不需要。Cognito Identity 支持通过 Amazon、Facebook、Twitter、Digits 和 Google 登录,同时对未经身份验证的用户提供支持。Cognito Identity 支持联合身份验证、资料数据同步存储以及 AWS 访问令牌分配,无需编写任何后端代码。

问:如果我不想强制我的用户登录,怎么办?
对于未经身份验证的用户和经过身份验证的用户,Cognito Identity 均支持令牌的创建和贩售流程。这样就不再需要为应用设计额外的登录屏幕,但仍然让用户使用临时性受限权限证书来访问 AWS 资源。

问:什么是无验证用户?
未经验证的用户是指未通过任何身份提供商进行身份验证,但以访客身份访问您的应用程序的用户。您可以为这些用户单独定义一个 IAM 角色,向其提供有限的权限以供访问您的后端资源。

问:Cognito Identity 是否支持使用相同设备的不同用户拥有独立的身份?
支持。Cognito Identity 支持单个设备多个身份,例如家用 iPad。每个身份独立处理,同时您完全控制应用程序如何登录和注销用户以及如何存储本地和远程应用程序数据。

问:如何存储与 Cognito Identity 关联的数据?
您可以通过编程方式创建与 Cognito Identity 关联的数据集,然后以键/值对的形式保存数据。这些数据同时存储在本地设备和 Cognito 同步存储空间中。Cognito 也可以在最终用户的所有设备上同步此数据。

问:Cognito Identity 控制台中的身份数量能否反映有多少用户在使用我的应用程序?
Cognito Identity 控制台中的身份数量表示您通过 Cognito Identity API 创建了多少个身份。对于经过验证的身份(通过 Facebook 或 OpenID Connect 提供商等登录提供商登录的用户),对 Cognito Identity 的 GetId API 的每次调用只能为每位用户创建一个身份。但对于无验证身份,应用中的客户端每调用一次 GetId API 都能生成一个新身份。因此,如果您的应用为某个用户的无验证身份多次调用 GetId,将出现一个用户拥有多个身份的情况。所以,在使用未经验证的身份时,请务必缓存来自 GetId 的响应,以免为一位用户进行重复调用。

移动软件开发工具包将自动提供用于缓存 Cognito Identity 的逻辑,因此您不必为此担忧。如果您想获得完整的应用程序分析解决方案,包括唯一用户跟踪功能,请参阅 Amazon Mobile Analytics

问:什么是 Amazon Cognito 同步存储空间?
Amazon Cognito 同步存储空间是关联到 Amazon Cognito 身份的键/值对存储。在身份池和同步存储空间中可以创建任意数量的身份。同步存储空间中的每个 Amazon Cognito 身份都有自己的用户信息存储。

问:数据直接被保存到 Amazon Cognito 同步存储空间吗?
不是。可选的 AWS 移动开发工具包会将数据保存在本地设备的 SQLite 数据库中,如此一来数据就可以始终供应用取用。通过调用 synchronize() 方法将数据推送到 Amazon Cognito 同步存储空间,并且如果启用推送同步,与身份关联的所有其他设备都将通过 Amazon SNS 收到同步存储数据发生变化的通知。

问:数据如何保存到 Amazon Cognito 同步存储空间?
与 Amazon Cognito 身份关联的数据被组织为键/值对。键是标签,例如“MusicVolume”,还有值,例如“11”。键/值对使用数据集分组和分类。数据集是键/值对的逻辑分区,是 Amazon Cognito 用来执行同步作业的最细小单位。

问:Amazon Cognito 同步存储空间中用户信息存储的最大大小是多少?
每条用户信息存储最大为 20MB。用户信息存储中的每一个数据集可以包含最多 1MB 的数据。一个数据集最多可以包含 1024 个键。

问:在数据集中可以储存哪种数据?
数据集中的键和值都是数字字母字符串。字符串的长度没有限制,只是数据集中值的总量不得超过 1MB。二进制数据可以以 base64 编码字符串储存为一个值,该值不可以超过 1MB 的限制大小。

问:为什么数据集的限制大小是 1MB?
将数据集的大小限制在 1MB 可以提高完成同步任务的成功率,即使带宽有限,也不会反复重试而造成电池寿命和数据计划的浪费。

问:存储的用户身份和用户信息是否会在开发人员之中共享?
不会,存储的用户身份和信息与特定 AWS 账户关联。如果特定设备上出自不同发行商的多个应用都使用 Amazon Cognito,则每个应用将使用各自发行商创建的信息存储。

问:如何分析和查询储存在 Cognito 同步存储空间中的数据?
通过 Cognito 流服务,可以在 AWS 账户中将同步存储数据推送到 Kinesis 流。然后再使用这个流并以一种方便进行分析的方式储存数据,例如 Amazon Redshift 数据库、所拥有的 RDS 实例,甚或是 S3 文件。我们发布的示例 Kinesis 消费者应用程序旨在展示如何在 Amazon Redshift 中储存更新数据。

问:为何要使用 Kinesis 流服务替代数据库导出?
将数据以流的方式传输到 Kinesis,您可以实时掌握数据集所发生变更的全部历史记录。也就是说,您会收到终端用户对数据集的全部变更,这让您可以更灵活地将此数据储存在您选择的工具中。

问:要是已经将数据储存到了 Cognito 中怎么办?
当您启用 Kinesis 流功能后,您将能够进行批量发布。这一过程会将当前 Cognito 同步存储空间中储存的数据异步发送到您选择的 Kinesis 流。

问:这个功能如何收费?
Cognito 是将数据推送到您所拥有的 Kinesis 流。使用此功能的收费与 Cognito 单位同步价格一样。我们将对您使用的部分以 Kinesis 标准费率进行收费。

问:能否在保存数据前对其进行验证?
Amazon Cognito 事件允许开发人员运行 AWS Lambda 函数以响应 Cognito 中的重要事件。当任何数据集进行同步时,会发生 Sync Trigger 事件。开发人员可以编写一个 AWS Lambda 函数来阻止同步事件。该函数可以评估底层数据集发生的变化,然后在数据储存到云中并同步回用户的其他设备前对其进行操作。也可以将 AWS Lambda 函数用于阻断同步操作,这样数据就无法同步到用户的其他设备中。

问:数据如何与 Amazon Cognito 同步?
可以通过编程方式触发数据在客户端设备和 Amazon Cognito 同步存储空间之间同步,方法是在 AWS 移动开发工具包中使用 synchronize() 方法。synchronize() 方法会读取 Amazon Cognito 同步存储空间中可用数据的最新版本并将其与本地缓存的副本进行比较。比较后,synchronize() 方法会根据需要将最新的更新写入到本地数据存储空间和 Amazon Cognito 同步存储空间中。根据默认,Amazon Cognito 保留数据的最后写入版本。您可以通过编程方式替代这种行为并解决数据冲突。此外,推送同步可使您使用 Amazon Cognito 向与身份关联的所有设备发送无提示推送通知,以通知用户新数据可用。

问:什么是无提示推送通知?
Amazon Cognito 使用 Amazon Simple Notification Service (SNS) 向设备发送无提示推送通知。无提示推送通知是指由用户设备上的应用程序接收、用户看不见的推送消息。

问:如何使用推送同步?
要启用推送同步,您需要使用 AWS 管理控制台中的 Amazon SNS 页声明平台应用程序。然后,您可以从 AWS 管理控制台的 Amazon Cognito 页面中的身份池页面将 SNS 平台应用程序与您的 Cognito 身份池联系起来。Amazon Cognito 自动利用 SNS 平台应用程序向设备通知更改。

问:如何处理同步过程中的冲突?
默认情况下,Amazon Cognito 保留数据的最后写入版本。您可以通过选择对 AWS 移动开发工具包中的回调作出响应,来跨越这种行为,工具包中含有两种版本的数据。然后应用可以决定保留哪个版本的数据(本地的版本或 Amazon Cognito 同步存储空间中的版本)并将其保存在 Amazon Cognito 同步存储空间中。

问:Cognito Identity 如何收费?
使用 Amazon Cognito,您只需按实际用量付费。无最低费用,无预先承诺。

如果您使用 Cognito Identity 创建一个用户池,则只需按每月活跃用户 (MAU) 付费。如果某用户在某个日历月内有与身份相关的操作(如注册、登录、令牌刷新和密码更改),即会被计为 1 个 MAU。您无需为该日历月内的后续会话或不活跃用户付费。SMS 消息收发功能可以选择性使用,将单独计费,如下文所述。

“Your User Pool”功能提供每月 50000 个 MAU 的免费套餐。Cognito Identity 免费套餐在 AWS 免费套餐 12 个月的期限到期后不会自动过期,而是无期限地提供给现有的和新的 AWS 客户

在 Cognito Identity 中,进行联合身份验证和安全访问控制 AWS 资源始终是免费的。

问:Cognito Sync 如何收费?
Sync 收费的依据是 Amazon Cognito 同步存储空间中保存的数据总量以及同步操作执行的次数。同步操作会比较设备上的本地数据存储空间和云中的 Amazon Cognito 同步存储空间,然后对两个数据存储空间执行同步操作。

作为 AWS 免费套餐的一部分,符合条件的 AWS 客户可以在前 12 个月中获得每月 10GB 云同步存储空间和 1000000 次同步操作。每月超出免费套餐的部分,Amazon Cognito 按照每 10000 次同步操作 0.15 USD 和每 GB 同步存储空间 0.15 USD 的标准收费。

问:什么是同步操作?
当您使用 AWS 移动开发工具包调用 synchronize() 方法时,这就算作一次同步操作。如果您直接调用服务器 API,则当新的同步会话令牌发出后同步操作便会启动,并以成功写入或会话令牌超时结束。当您使用开发工具包 synchronize() 方法或直接调用服务器 API 时,同步操作以相同的费率收费。

问:什么是每月活跃用户 (MAU)?
当某用户在账单月内有相关的操作(如登录、令牌刷新、注册或密码更改)时,即会被视作活跃并被计为 1 个 MAU。因此,您无需为账单月内的后续操作或不活跃用户付费。通常情况下,您的用户总数以及您的操作次数会明显大于 MAU 总数。

问:Cognito 的 SMS 消息功能如何收费?
SMS 消息收发功能可以用于验证电话号码、在用户忘记或重设密码时发送代码或者用于多重身份验证,将单独收费。请参阅全球 SMS 定价页面了解更多信息。

问:AWS 免费套餐是否包含 Amazon Cognito?
是。作为 AWS 免费套餐的一部分,Cognito 最长可以在您开始使用的前 12 个月中提供每月 10GB 同步存储空间和 1000000 次同步操作。对于前 50000 个 MAU,Cognito Identity 的“Your User Pool”是免费的,对于超过此数值的 MAU,我们将提供基于容量的套餐。在 Cognito Identity 中,使用“Federated Identities”功能对用户进行身份验证和生成唯一标识符始终是免费的。

问:应用的每次读或写都算作一次同步操作吗?
否。您决定何时调用 synchronize() 方法。设备的每一次读或写的对象都是本地的 SQlite 存储。这样您便可完全掌控成本开支。

问:推送同步如何收费?
Cognito 利用 Amazon SNS 发送无提示推送通知。使用 Cognito 进行推送同步不会产生额外费用,但对于发送至设备的通知,将按照正常 Amazon SNS 费率计费。

问:将 Lambda 与 Amazon Cognito 事件搭配使用时,如何收费?
使用 Cognito 事件触发 Lambda 函数不会产生额外费用,但是在您的 Lambda 函数执行过程中所使用的 AWS Lambda 和其他 AWS 服务会按照正常费率计费。请参阅 AWS Lambda 定价页面,以了解详细信息。