用户池应用程序客户端 - Amazon Cognito

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

用户池应用程序客户端

用户池应用程序客户端是用户池中的一项配置,它与一个通过 Amazon Cognito 进行身份验证的移动或 Web 应用程序进行交互。应用程序客户端可以调用经过身份验证和未经身份验证的API操作,并读取或修改用户的部分或全部属性。您的应用程序必须在操作中向应用程序客户端表明自己的身份,才能注册、登录和处理忘记的密码。这些API请求必须包括使用应用程序客户端 ID 进行自我识别以及使用可选客户端密钥进行授权。您必须保护所有应用程序客户端IDs或密钥,以便只有经过授权的客户端应用程序才能调用这些未经身份验证的操作。此外,如果您将应用程序配置为使用 AWS 凭证签署经过身份验证的API请求,则必须保护您的凭据免受用户检查。

您可以为一个用户池创建多个应用程序。应用程序客户端可能链接到应用程序的代码平台,也可能链接到用户池中的单独租户。例如,您可以为服务器端应用程序和其他 Android 应用程序创建一个应用程序。每个应用程序都有各自的应用程序客户端 ID。

应用程序客户端类型

在 Amazon Cognito 中创建应用程序客户端时,您可以根据标准OAuth客户端类型(公共客户端和机密客户端)预先填充选项。使用客户端密钥配置机密客户端 有关客户端类型的更多信息,请参阅 IETFRFC6749 #2 .1。

公有客户端

公有客户端在浏览器或移动设备上运行。由于它没有可信的服务器端资源,所以它没有客户端密钥。

机密客户端

机密客户端具有服务器端资源,可通过客户端密钥信任这些资源,用于未经身份验证API的操作。该应用程序可在后端服务器上作为守护进程或 Shell 脚本运行。

客户端密钥

客户端密钥或客户端密码是一个固定字符串,您的应用程序在向应用程序客户端API发出的所有请求中都必须使用该字符串。您的应用程序客户端必须有客户端密钥才能执行 client_credentials 授权。欲了解更多信息,请参阅 IETFRFC6749 #2 .3.1。

您在创建应用程序后无法更改密钥。如果要轮换密钥,您可以创建一个具备新私有密钥的新应用程序。您也可以删除应用程序,以便阻止使用该应用程序客户端 ID 的应用程序的访问。

您可以将机密客户端和客户端密钥用于公有应用程序。使用 Amazon CloudFront 代理添加SECRET_HASH在途中。有关更多信息,请参阅博客上的 “使用亚马逊 CloudFront 代理保护 Amazon Cognito 的公共客户端” AWS 。

JSON网络代币

Amazon Cognito 应用程序客户端可以发行以下类型的JSON网络令牌 (JWTs)。

身份(ID)令牌

一份可验证的声明,表明您的用户是从用户池进行的身份验证。Open ID Connect (OIDC) 在 2.0 定义的访问和刷新令牌标准中添加了 ID 令牌规范。OAuthID 令牌包含身份信息,例如用户属性,您的应用程序可以使用这些信息来创建用户个人资料和配置资源。请参阅使用 ID 令牌了解更多信息。

访问令牌

您的用户访问权限的可验证声明。访问令牌包含作用域、OIDC和 OAuth 2.0 的一项功能。您的应用程序可以为后端资源提供范围,并证明您的用户池已授权用户或计算机访问来自或他们自己的用户数据的数据。API具有自定义范围的访问令牌(通常来自 M2M 客户端凭证授权)用于授权访问资源服务器。请参阅使用访问令牌了解更多信息。

刷新令牌

一种加密的初始身份验证声明,当您的用户令牌到期时,您的应用程序可以将其提供给您的用户池。刷新令牌请求会返回新的未到期访问令牌和 ID 令牌。请参阅使用刷新令牌了解更多信息。

您可以在 Amazon Cognito 控制台的用户池的应用程序集成选项卡中,为每个应用程序客户端设置这些令牌的到期时间。

应用程序客户端术语

以下术语是 Amazon Cognito 控制台中应用程序客户端的可用属性。

允许的回调 URLs

回调URL指示成功登录后用户将被重定向到何处。至少选择一个回调URL。回调URL必须:

  • 做个绝对的人URI。

  • 已预先向客户端注册。

  • 不包含片段组件。

请参阅 OAuth2.0-重定向端点

Amazon Cognito 要求使用 HTTPS 而不是 HTTP,但 http://localhost(仅用于测试目的)除外。

还支持URLs诸如之myapp://example类的应用程序回调。

允许注销 URLs

URL注销表示注销后您的用户将被重定向到何处。

