AWS Cognito 用户池应用程序客户端中的设置意味着啥

Posted

技术标签:

【中文标题】AWS Cognito 用户池应用程序客户端中的设置意味着啥【英文标题】:What the settings mean in AWS Cognito User Pool App ClientAWS Cognito 用户池应用程序客户端中的设置意味着什么 【发布时间】:2019-06-11 19:02:48 【问题描述】:

我到处搜索,教程,网络,每个人都没有解释(我明白为什么)应用程序客户端设置中的复选框:

    为基于服务器的身份验证启用登录 API 只允许自定义身份验证 为基于应用的身份验证启用用户名-密码(非 SRP)流

了解更多链接对我没有帮助,很多信息并不那么容易理解,掌握。有人可以解释一下这个设置。谢谢

【问题讨论】:

【参考方案1】:

这是我对此事的看法。

App 客户端有多个 Auth Flow 配置。

1.为管理员 API 启用用户名密码身份验证以进行身份​​验证 (ALLOW_ADMIN_USER_PASSWORD_AUTH)

这将启用服务器端身份验证流程。如果您没有最终用户应用,而是使用安全的后端或服务器端应用。

2。启用基于 lambda 触发器的自定义身份验证 (ALLOW_CUSTOM_AUTH)

这将启用自定义身份验证流程。这可以帮助您使用 AWS Lambda 触发器创建基于质询/响应的身份验证模型。 https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-challenge.html

User Pools -> Triggers 下,您可以看到许多 lambda 函数。您可以使用 Create Auth ChallengeDefine Auth ChallengeVerify Auth Challenge Response 函数来创建自定义身份验证流程。

3.启用基于用户名密码的身份验证 (ALLOW_USER_PASSWORD_AUTH)

这将启用使用基于用户密码的身份验证的客户端身份验证流程。在此流程中,Cognito 在请求中接收密码。

您可以使用适用于 android 的 AWS 移动开发工具包、适用于 ios 的 AWS 移动开发工具包或适用于 javascript 的 AWS 开发工具包来实施。

4.启用基于 SRP(安全远程密码)协议的身份验证 (ALLOW_USER_SRP_AUTH)

这与第 3 节中的上述流程类似。除了密码验证。此流程使用 SRP 协议来验证密码。

http://srp.stanford.edu/whatisit.html https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UserPoolClientType.html

5.启用基于刷新令牌的身份验证 (ALLOW_REFRESH_TOKEN_AUTH)

身份验证成功后,Amazon Cognito 将用户池令牌(三个令牌)返回到您的应用程序。您可以使用令牌授予用户访问您自己的服务器端资源或 Amazon API 网关的权限。或者,您可以将它们换成临时 AWS 凭证以访问其他 AWS 服务。

三个token分别是ID Token(JWT)、Access Token、Refresh Token。刷新令牌可用于检索新 ID 和访问令牌。登录移动应用程序后,每次关闭和打开应用程序时都无需登录,此功能是使用刷新令牌实现的。

https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html

Amazon Cognito 托管 UI 怎么样?

可以将应用客户端配置为使用内置的 Cognito 网页来注册和登录用户。使用托管 UI 时,您可以同时启用授权代码授权和隐式代码授权,然后根据需要使用每个授权。

https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-app-idp-settings.html

【讨论】:

【参考方案2】:

这是我解释这些选项的尝试。在此之前,我想简要介绍一下 Oauth2,它是 AWS Cognito 所基于的协议。

在 AWS Cognito 的上下文中,Cognito 本身是 身份验证 (OAuth) 服务器,也是 资源服务器(因为我们在 Cognito 用户池中创建用户)和您的app 将是 Client(发送身份验证请求)。客户端必须先向 OAuth 服务器注册自己 - 这就是 Cognito 的“应用程序客户端”部分所做的。

推荐的 OAuth2 流是Authorization Code Grant flow。在这个流程中,

i) 客户端将用户名/密码发送到 OAuth 服务器。

ii) OAuth 服务器验证并回调客户端 授权码

iii) 客户端再次将此代码发送回 OAuth 服务器

iv) OAuth 服务器将令牌发送给客户端。

有关 OAuth2 的更多说明,请阅读上述链接文章。

现在解释 Cognito 应用客户端设置中的选项:

1.为基于服务器的身份验证启用登录 API

使用此选项,您的客户端应用程序可以直接接收令牌而无需首先获取授权码的额外步骤。

有像 AdminInitiateAuth、Admin-* 这样的 Cognito API 可以做到这一点。但是,这些 API 需要 AWS 管理员凭证。因此,这些调用通常由客户端应用程序的后端服务器完成。前端可以将用户名/密码传递给后端,后端服务器可以与 AWS Cognito 通信并对用户进行授权。

2。只允许自定义身份验证

此处您不使用 OAuth 提供的授权代码授予流程。相反,您可以定义自己的步骤和挑战。您的客户端应用程序可以在验证和提供令牌之前提出秘密问题等。

3.为基于应用的身份验证启用用户名-密码(非 SRP)流程

这是最不安全的流程。这样就跳过了返回授权码的部分,直接将token返回给客户端。

我希望这可以解释。

【讨论】:

以上是关于AWS Cognito 用户池应用程序客户端中的设置意味着啥的主要内容,如果未能解决你的问题,请参考以下文章

AWS Cognito Design:如何使用多个用户池管理多个用户?

在静态网页上保护 AWS Cognito 用户池和客户端 ID

aws cognito 用户池域 - Invalid_Request

Cognito 用户池作为具有客户端凭据的身份提供者仅在保存到 aws 控制台后才有效

同一 AWS Cognito 用户池中的多个应用程序对于同一用户来说 cognitoID 是不是相同?

使用 Cognito 用户池向 AWS AppSync 验证 Apollo 客户端