本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
用户池应用程序客户端
用户池应用程序客户端是用户池中的一项配置,它与一个通过 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 的公共客户端
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)授权之类的情况下,您可以不授予对任何用户属性的访问权限。
属性读取和写入权限配置的注意事项
- 身份验证流程
-
您的应用程序客户端允许的登录方法。您的应用程序可以支持使用用户名和密码进行身份验证、安全远程密码 (SRP)、使用 Lambda 触发器的自定义身份验证以及令牌刷新。作为最佳安全实践,请使用SRP身份验证作为您的主要登录方法。托管用户界面会自动使用用户登录SRP。
- 自定义范围
-
自定义范围是您在资源服务器中为自己的资源服务器定义的范围。格式是
resource-server-identifier
/scope
。 请参阅使用资源服务器进行范围、M2M 和API授权。 - 默认重定向 URI
-
将用户身份验证请求中的
redirect_uri
参数替换为第三方 IdPs。使用CreateUserPoolClient或UpdateUserPoolClientAPI请求的DefaultRedirectURI
参数配置此应用程序客户端设置。此人还URL必须是您的应用程序客户端的成员。CallbackURLs
在以下情况下,Amazon Cognito 会将经过身份验证的会话重定向到此: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
响应将返回所有用户属性。 -
当您使用其他范围(例如
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 提供的最安全的授权,因为令牌在用户的会话中不可见。相反,您的应用程序会生成返回令牌的请求,并可以将其缓存在受保护存储空间中。有关更多信息,请参阅 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
中的客户端凭证。您只能在具有客户端机密且不支持授权码或隐式授权的应用程序客户端中激活客户端凭证授权。 注意
由于您没有以用户身份调用客户端凭证流程,因此该授权只能向访问令牌添加自定义范围。自定义范围就是您为自己的资源服务器定义的范围。默认范围(例如
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