Amazon Cognito 常见问题

一般性问题

借助 Amazon Cognito,您可以在几分钟内将用户注册、登录、访问控制和代理的 AWS 服务访问权限添加到您的 Web 应用程序和移动应用程序中。它是一项以开发人员为中心且经济高效的服务,可提供安全、基于租户并能够扩展到数百万用户的身份存储和联合身份验证选项。Amazon Cognito 可以帮助您创建品牌客户体验、提高安全性并适应您客户的需求。例如,它支持通过社交身份提供商进行登录,以及使用 WebAuthn 通行密钥或者短信和电子邮件一次性密码进行无密码登录。Amazon Cognito 支持多种合规性标准,按照开放身份标准运行,并与大量的开发资源和软件开发工具包库集成。

借助 Amazon Cognito,您可以专注于创建卓越的应用程序体验,而不用担心如何构建、保护和扩展解决方案以进行用户管理和身份验证。

您可以访问 AWS 管理控制台,以轻松开始使用这项服务。如果您没有 Amazon Web Services 账户,可以在登录控制台时创建一个。创建用来管理用户的用户池或用于联合身份的身份池之后,即可将您的应用程序和 API 与 OAuth 和 OpenID Connect(OIDC)集成。

请参阅我们的入门资源,以了解更多信息。

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

符合。Cognito 会公开服务器端 API。您可以直接调用这些 API 来创建您自己的连接至 Cognito 的自定义接口。服务器端 API 在《开发人员指南》中予以说明。

选配的 AWS 移动开发工具包中包含对 Cognito 的支持,目前支持的平台有 iOS、Android、Unity 和 Kindle Fire。还可以在适用于 .NET、C++、Go、Java、JavaScript、PHP v3、Python、Ruby v3 的 AWS SDK 以及命令行界面中使用 Cognito。

请访问我们的资源页面,以查看和下载可用的软件开发工具包。

不可以。Cognito 会以 Web 服务的形式公开其控制和数据 API。您可以使用自己的客户端库来直接调用服务器端 API。

为您的 Web 应用程序和移动应用程序添加注册和登录功能

对于第一要素身份验证器,Amazon Cognito 支持用户名/密码、电子邮件 OTP 无密码、短信 OTP 无密码和 WebAuthn 通行密钥。Cognito 支持以下多重身份验证器(MFA):电子邮件 OTP、短信 OTP 和 TOTP 身份验证器。此外,客户和合作伙伴还可以使用 AWS Lambda 扩展,通过自定义身份验证流程实现对第三方产品和定制身份验证器的支持。

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

用户池是一个基于租户的用户目录,您可以为您的 Web 应用程序和移动应用程序配置此目录。用户池可以安全地存储用户的资料属性,并支持自定义架构。您可以使用 AWS 管理控制台、AWS CLI 或 AWS 开发工具包创建和管理用户群体。

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

能。您可以利用别名功能,让您的用户使用电子邮件地址与密码,或电话号码与密码注册或登录。

要了解更多信息,请访问我们的文档

 

可以。您可以在设置或配置您的用户池时设置密码策略,例如密码长度、字符复杂性和密码历史记录要求。此外,Amazon Cognito 还支持对每一次的用户注册、登录和密码更改执行凭证泄露检查,以确保用户没有使用已在其他站点泄露的密码进行登录。

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

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

可以。您可以使用 AWS Lambda 来自定义注册和登录流程。例如,您可以创建 AWS Lambda 函数,以识别欺诈或对用户数据执行额外验证。您可以在注册前、确认(注册)后、身份验证前、身份验证期间和身份验证后触发自定义 Lambda 函数。您也可以使用 Lambda 函数来自定义进行电子邮件验证、电话号码验证以及多重验证时发送的消息。

可以。您可以在 Cognito 用户池中记住用于访问您的应用程序的设备,并将记住的设备与您的应用程序用户关联。如果您设置了多重身份验证,您还可以选择使用记住的设备阻止对您的用户进行第二重验证(自适应身份验证)。

您可以通过两种方法将用户从您的应用程序的现有用户目录或数据库迁移到用户池:即时(JIT)迁移和批量迁移。

当用户登录到您的应用程序时,Amazon Cognito 可以使用内置 AWS Lambda 触发器帮助您即时迁移用户。使用 Lambda 触发器,您可以从外部系统迁移用户的数据,而无需强制他们重置密码。

另外,通过上传包含所有应用程序用户配置文件数据的 CSV 文件,您可以批量迁移用户。您可以通过 Amazon Cognito 控制台、API 或 AWS CLI 上传该 CSV 文件。在首次登录时,用户必须使用发送至他们电子邮件地址或电话号码的验证码来确认他们的账户并创建一个新密码。

要了解更多信息,请参阅将用户导入到用户池

支持对 AWS 资源进行访问

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

您可以使用 Amazon、Facebook、Twitter、Sign in with Apple、Google 社交身份提供商、OpenID Connect(OIDC)身份提供商、SAML 身份提供商、Amazon Cognito 用户池和自定义开发人员提供商。

