本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 Amazon Cognito 和 AWS Amplify UI 对现有 React 应用程序用户执行身份验证
Daniel Kozhemyako,Amazon Web Services
Summary
此模式展示了如何使用 AWS Amplify UI 库和 Amazon Cognito 用户池向现有的前端 React 应用程序添加身份验证功能。
此模式使用 Amazon Cognito 为应用程序提供身份验证、授权和用户管理。它还使用 A mplify UI
实现此模式后,用户可使用以下任何凭证登录:
用户名和密码
社交身份提供商,例如 Apple、Facebook、Google 和 Amazon
SAML 2.0 或 OpenID Connect (OIDC) 兼容的企业身份提供程序
注意
为了创建自定义身份验证 UI 组件,可以在无头模式下运行 Authenticator UI 组件。
先决条件和限制
先决条件
活跃的 AWS 账户
React 18.2.0 或更高版本的 Web 应用程序
Node.js 和 npm 6.14.4 或更高版本,已安装
限制
此模式仅适用于 React Web 应用程序。
此模式使用预先构建的 Amplify UI 组件。该解决方案不包括实现自定义 UI 组件所需步骤。
产品版本
Amplify UI 6.1.3 或更高版本(第 1 代)
Amplify 6.0.16 或更高版本(第 1 代)
架构
目标架构
下图介绍了一种使用 Amazon Cognito 对 React Web 应用程序的用户进行身份验证的架构。

工具
AWS 服务
Amazon Cognito 为您的 Web 和移动应用程序提供身份验证、授权和用户管理。
其他工具
Amplify UI
是开源用户界面库,提供可自定义的组件,您可以将其连接到云端。 Node.js
是一个事件驱动的 JavaScript 运行时环境,专为构建可扩展的网络应用程序而设计。 npm
是在 Node.js 环境中运行的软件注册表,用于共享或借用软件包以及管理私有软件包的部署。
最佳实践
如果正在构建新应用程序,我们建议您使用 Amplify Gen 2。
操作说明
| Task | 说明 | 所需技能 |
|---|---|---|
创建用户池。 | 创建 Amazon Cognito 用户池。配置用户池的登录选项和安全要求,以适合您的使用案例。 | 应用程序开发人员 |
添加应用程序客户端。 | 配置用户池应用程序客户端。您的应用程序需要通过此客户端才能与 Amazon Cognito 用户池进行交互。 | 应用程序开发人员 |
| Task | 说明 | 所需技能 |
|---|---|---|
安装依赖项。 | 要安装
| 应用程序开发人员 |
配置用户池。 | 根据下面的示例,创建一个
| 应用程序开发人员 |
导入与配置 Amplify 服务。 |
| 应用程序开发人员 |
添加身份验证器 UI 组件。 | 若要显示
注意示例代码片段导入 该
请参见以下示例组件:
注意对于示例 | 应用程序开发人员 |
(可选)检索会话信息。 | 用户通过身份验证后,您可从 Amplify 客户端检索有关其会话的数据。例如,您可从用户的会话中检索 JSON Web 令牌 (JWT),这样您就可以对来自其会话的请求进行身份验证,然后再向后端 API 发送请求。 参见以下含 JWT 请求标头示例:
| 应用程序开发人员 |
问题排查
| 问题 | 解决方案 |
|---|---|
新用户无法注册此应用程序。 | 如下所述,确保您的 Amazon Cognito 用户池已配置为允许用户自行注册以加入用户池。
|
从 v5 升级到 v6 后,身份验证组件停止工作。 | 在 Amplify v6 中, |
相关资源
创建新 React 应用程序
(React 文档) 什么是 Amazon Cognito? (Amazon Cognito 文档)
Amplify UI 库
(Amplify 文档)
附加信息
该 App.js 文件应包含以下代码:
import './App.css'; import { Amplify } from 'aws-amplify'; import awsExports from './aws-exports'; import { fetchAuthSession } from 'aws-amplify/auth'; import { Authenticator } from '@aws-amplify/ui-react'; import '@aws-amplify/ui-react/styles.css'; Amplify.configure({ ...awsExports }); let token = (await fetchAuthSession()).tokens?.idToken?.toString(); function App() { return ( <Authenticator> {({ signOut, user }) => ( <div> <p>Welcome {user.username}</p> <p>Your token is: {token}</p> <button onClick={signOut}>Sign out</button> </div> )} </Authenticator> ); } export default App;