管理托管 UI 和授权服务器
带有域的 Amazon Cognito 用户池是符合 OAuth-2.0 标准的授权服务器和用于身份验证的即用型托管用户界面(UI)。授权服务器路由身份验证请求,发布和管理 JSON Web 令牌(JWT),并提供用户属性信息。托管 UI 是一系列 Web 界面,用于处理用户池中的基本注册、登录、多重身份验证和密码重置活动。它还是通过与应用程序关联的第三方身份提供者(IdP)进行身份验证的中心枢纽。当您想要对用户进行身份验证和授权时,应用程序可以调用托管 UI 和授权端点。您可以通过自己的徽标和 CSS 自定义来使托管 UI 用户体验适合您的品牌。有关托管 UI 和授权服务器的组件的更多信息,请参阅用户池端点和托管 UI 参考。
注意
Amazon Cognito 托管 UI 不支持使用自定义身份验证质询 Lambda 触发器进行自定义身份验证。
主题
使用 Amazon Amplify 设置托管 UI
如果您使用 Amazon Amplify 向 Web 或移动应用程序添加身份验证功能,则可以使用 Amazon Amplify 框架中的命令行界面(CLI)和库来设置托管 UI。要向应用程序添加身份验证功能,您可以使用 Amazon Amplify CLI 将 Auth
类别添加到项目中。然后,在客户端代码中,您可以使用 Amazon Amplify 库,通过 Amazon Cognito 用户池对用户进行身份验证。
您可以显示预构建的托管 UI,也可以通过重定向到社交登录提供商(例如 Facebook、Google、Amazon 或 Apple)的 OAuth 2.0 端点联合用户身份。用户成功通过社交服务提供商身份验证之后,如果需要,Amazon Amplify 在您的用户池中创建一个新用户,并向您的应用程序提供用户的 OIDC 令牌。
以下示例显示了如何在应用程序中使用 Amazon Amplify 设置社交服务提供商的托管 UI。
使用 Amazon Cognito 控制台设置托管 UI
创建应用程序客户端
-
转到 Amazon Cognito 控制台
。如果出现提示,请输入 Amazon 凭证。 -
选择用户池。
-
从列表中选择一个现有用户池,或创建一个用户池。
-
选择应用程序集成选项卡。
-
选择应用程序客户端下的创建应用程序客户端。
-
选择应用程序类型:公有客户端、机密客户端,或者其它。公有客户端通常在用户的设备上运行,并使用未经身份验证和令牌身份验证的 API。机密客户端通常在您通过客户端密钥和 API 凭证信任的中央服务器上的应用程序运行,并使用授权标头和 Amazon Identity and Access Management 凭证对请求进行签名。如果您的使用案例与预配置的应用程序的公有客户端或机密客户端应用程序设置不同,请选择其它。
-
输入应用程序客户端名称。
-
选择您希望在应用程序客户端中允许的身份验证流程。
-
配置身份验证流程会话持续时间。这是您的用户在会话令牌过期之前必须完成每个身份验证质询的时间。
-
(可选)配置令牌的到期时间。
-
指定应用程序客户端的刷新令牌的过期时间。默认值为 30 天。您可以将其更改为 1 小时到 10 年之间的任何值。
-
指定应用程序客户端的访问令牌的过期时间。默认值为 1 小时。您可以将其更改为 5 分钟到 24 小时之间的任何值。
-
指定应用程序客户端的 ID 令牌的过期时间。默认值为 1 小时。您可以将其更改为 5 分钟到 24 小时之间的任何值。
重要
如果您使用托管 UI 并将令牌生命周期配置为不到一小时,用户将能够根据其会话 Cookie 持续时间使用令牌,该 Cookie 当前固定在一小时。
-
-
选择生成客户端密钥,让 Amazon Cognito 为您生成一个客户端密钥。客户端密钥通常与机密客户端关联。
-
是否为此应用程序客户端选择启用令牌撤消。这会增加令牌的大小。有关更多信息,请参阅撤消令牌。
-
是否为此应用程序客户端选择防止暴露用户存在的错误消息。Amazon Cognito 将响应不存在的用户的登录请求,并显示一条指出用户名或密码不正确的通用消息。
-
(可选)为此应用程序客户端配置属性读取和写入权限。您的应用程序客户端有权限读取和写入用户池属性架构的有限子集。
-
选择创建。
-
记下客户端 ID。这将识别注册和登录请求中的应用程序客户端。
配置应用程序
-
在应用程序集成选项卡的应用程序客户端下,选择您的应用程序客户端。检查当前托管 UI信息。
-
在允许的回调 URL 下选择添加回调 URL。回调 URL 是在用户成功登录之后将被重新导向的地址。
-
在允许的注销 URL 下选择添加注销 URL。注销 URL 是在您的用户注销后会被重新导向的地址。
-
从身份提供商列表中添加至少一个列出的选项。
-
在 OAuth 2.0 授予类型下,选择授权代码授予以返回随后更换为用户池令牌的授权代码。由于令牌绝不会直接向终端用户公开,因此它们不太可能被泄露。但是,后端需要自定义应用程序以将授权代码换成用户池令牌。出于安全原因,对于移动应用程序,强烈建议您将授权代码授予流程与代码交换的证明密钥(PKCE)
一起使用。 -
在 OAuth 2.0 授予类型下,选择隐式授予,以便从 Amazon Cognito 将用户池 JSON Web 令牌(JWT)返回给您。当没有可用于将授权代码更换为令牌的后端时,您可以使用此流程。它对于调试令牌也很有帮助。
-
您可以同时启用授权代码和隐式代码,然后按需使用每个授予。如果未选中授权代码或隐式代码授权,并且您的应用程序客户端具有客户端密钥,您可以启用客户端凭证授权。只有在您的应用程序需要代表自己而不是代表用户请求访问令牌时,才选择客户端凭证。
-
选择您要为此应用程序客户端授权的 OpenID Connect 范围。
-
选择保存更改。
配置域
-
导航到用户池的应用程序集成选项卡。
-
选择在域旁边的操作,然后选择创建自定义域或创建 Cognito 域。如果您已配置用户池域,请先选择删除 Cognito 域或删除自定义域,然后再创建新的自定义域。
-
输入可用的域前缀,将其与 Cognito 域结合使用。有关设置自定义域的信息,请参阅将您自己的域用于托管 UI
-
选择创建。
查看您的登录页面
在 Amazon Cognito 控制台中,请在应用程序集成选项卡中的应用程序客户端和分析下,选择应用程序客户端配置中的 查看托管 UI 按钮。此按钮会将您转到托管 UI 中的登录页面,其中包含以下基本参数。
-
应用程序客户端 id
-
授权代码授予请求
-
对您为当前应用程序客户端激活的所有范围的请求
-
当前应用程序客户端列表中的第一个回调 URL
当您想要测试托管 UI 的基本功能时,查看托管 UI 按钮很有用。您可以使用其他和修改后的参数自定义登录 URL。在大多数情况下,查看托管 UI 链接的自动生成的参数不完全符合您的应用程序需求。在这些情况下,您必须自定义应用程序在用户登录时调用的 URL。有关登录参数键和值的更多信息,请参阅 用户池端点和托管 UI 参考。
托管 UI 登录网页使用以下 URL 格式。此示例使用 response_type=code
参数请求授权码授予。
https://
<your domain>
/oauth2/authorize?response_type=code
&client_id=<your app client id>
&redirect_uri=<your callback url>
您可以从应用程序集成选项卡中检索您的用户池域字符串。在同一个选项卡中,您可以在应用程序客户端和分析下识别应用程序客户端 ID、其回调 URL、其允许的范围和其他配置。
当您使用自定义参数导航到 /oauth2/authorize
端点时,Amazon Cognito 会将您重定向到 /oauth2/login
端点,或者在您具有 identity_provider
或 idp_identifier
参数时,静默地将您重定向到 IdP 登录页面。有关绕过托管 UI 的示例 URL,请参阅 SAML 会话在 Amazon Cognito 用户池中启动。
关于隐式授予的托管 UI 请求示例
您可以使用针对隐式代码授予的以下 URL 查看托管 UI 登录网页,其中 response_type=token
。成功登录后,Amazon Cognito 会将用户池令牌返回到您的 Web 浏览器的地址栏。
https://
mydomain.us-east-1.amazoncognito.com
/authorize?response_type=token&client_id=1example23456789
&redirect_uri=https://mydomain.example.com
身份令牌和访问令牌显示为附加到您的重定向 URL 的参数。
以下内容是来自隐式授予请求的示例响应。
https://
mydomain.example.com
/#id_token=eyJraaBcDeF1234567890
&access_token=eyJraGhIjKlM1112131415
&expires_in=3600&token_type=Bearer
托管 UI 和授权服务器需知信息
托管 UI 和确认用户为管理员
对于用户池本地用户,当您将用户池配置为允许 Cognito 自动发送消息以进行验证和确认时,托管 UI 效果最佳。当您启用此设置时,Amazon Cognito 会向注册的用户发送一条包含确认码的消息。当您改而确认用户为用户池管理员时,在注册后托管 UI 会显示一条错误消息。在这种状态下,Amazon Cognito 已创建新用户,但无法发送验证消息。您仍然可以确认用户为管理员,但他们可能会在遇到错误后联系您的支持部门。有关管理确认的更多信息,请参阅允许用户在您的应用程序中注册但以用户池管理员身份进行确认。
查看您对托管 UI 配置所做的更改
如果未立即显示对托管 UI 页面的更改,请等待几分钟,然后刷新页面。
解码用户池令牌
使用 RS256 算法对 Amazon Cognito 用户池令牌进行签名。您可以使用 Amazon Lambda 解码和验证用户池令牌,请参阅 GitHub 上的解码和验证 Amazon Cognito JWT 令牌
托管 UI 和 TLS 版本
托管 UI 需要在传输过程中加密。Amazon Cognito 提供的用户池域要求的最低 TLS 版本为 1.2。自定义域支持但不需要 TLS 1.2。由于 Amazon Cognito 管理托管 UI 和授权服务器端点的配置,因此您无法修改用户池域的 TLS 要求。
托管 UI 和 CORS 策略
Amazon Cognito 托管 UI 不支持自定义跨源资源共享(CORS)源策略。托管 UI 中的 CORS 策略将阻止用户在其请求中传递身份验证参数。应在应用程序的 Web 前端中实施 CORS 策略。Amazon Cognito 会对发往以下 OAuth 端点的请求返回 Access-Control-Allow-Origin:
*
响应标头。
托管 UI 和授权服务器 Cookie
Amazon Cognito 用户池端点会在用户的浏览器中设置 Cookie。这些 Cookie 符合某些浏览器的要求,即要求网站不能设置第三方 Cookie。它们的范围仅限于您的用户池端点,包括以下内容:
-
每个请求有一个
XSRF-TOKEN
Cookie。 -
一个
csrf-state
Cookie,用于在重定向用户时保持会话一致性。 -
一个
cognito
会话 Cookie,用于将成功的登录尝试保留一小时。
在 iOS 中,您可以阻止所有 Cookie