属性读取和写入权限

您的用户群可能有很多客户,每个客户都有自己的应用程序客户端,并且 IdPs。您可以将应用程序客户端配置为仅对与应用程序相关的用户属性具有读写权限。在 machine-to-machine (M2M)授权之类的情况下,您可以不授予对任何用户属性的访问权限。

属性读取和写入权限配置的注意事项
  • 当您创建应用程序客户端并且不自定义属性读写权限时,Amazon Cognito 会向所有用户池属性授予读写权限。

  • 您可以授予对不可变自定义属性的写入权限。创建或注册用户时,您的应用程序客户端可以将值写入不可变属性。此后,您将无法为用户的任何不可变自定义属性写入值。

  • 应用程序客户端必须拥有对用户池中必要属性的写入权限。Amazon Cognito 控制台会自动将必要属性设置为可写属性。

  • 您不能允许应用程序客户端对 email_verifiedphone_number_verified 拥有写入权限。用户池管理员可以修改这些值。用户只能通过属性验证来更改这些属性的值。

身份验证流程

您的应用程序客户端允许的登录方法。您的应用程序可以支持使用用户名和密码进行身份验证、安全远程密码 (SRP)、使用 Lambda 触发器的自定义身份验证以及令牌刷新。作为最佳安全实践,请使用SRP身份验证作为您的主要登录方法。托管用户界面会自动使用用户登录SRP。

自定义范围

自定义范围是您在资源服务器中为自己的资源服务器定义的范围。格式是 resource-server-identifier/scope。 请参阅使用资源服务器进行范围、M2M 和API授权

默认重定向 URI

将用户身份验证请求中的redirect_uri参数替换为第三方 IdPs。使用CreateUserPoolClientUpdateUserPoolClientAPI请求的DefaultRedirectURI参数配置此应用程序客户端设置。此人还URL必须是您的应用程序客户端的成员。CallbackURLs在以下情况下,Amazon Cognito 会将经过身份验证的会话重定向到此:URL

  1. 您的应用程序客户端分配了一个身份提供商并URLs定义了多个回调。当身份验证请求不包含redirect_uri参数URI时,您的用户池将对授权服务器的身份验证请求重定向到默认重定向。

  2. 您的应用程序客户端分配了一个身份提供商并URLs定义了一个回调。在这种情况下,没有必要定义默认回调URL。不包含redirect_uri参数的请求会重定向到一个可用的回调URL。

身份提供者

您可以选择部分或全部用户池外部身份提供商 (IdPs) 来对用户进行身份验证。您的应用程序客户端还可以仅对用户池中的本地用户进行身份验证。当您将 IdP 添加到应用程序客户端时,可以生成指向 IdP 的授权链接,并将其显示在您的托管 UI 登录页面上。您可以分配多个 IdPs,但必须至少分配一个。有关使用外部的更多信息 IdPs,请参阅通过第三方添加用户池登录

OpenID Connect 范围

选择以下一个或多个 OAuth 范围来指定可以为访问令牌请求的访问权限。

  • openid 范围声明您要检索 ID 令牌和用户的唯一 ID。它还会请求全部或部分用户属性,具体取决于请求中的其他范围。除非您请求 openid 范围,否则 Amazon Cognito 不会返回 ID 令牌。openid 范围授权结构化 ID 令牌声明,例如过期时间和密钥 ID,并确定您在 UserInfo 端点 的响应中收到的用户属性。

    • openid 是您请求的唯一范围时,Amazon Cognito 会使用当前应用程序客户端可以读取的所有用户属性填充 ID 令牌。对仅具有此范围的访问令牌的 userInfo 响应将返回所有用户属性。

    • 当您使用其他范围(例如 phoneemailprofile)请求 openid 时,ID 令牌和 userInfo 返回用户的唯一 ID 以及由其他范围定义的属性。

  • phone 范围授予对 phone_numberphone_number_verified 声明的访问权限。此范围只能通过 openid 范围来请求。

  • email 范围授予对 emailemail_verified 声明的访问权限。此范围只能通过 openid 范围来请求。

  • aws.cognito.signin.user.admin范围允许访问需要访问令牌的 Amazon Cognito 用户池API操作,例如UpdateUserAttributes和。VerifyUserAttribute

  • profile 范围授予对客户端可读取的所有用户属性的访问权限。此范围只能通过 openid 范围来请求。

有关作用域的更多信息,请参阅标准OIDC作用域列表。

OAuth拨款类型

OAuth授权是一种检索用户池令牌的身份验证方法。Amazon Cognito 支持以下类型的授权。要将这些OAuth授权集成到您的应用程序中,您必须向用户池中添加域名。

