View a markdown version of this page

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

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

使用 Amazon Cognito 用户池进行身份验证

Amazon Cognito 包含多种对用户进行身份验证的方法。用户可以使用 WebAuthn 密码和密钥登录。Amazon Cognito 可以通过电子邮件或短信向他们发送一次性密码。您可以实现 Lambda 函数,以编排您自己的质询与响应序列。这些是身份验证流程。在身份验证流程中,用户提交一个密钥,Amazon Cognito 验证该密钥后,会颁发 JSON Web 令牌(JWT),供应用程序使用 OIDC 库进行处理。本章介绍如何在各种应用程序环境中为各种身份验证流程配置用户池和应用程序客户端。它涵盖了使用托管登录的托管登录页面以及在 Amazon SDK 中构建自己的逻辑和前端的选项。

所有用户池(无论您是否具有域)都可以在用户池 API 中对用户进行身份验证。如果您向用户池添加域,则可以使用用户池端点。用户池 API 支持针对 API 请求的各种授权模型和请求流程。

为了验证用户的身份,Amazon Cognito 支持多种身份验证流程,这些流程除了密码之外,还结合了其他类型的质询,例如电子邮件和短信一次性密码以及通行密钥。

在配置详细信息之前,请选择适合您的应用程序的身份验证方法。以下决策辅助工具总结了两个入口点以及定制应用程序中的两个初始登录流程。每个选项都链接到其详细部分。

你想让 Amazon Cognito 托管登录页面,还是构建自己的前端?

如果您想要省力的路径,请使用托管登录。Amazon Cognito 托管登录、注销和密码重置页面,您的应用程序使用 OpenID Connect (OIDC) 中继方库处理结果。托管登录会自动显示您的用户池和应用程序客户端配置所允许的身份验证方法。

如果您想构建自己的用户界面并控制登录逻辑,请使用 S Amazon DK。您的应用程序直接调用用户池 API,然后您实现质询-响应逻辑。

在定制应用程序中,您是从用户那里收集登录方法,还是预先声明?

如果您想为用户提供可用登录方法列表并让他们选择一种方法,请选择基于选择的身份验证(USER_AUTH流程)。此流程是提供无密码登录和密钥登录的唯一方法。

例如USER_SRP_AUTH,当您的应用程序已经知道用户将如何登录并预先声明流程时,请选择基于客户端的身份验证。 Client-based身份验证是使用自定义身份验证和刷新令牌流的唯一方法。

基于选择的身份验证的先决条件

Choice-based 身份验证适用于托管登录和 S Amazon DK。要使用它,请ALLOW_USER_AUTH添加到应用程序客户端允许的身份验证流程中。此外,无密码和密钥方法还需要托管登录域和高于 Lite 级别(Essentials 或 Plus)的功能计划。

身份验证会话示例

下图和分步指南展示了一个典型场景:用户登录应用程序。示例应用程序向用户提供多种登录选项。用户通过输入凭证选择其中一种,随后提供额外的身份验证因素,最终完成登录。

一个流程图,显示一个应用程序,该应用程序提示用户输入并使用 S Amazon DK 登录。

设想一个应用程序,其登录页面允许用户通过用户名和密码登录、请求通过电子邮件发送的一次性验证码,或选择指纹验证选项。

  1. Sign-in promp t:您的应用程序显示带有 “登录” 按钮的主屏幕。

  2. 请求登录:用户选择登录。您的应用程序从 Cookie 或缓存中检索其用户名,或提示其输入用户名。

  3. 请求选项:您的应用程序请求用户的登录选项,方法是使用 USER_AUTH 流程发起 InitiateAuth API 请求,获取用户的可用登录方式。

  4. 发送登录选项:Amazon Cognito 返回 PASSWORD、EMAIL_OTP 和 WEB_AUTHN。该响应包含一个会话标识符,供您在下一个响应中回传。

  5. 显示选项:您的应用程序显示 UI 元素,供用户选择输入用户名和密码、获取一次性验证码,或扫描指纹。

  6. 选择 option/Enter 凭据:用户输入其用户名和密码。

  7. 发起身份验证:您的应用程序通过 RespondToAuthChallenge API 请求提交用户的登录信息,确认使用用户名密码进行登录,并提供相应的用户名和密码。

  8. 验证凭证:Amazon Cognito 确认用户提供的凭证。

  9. 额外质询:该用户已配置使用于身份验证器应用程序进行多重身份验证。Amazon Cognito 返回 SOFTWARE_TOKEN_MFA 质询。

  10. 质询提示:您的应用程序显示一个表单,请求用户输入其身份验证器应用程序生成的基于时间的一次性密码(TOTP)。

  11. 回答质询:用户提交该 TOTP。

  12. 响应质询:您的应用程序在另一个 RespondToAuthChallenge 请求中提供用户的 TOTP。

  13. 验证质询响应:Amazon Cognito 确认用户提交的验证码,并确定您的用户池未针对当前用户配置额外的质询。

  14. 颁发令牌:Amazon Cognito 返回 ID、访问和刷新 JSON Web 令牌(JWT)。用户的初始身份验证完成。

  15. 存储令牌:您的应用程序缓存用户的令牌,以便后续引用用户数据、授权资源访问,并在令牌过期时进行更新。

  16. 呈现授权内容:您的应用程序根据用户的身份和角色判断其资源访问权限,并提供相应的应用程序内容。

  17. 访问内容:用户已登录并开始使用该应用程序。

  18. 使用过期令牌请求内容:稍后,用户请求一个需要授权的资源。但用户缓存的令牌已过期。

  19. 刷新令牌:您的应用程序使用用户保存的刷新令牌发起 InitiateAuth 请求。

  20. 颁发令牌:Amazon Cognito 返回新的 ID 和访问 JWT。用户的会话在无需再次输入凭证的情况下安全地完成刷新。

您可以使用 Amazon Lambda 触发器来自定义用户进行身份验证的方式。作为身份验证流程的一部分,这些触发器将发布并验证自己的质询。

您也可以将管理员身份验证流程用于安全的后端服务器。您可以使用用户迁移身份验证流程来实现用户迁移,而无需用户重置密码。