特定于应用程序的应用程序客户端设置
用户池应用程序客户端是用户池中的一项配置,它与一个通过 Amazon Cognito 进行身份验证的移动或 Web 应用程序进行交互。应用程序客户端可以调用经过授权和未经身份验证的 API 操作,并读取或修改用户的部分或全部属性。您的应用程序必须在操作中向应用程序客户端表明自己的身份,才能注册、登录和处理忘记的密码。这些 API 请求必须包括使用应用程序客户端 ID 进行自我识别以及使用可选客户端密钥进行授权的机制。您必须确保任何应用程序客户端 ID 或密钥的安全,以便只有经过授权的客户端应用程序才能调用这些未经身份验证的操作。此外,如果您将应用程序配置为使用 AWS 凭证签署经过身份验证的 API 请求,您必须保护您的凭证免受用户检查。
您可以为一个用户池创建多个应用程序。应用程序客户端可能链接到应用程序的代码平台,也可能链接到用户池中的单独租户。例如,您可以为服务器端应用程序和其他 Android 应用程序创建一个应用程序。每个应用程序都有各自的应用程序客户端 ID。
您可以在应用程序客户端级别应用以下用户池特征的设置:
应用程序客户端类型
在 Amazon Cognito 中创建应用程序客户端时,您可以根据标准 OAuth 客户端类型公有客户端和机密客户端预填充选项。使用客户端密钥配置机密客户端 有关客户端类型的更多信息,请参阅 IETF RFC 6749 #2.1
- 公有客户端
-
公有客户端在浏览器或移动设备上运行。由于它没有可信的服务器端资源,所以它没有客户端密钥。
- 机密客户端
-
机密客户端拥有可以信任的服务器端资源,使用客户端密钥进行未经身份验证的 API 操作。该应用程序可在后端服务器上作为守护进程或 Shell 脚本运行。
- 客户端密钥
-
客户端机密或客户端密码是一个固定字符串,您的应用程序必须在发送到应用程序客户端的所有 API 请求中使用该字符串。您的应用程序客户端必须有客户端密钥才能执行
client_credentials
授权。有关更多信息,请参阅 IETF RFC 6749 #2.3.1。 您在创建应用程序后无法更改密钥。如果要轮换密钥,您可以创建一个具备新私有密钥的新应用程序。您也可以删除应用程序,以便阻止使用该应用程序客户端 ID 的应用程序的访问。
您可以将机密客户端和客户端密钥用于公有应用程序。使用 Amazon CloudFront 代理添加传输中的 SECRET_HASH
。有关更多信息,请参阅 AWS 博客上的使用 Amazon CloudFront 代理保护 Amazon Cognito 的公共客户端
JSON Web 令牌
Amazon Cognito 应用程序客户端可以发放以下类型的 JSON Web 令牌(JWT)。
- 身份(ID)令牌
-
一份可验证的声明,表明您的用户是从用户池进行的身份验证。OpenID Connect(OIDC)在 OAuth 2.0 定义的访问和刷新令牌标准中添加了 ID 令牌规范
。ID 令牌包含身份信息,例如用户属性,您的应用程序可以使用这些信息来创建用户个人资料和配置资源。请参阅了解身份(ID)令牌了解更多信息。 - 访问令牌
-
您的用户访问权限的可验证声明。访问令牌包含范围
,这是 OIDC 和 OAuth 2.0 的一项特征。您的应用程序可以为后端资源提供范围,并证明您的用户池已授权用户或计算机访问来自 API 的数据或它们自己的用户数据。具有自定义范围的访问令牌(通常来自 M2M 客户端凭证授权)用于授权访问资源服务器。请参阅了解访问令牌了解更多信息。 - 刷新令牌
-
一种加密的初始身份验证声明,当您的用户令牌到期时,您的应用程序可以将其提供给您的用户池。刷新令牌请求会返回新的未到期访问令牌和 ID 令牌。请参阅了解刷新令牌了解更多信息。
您可以在 Amazon Cognito
应用程序客户端术语
以下术语是 Amazon Cognito 控制台中应用程序客户端的可用属性。
- 允许回调 URL
-
回调 URL 指示在用户成功登录之后将被重新导向到哪里。选择至少一个回调 URL。回调 URL 必须:
-
是绝对 URI。
-
已预先向客户端注册。
-
不包含片段组件。
请参阅 OAuth 2.0 – 重新导向端点
。 Amazon Cognito 要求使用
HTTPS
而不是HTTP
,但http://localhost
(仅用于测试目的)除外。应用程序回调 URL(如
myapp://example
)也受支持。 -
- 允许注销 URL
-
注销 URL 指示在您的用户注销后会被重定向到哪里。
- 属性读取和写入权限
-
您的用户池可能有许多客户,每个客户都有自己的应用程序客户端和 IdP。您可以将应用程序客户端配置为仅对与应用程序相关的用户属性具有读写权限。在机器对机器(M2M)授权等情况下,您可以不授予对任何用户属性的访问权限。
属性读取和写入权限配置的注意事项
- 身份验证流程
-
您的应用程序客户端允许的登录方法。您的应用程序可以支持使用用户名和密码的身份验证、安全远程密码(SRP)、使用 Lambda 触发器的自定义身份验证以及令牌刷新。作为最佳安全实践,请使用 SRP 身份验证作为您的主要登录方法。托管 UI 会自动使用 SRP 将用户登录。
- 自定义范围
-
自定义范围是您在资源服务器中为自己的资源服务器定义的范围。格式为:
资源-服务器-标识符
/范围
。请参阅 范围、M2M 和带资源服务器的 API。 - 默认的重定向 URI
-
将用户身份验证请求中的
redirect_uri
参数替换为第三方 IdP。使用 CreateUserPoolClient 或 UpdateUserPoolClient API 请求的DefaultRedirectURI
参数配置此应用程序客户端设置。此 URL 还必须是应用程序客户端的CallbackURLs
的成员。在以下情况下,Amazon Cognito 会将经过身份验证的会话重定向到此 URL: - 身份提供者
-
您可以选择部分或全部用户池外部身份提供者(IDP)来对用户进行身份验证。您的应用程序客户端还可以仅对用户池中的本地用户进行身份验证。当您将 IdP 添加到应用程序客户端时,可以生成指向 IdP 的授权链接,并将其显示在您的托管 UI 登录页面上。您可以分配多个 IdP,但必须至少分配一个。有关使用外部 IdP 的更多信息,请参阅通过第三方添加用户池登录。
- OpenID Connect 范围
-
选择以下一个或多个
OAuth
范围来指定可以为访问令牌请求的访问权限。-
openid
范围声明您要检索 ID 令牌和用户的唯一 ID。它还会请求全部或部分用户属性,具体取决于请求中的其他范围。除非您请求openid
范围,否则 Amazon Cognito 不会返回 ID 令牌。openid
范围授权结构化 ID 令牌声明,例如过期时间和密钥 ID,并确定您在 userInfo 端点 的响应中收到的用户属性。-
当
openid
是您请求的唯一范围时,Amazon Cognito 会使用当前应用程序客户端可以读取的所有用户属性填充 ID 令牌。对仅具有此范围的访问令牌的userInfo
响应将返回所有用户属性。 -
当您使用其他范围(例如
phone
、email
或profile
)请求openid
时,ID 令牌和userInfo
返回用户的唯一 ID 以及由其他范围定义的属性。
-
-
phone
范围授予对phone_number
和phone_number_verified
声明的访问权限。此范围只能通过openid
范围来请求。 -
email
范围授予对email
和email_verified
声明的访问权限。此范围只能通过openid
范围来请求。 -
aws.cognito.signin.user.admin
范围授权对需要访问令牌的 Amazon Cognito 用户池 API 操作的访问权限,例如 UpdateUserAttributes 和 VerifyUserAttribute。 -
profile
范围授予对客户端可读取的所有用户属性的访问权限。此范围只能通过openid
范围来请求。
有关范围的更多信息,请参阅标准 OIDC 范围
列表。 -
- OAuth 授权类型
-
OAuth 授权是一种检索用户池令牌的身份验证方法。Amazon Cognito 支持以下类型的授权。要将这些 OAuth 授权集成到您的应用程序中,您必须将域添加到您的用户池中。
授予授权代码
授权码授权会生成一个代码,您的应用程序可以用它与令牌端点交换用户池令牌。当您交换授权码时,您的应用程序会收到 ID、访问权限和刷新令牌。这种 OAuth 流程与隐式授权一样,都是在用户的浏览器中进行的。授权码授权是 Amazon Cognito 提供的最安全的授权,因为令牌在用户的会话中不可见。相反,您的应用程序会生成返回令牌的请求,并可以将其缓存在受保护存储空间中。有关更多信息,请参阅 IETF RFC 6749 #1.3.1
中的授权码。 注意
作为公共客户端应用程序的最佳安全实践,只激活授权码授权 OAuth 流程,并实施代码交换证明密钥(PKCE)以限制令牌交换。通过 PKCE,客户端只有在向令牌端点提供与原始身份验证请求中相同的机密时,才能交换授权码。有关 PKCE 的更多信息,请参阅 IETF RFC 7636
。 隐式授予
隐式授权直接从对端点授权向用户的浏览器会话提供访问权限和 ID 令牌,但不返回刷新令牌。隐式授权消除了向令牌端点提出单独请求的要求,但与 PKCE 不兼容,也不会返回刷新令牌。该授权适用于无法完成授权码授权的测试场景和应用程序架构。有关更多信息,请参阅 IETF RFC 6749 #1.3.2
中的隐式授权。您可以在应用程序客户端中同时激活授权码授权和隐式授权,然后按需使用每个授权。 客户端凭证授权
客户端凭证授权在机器到机器的通信中使用。授权码和隐式授权向经过身份验证的人类用户发放令牌。客户端凭证授权非交互式系统对 API 的基于范围的授权。您的应用程序可以直接从令牌端点请求客户端凭证并接收访问令牌。有关更多信息,请参阅 IETF RFC 6749 #1.3.4
中的客户端凭证。您只能在具有客户端机密且不支持授权码或隐式授权的应用程序客户端中激活客户端凭证授权。 注意
由于您没有以用户身份调用客户端凭证流程,因此该授权只能向访问令牌添加自定义范围。自定义范围就是您为自己的资源服务器定义的范围。默认范围(例如
openid
和profile
)不适用于非人类用户。由于 ID 令牌是对用户属性的验证,因此它们与 M2M 通信无关,客户凭证授权也不会发放 ID 令牌。请参阅 范围、M2M 和带资源服务器的 API。
客户端凭证授予会增加您的 AWS 账单成本。有关更多信息,请参阅 Amazon Cognito 定价
。
创建应用程序客户端
更新用户池应用程序客户端(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-idMyClientID
请参阅 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