授予授权代码

授权码授权会生成一个代码,您的应用程序可以用它与令牌端点交换用户池令牌。当您交换授权码时,您的应用程序会收到 ID、访问权限和刷新令牌。与隐式授权一样,这种OAuth流程发生在用户的浏览器中。授权码授权是 Amazon Cognito 提供的最安全的授权,因为令牌在用户的会话中不可见。相反,您的应用程序会生成返回令牌的请求,并可以将其缓存在受保护存储空间中。有关更多信息,请参阅 IETFRFC6749 #1 .3.1 中的授权码

注意

作为公共客户端应用程序的最佳安全实践,请仅激活授权码授予OAuth流程,并实现代码交换的 Proof Key (PKCE) 以限制令牌交换。使用PKCE,只有当客户端向令牌端点提供的密码与原始身份验证请求中提供的密码相同,他们才能交换授权码。有关的更多信息PKCE,请参阅 IETFRFC7636

隐式授予

隐式授权直接从对端点授权向用户的浏览器会话提供访问权限和 ID 令牌,但不返回刷新令牌。隐式授权取消了对令牌端点的单独请求的要求,但与PKCE刷新令牌不兼容,也不会返回刷新令牌。该授权适用于无法完成授权码授权的测试场景和应用程序架构。有关更多信息,请参阅 IETFRFC6749 #1 .3. 2 中的隐式授权。您可以在应用程序客户端中同时激活授权码授权和隐式授权,然后按需使用每个授权。

客户端凭证授权

客户端凭证授予用于 machine-to-machine (M2M) 通信。授权码和隐式授权向经过身份验证的人类用户发放令牌。客户端凭证向非交互式系统授予基于范围的授权。API您的应用程序可以直接从令牌端点请求客户端凭证并接收访问令牌。有关更多信息,请参阅 IETFRFC6749 #1 .3.4 中的客户端凭证。您只能在具有客户端机密且不支持授权码或隐式授权的应用程序客户端中激活客户端凭证授权。

注意

由于您没有以用户身份调用客户端凭证流程,因此该授权只能向访问令牌添加自定义范围。自定义范围就是您为自己的资源服务器定义的范围。默认范围(例如 openidprofile)不适用于非人类用户。

由于 ID 令牌是对用户属性的验证,因此它们与 M2M 通信无关,客户凭证授权也不会发放 ID 令牌。请参阅 使用资源服务器进行范围、M2M 和API授权

客户凭证授予会增加您的 AWS 账单费用。有关更多信息,请参阅 Amazon Cognito 定价

创建应用程序客户端

AWS Management Console
创建应用程序客户端(控制台)
  1. 转到 Amazon Cognito 控制台。如果出现提示,请输入您的 AWS 凭据。

  2. 选择用户池

  3. 从列表中选择一个现有用户池,或创建一个用户池。

  4. 选择应用程序集成选项卡。

  5. 选择应用程序客户端下的创建应用程序客户端

  6. 选择应用程序类型公有客户端机密客户端,或者其它

  7. 输入应用程序客户端名称

  8. 选择生成客户端密钥,让 Amazon Cognito 为您生成一个客户端密钥。客户端密钥通常与机密客户端关联。

  9. 选择您希望在应用程序客户端中允许的身份验证流程

  10. 配置身份验证流程会话持续时间。这是您的用户在会话令牌过期之前必须完成每个身份验证质询的时间。

  11. (可选)如果您要配置令牌过期时间,请完成以下步骤:

    1. 指定应用程序客户端的刷新令牌的过期时间。默认值为 30 天。您可以将其更改为 1 小时到 10 年之间的任何值。

    2. 指定应用程序客户端的访问令牌的过期时间。默认值为 1 小时。您可以将其更改为 5 分钟到 24 小时之间的任何值。

    3. 指定应用程序客户端的 ID 令牌的过期时间。默认值为 1 小时。您可以将其更改为 5 分钟到 24 小时之间的任何值。

      重要

      如果您使用托管 UI 并将令牌生命周期配置为不到一小时,用户将能够根据其会话 Cookie 持续时间使用令牌,该 Cookie 当前固定在一小时。

  12. 是否为此应用程序客户端选择启用令牌撤消。这将增加 Amazon Cognito 发出的令牌的大小。

  13. 选择您是否将针对此应用程序客户端防止用户已存在错误。Amazon Cognito 将响应不存在的用户的登录请求,并显示一条指出用户名或密码不正确的通用消息。

  14. 如果要在此应用程序客户端中使用托管 UI,请配置托管 UI 设置

    1. 输入一个或多个允许的回调URLs。在这些网站或应用程序URLs中,您希望 Amazon Cognito 在用户完成身份验证后将其重定向。

    2. 输入一个或多个允许的注销。URLs这些是您URLs希望您的应用程序在向的请求中接受的注销端点

    3. 选择一个或多个您希望用户能够登录应用程序的身份提供者。您可以选择现有的任何组合 IdPs。您可以单独使用您的用户池对用户进行身份验证,也可以使用您在用户池中配置的一个或多个第三方 IdPs 对用户进行身份验证。

    4. 选择您希望应用程序客户端接受的 OAuth2.0 授权类型

      • 选择授权码授权以将代码传递给您的应用程序,该应用程序可以向令牌端点兑换令牌。

      • 选择隐式授权,以将 ID 令牌和访问令牌直接传递给您的应用程序。隐式授予流程将令牌直接透露给您的用户。

      • 选择客户端凭证以将访问令牌传递给您的应用程序,这不是基于它对用户凭证的了解,而是基于它对客户端密钥的了解。客户端凭证授予流程与授权码和隐式授予流程是互斥的。

    5. 选择您要授权与应用程序客户端结合使用的 OpenID Connect 范围。您可以通过用户池生成仅具有aws.cognito.signin.user.admin范围的访问令牌API。对于其他范围,您必须从令牌端点请求访问令牌。

    6. 选择您要授权与应用程序客户端结合使用的自定义范围。自定义范围最常用于向第三方授予访问权限APIs。

  15. 为此应用程序客户端配置属性读取和写入权限。您的应用程序客户端有权限读取和写入用户池属性模式的全部或有限子集。

  16. 选择创建应用程序客户端

  17. 记下客户端 ID。这将识别注册和登录请求中的应用程序客户端。