身份池使您能够为用户创建唯一的身份,并将他们安全地与 AWS 服务提供商联合。客户可以将 Amazon Cognito 身份池用作一个凭证代理,以获取具有有限权限并用来访问 AWS 资源的临时 AWS 凭证。

用户可以通过 Amazon Cognito 用户池、OIDC 身份提供商、SAML 身份提供商或社交身份提供商进行登录,并获得对 Amazon S3 存储桶或 Amazon DynamoDB 记录等 AWS 服务的基于角色的访问权限。Identity Pool 不存储任何用户资料。一个身份池可以关联到一个或多个应用。如果您为两个应用使用两个不同的身份池,则同一个终端用户在每个身份池中都会有一个不同的唯一识别符。

移动应用程序会使用提供商的软件开发工具包与身份提供商 (IdP) 进行验证。使用 IdP 对最终用户进行身份验证之后,从 IdP 返回的 OpenID Connect 令牌或 SAML 断言将由您的应用程序发送给 Cognito 身份池,然后为用户返回一个新的 Cognito ID 和一组具有有限权限的临时 AWS 凭证。

Cognito 身份池可以与您现有的身份验证系统集成。只需一次 API 调用,您就可以根据自己的唯一用户标识符来检索最终用户的 Cognito ID。一旦您检索到 Cognito ID 和 OpenID 令牌,就可以使用 Cognito 身份池客户端软件开发工具包访问 AWS 资源并同步用户数据。

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

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

不会。Cognito Identity 不会从身份提供商处接收任何保密信息(例如电子邮件地址、

无论是对于未经身份验证的用户还是经过身份验证的用户,Cognito 身份池都支持令牌创建和贩售过程。这样就不再需要为应用设计额外的登录屏幕,但仍然让用户使用临时性受限权限证书来访问 AWS 资源。

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

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

是的,Cognito 身份池支持在单个设备(例如全家人使用的 iPad)上使用多个独立的身份。每个身份独立处理,同时您完全控制应用程序如何登录和注销用户以及如何存储本地和远程应用程序数据。

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

Cognito 身份池控制台中的身份数量表示您通过 Cognito 身份池 API 创建了多少个身份。对于经过身份验证的身份(通过 Facebook 或 OpenID Connect 提供商等登录提供商登录的那些身份),对 Cognito 身份池的 GetId API 进行的每次调用只能为每个用户创建一个身份。但对于未经过身份验证的身份,应用中的客户端每调用一次 GetId API 都能生成一个新身份。因此,如果您的应用为某个用户的未经过身份验证的身份多次调用 GetId,将出现一个用户拥有多个身份的情况。因此,当使用未经身份验证的身份时,请务必缓存来自 GetId 的响应,而不要让每个用户多次调用它。

移动软件开发工具包会自动提供用于缓存 Cognito 身份池数据的逻辑,因此您不必为此费心。如果您想获得完整的应用分析解决方案,包括独立用户跟踪功能,请参阅 Amazon Mobile Analytics。

定价

要了解 Amazon Cognito 用户池定价,请参阅 Amazon Cognito 定价页面

要计算预估成本,请使用 AWS 定价计算器

 

您需要根据每月活跃用户数(MAU)为 Amazon Cognito 用户池付费。如果在某个日历月内,您的应用程序为某用户生成了身份操作,例如管理创建或更新、注册、登录、注销、令牌刷新、密码更改、用户账户属性更新或用户属性查询(AdminGetUser API),则该用户将被计为 MAU。您无需为后续会话或该日历月内的不活跃用户付费。通常情况下,您的用户总数以及您的操作次数会明显大于 MAU 总数。

有关 Amazon Cognito Sync 定价,请参阅 Amazon Cognito 定价页面

SMS 消息收发功能用于验证电话号码,在用户忘记或重设密码时发送代码,或者用于多重身份验证,此功能将单独收费。请参阅 Worldwide SMS 定价页面,以了解更多信息。

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

是的,Amazon Cognito 用户池 SKU 和 Essentials SKU 对于前 1 万个 MAU 是免费的。在 2024 年 11 月 21 日之前拥有活跃 Amazon Cognito 用户池的客户账户有资格获得 5 万个 MAU 的免费套餐。

作为 AWS 免费套餐的一部分,符合条件的 AWS 客户可以在前 12 个月中获得每月 10GB 云同步存储空间和 1000000 次同步操作。

使用 Amazon Cognito 身份池对用户进行身份验证以及生成唯一标识符都是免费的

使用 Cognito 事件触发 Lambda 函数不会产生额外费用,但是在您的 Lambda 函数执行过程中所使用的 AWS Lambda 和其他 AWS 服务会按照正常费率计费。

请参阅 AWS Lambda 定价页面,以了解详细信息。

 

不算。您决定何时调用 synchronize() 方法。设备的每一次读或写的对象都是本地的 SQLite 存储。这样您便可完全掌控成本开支。

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