AWS CLI
aws cognito-idp create-user-pool-client --user-pool-id MyUserPoolID --client-name myApp
注意

使用回调和注销的JSON格式URLs,以CLI防止将它们视为远程参数文件:

--callback-urls "["https://example.com"]" --logout-urls "["https://example.com"]"

有关更多信息,请参阅 AWS CLI 命令参考:create-user-pool-client

Amazon Cognito user pools API

生成CreateUserPoolClientAPI请求。必须为所有您不想设置为默认值的参数指定一个值。

更新用户池应用程序客户端(AWS CLI 和 AWS API)

在 AWS CLI,输入以下命令:

aws cognito-idp update-user-pool-client --user-pool-id "MyUserPoolID" --client-id "MyAppClientID" --allowed-o-auth-flows-user-pool-client --allowed-o-auth-flows "code" "implicit" --allowed-o-auth-scopes "openid" --callback-urls "["https://example.com"]" --supported-identity-providers "["MySAMLIdP", "LoginWithAmazon"]"

如果命令成功,则 AWS CLI 返回确认信息:

{ "UserPoolClient": { "ClientId": "MyClientID", "SupportedIdentityProviders": [ "LoginWithAmazon", "MySAMLIdP" ], "CallbackURLs": [ "https://example.com" ], "AllowedOAuthScopes": [ "openid" ], "ClientName": "Example", "AllowedOAuthFlows": [ "implicit", "code" ], "RefreshTokenValidity": 30, "AuthSessionValidity": 3, "CreationDate": 1524628110.29, "AllowedOAuthFlowsUserPoolClient": true, "UserPoolId": "MyUserPoolID", "LastModifiedDate": 1530055177.553 } }

有关更多信息,请参阅 AWS CLI 命令参考:update-user-pool-client.

AWS API: UpdateUserPoolClient

获取有关用户池应用程序客户端的信息(AWS CLI 和 AWS API)

aws cognito-idp describe-user-pool-client --user-pool-id MyUserPoolID --client-id MyClientID

有关更多信息,请参阅 AWS CLI 命令参考:describe-user-pool-client.

AWS API: DescribeUserPoolClient

列出用户池中的所有应用程序客户端信息(AWS CLI 和 AWS API)

aws cognito-idp list-user-pool-clients --user-pool-id "MyUserPoolID" --max-results 3

有关更多信息,请参阅 AWS CLI 命令参考:list-user-pool-clients.

AWS API: ListUserPoolClients

删除用户池应用程序客户端(AWS CLI 和 AWS API)

aws cognito-idp delete-user-pool-client --user-pool-id "MyUserPoolID" --client-id "MyAppClientID"

有关更多信息,请参阅 AWS CLI 命令参考:delete-user-pool-client

AWS API: DeleteUserPoolClient