什么是用于登录 Amazon Cognito 用户池的 REST(或 CLI)API

What is the REST (or CLI) API for logging in to Amazon Cognito user pools

如何在没有官方 SDK 的平台上通过 Amazon Cognito REST APIs(对于用户池)进行登录? - 请注意,我要求的是用户池 - 而不是身份池。


剧情简介


Amazon cognito 提供 3 种登录方式:

我正在使用第二个(带用户池)


Amazon cognito 有几个用于 android、iOS、javascript、Xamarin 等的 SDK。Cognito 还提供 REST APIs 用于在支持的平台以外的平台上构建通过官方SDK。 我正在为不同的平台构建应用程序,因此,REST API 是我唯一的方法,因为没有官方 SDK我的平台。

Cognito REST API 为“注册”、“忘记密码”、“确认验证' 等等,但令人惊讶的是,REST API 没有任何用于简单登录/登录的端点.


来自 Cognito CLI API docs 我拥有所有 OFFICIAL CLI API 所需的“注册用户”,“确认注册", "更改密码", "验证phone 号码", "忘记密码" 等 令人惊讶的是,没有提到登录的 CLI API。 我希望应该有一些 CLI API 就像“$ aws cognito-idp log-in”就像“$ aws cognito-idp sign-up”或“$ aws cognito-idp forgot-password”等等


同样来自 this getting started tutorial,它谈到“*应该如何处理收到的令牌 AFTER 用户身份验证成功*”。但是,它没有讨论 如何 使 Cognito 用户池 API 的身份验证首先发生。示例仅适用于 Android、iOS、javascript SDK。对于没有 SDK 的平台,没有可用的身份验证示例。


因此,如何在没有官方 SDK 的平台上通过 Amazon Cognito REST APIs(对于用户池)进行登录?

根据您所讨论的内容,我认为您正在尝试从 Web 前端执行此操作。因为,cognito 正在为您提供必要的后端支持,它希望您从表示层进行通信(例如身份验证、注册等)——这就是您找到适用于不同移动平台的 SDK 的原因。他们还有用于网络应用程序的 SDK - 可以通过他们的 Javascript SDK 访问。

这里有一个详细的教程,可以使用他们的 JS SDK 实现您从 Web 前端提出的要求 - Accessing Your User Pools using the Amazon Cognito Identity SDK for JavaScript

这里是 AWS Cognito 团队的开发人员之一。

要添加到 ,我们建议使用其中一种客户端 SDK。如果您正在构建一个 REST API,然后是一个与那些 API 对话的前端,最好从您的前端集成 Cognito。

如果您绝对需要从后端使用 Cognito,我们的 GA 版本将提供身份验证 API。在我们的 Cognito 用户池中,测试版身份验证只能通过客户端 SDK 获得。

更新:

正如您在下面的评论中指出的,身份验证流程记录在此处:http://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-authentication-flow.html。这可能有助于阐明身份验证流程

这有点违反直觉,但对于您不想让用户明确登录但为用户携带令牌的移动应用程序来说确实有意义。请注意,在 iOS 的 AWS Userpools SDK 中有一个显式登录(登录)API。我没有使用它,但我想它只是一个备用客户端 API 来通过相同的 InitiateAuth() 然后是 RespondToAuthChallenge() 流程。 iOS 登录示例记录在此处 - IOS SDK Example: Sign in a User

原文Post:

用于启动身份验证的 Cognito 用户池 API 文档是 available here

如果您在其中一个 SDK 中实现用户池应用程序,它的工作方式会变得更加清晰(我在 Swift 中为 iOS 做了一个应用程序,因为 JSON 回复很冗长,如果您查看日志,您可以看到发生了什么)。

但假设我理解您的问题:总而言之,您应该 InitiateAuth() 并且对此(来自 Cognito 用户池服务器)的响应是一个挑战。然后你做 RespondToAuthChallenge() (也记录在 API 文档中)并且对此的响应是身份验证结果 - 假设密码/会话/令牌被接受。

我相信,这两者的结合就是您所说的 LOGIN,它的工作方式类似于登录。在 API 中,它的设置方式是在用户未通过身份验证时尝试获取用户信息,然后 InitiateAuth() 和(无论如何在 iOS 中)API 对您编写的代码进行回调以询问密码,并发送 RespondToAuthChallenge() 请求等

我有类似的问题,想知道如何将 Cognito 集成到 Elixir 后端并找到这个库:https://github.com/aws-beam/aws-elixir

根据我通过阅读其源代码所了解的情况,他们最终提出了一个包含 header "X-Amz-Target": "AWSCognitoIdentityProviderService.#{name_of_api_action}" 的 POST 请求(此处为:https://github.com/aws-beam/aws-elixir/blob/master/lib/aws/cognito_identity_provider.ex#L564) .那是未经授权的headers,它们是在别处添加的,但我发现它很有趣。构造请求 URL 的函数如下,因此您应该能够了解被调用的端点。

我必须说我尝试按照这篇用日语写的文章 - https://qiita.com/yujikawa/items/e79929ed14277102f4b8,但无法使其工作,可能是因为我不确定正确的 AWS_ENDPOINT 环境变量应该是什么是。我目前正在考虑试用 Ruby SDK,从文档的外观来看似乎不错。但是,尽管如此,此信息仍可能对某些人有所帮助。

这个 curl 命令对我有用:

curl -X POST --data @aws-auth-data.json \
-H 'X-Amz-Target: AWSCognitoIdentityProviderService.InitiateAuth' \
-H 'Content-Type: application/x-amz-json-1.1' \
https://cognito-idp.us-east-1.amazonaws.com/

其中 aws-auth-data.json 是:

{
   "AuthParameters" : {
      "USERNAME" : "yourusername@example.com",
      "PASSWORD" : "yourpassword"
   },
   "AuthFlow" : "USER_PASSWORD_AUTH",
   "ClientId" : "75........................"
}

用户池客户端必须允许 USER_PASSWORD_AUTH 才能正常工作 - 这是 AWS 端设置。

直接分享 curl 可能对任何人都有帮助

curl -X POST --data @user-data.json \
-H 'X-Amz-Target: AWSCognitoIdentityProviderService.InitiateAuth' \
-H 'Content-Type: application/x-amz-json-1.1' \
https://cognito-idp.<just-replace-region>.amazonaws.com/

文件jsonuser-data.json

{"AuthParameters" : {"USERNAME" : "sadfsf", "PASSWORD" : "password"}, "AuthFlow" : "USER_PASSWORD_AUTH", "ClientId" : "csdfhripnv7sq027kktf75"}

确保您的应用程序客户端不包含应用程序秘密或创建没有秘密的新应用程序。还在应用程序内部启用 USER_PASSWORD_AUTH

只是添加到@andrewjj 的回答中。您可能会收到质询 (NEW_PASSWORD_REQUIRED) 作为 InitiateAuth 响应。这是当您在初始登录时被要求更改护照的时候。

您可以使用Postmancurl 命令。此示例需要使用 Postman。

  1. InitiateAuth - 此步骤与@andrewjj
  2. 相同

将此添加到 Body 作为 raw

{
    "AuthParameters": {
        "USERNAME": "youremail@example.com",
        "PASSWORD": "temporary-password",
    },
    "AuthFlow": "USER_PASSWORD_AUTH",
    "ClientId": "2s........................"
}

设置headers

X-Amz-Target: AWSCognitoIdentityProviderService.InitiateAuth
Content-Type: application/x-amz-json-1.1

https://cognito-idp.us-east-1.amazonaws.com/发送请求您可能需要更改地区。

如果您收到此回复,则说明您没问题,否则请继续执行第 2 步。

{
    "AuthenticationResult": {
        "AccessToken": "eyJra........",
        "ExpiresIn": 3600,
        "IdToken": "eyJra........",
        "RefreshToken": "eyJjd........",
        "TokenType": "Bearer"
    },
    "ChallengeParameters": {}
}
  1. RespondToAuthChallenge - 这是新步骤

如果您收到像这样的挑战:

{
    "ChallengeName": "NEW_PASSWORD_REQUIRED",
    "ChallengeParameters": {
        "USER_ID_FOR_SRP": "1231-......",
        "requiredAttributes": "[]",
        "userAttributes": "{\"email_verified\":\"true\",\"email\":\"youremail@example.com\"}"
    },
    "Session": "Sfas......"
}

您需要设置新密码。将此添加到 Body 作为 raw

{
    "ChallengeName": "NEW_PASSWORD_REQUIRED",
    "ChallengeResponses": {
        "USERNAME": "youremail@example.com",
        "NEW_PASSWORD": "newpassword"
    },
    "ClientId": "2s........................",
    "Session": "Sfas......(use one from the InitiateAuth response)"
}

设置headers

X-Amz-Target: AWSCognitoIdentityProviderService.RespondToAuthChallenge
Content-Type: application/x-amz-json-1.1

https://cognito-idp.us-east-1.amazonaws.com/发送请求您可能需要更改地区。

再次执行步骤 1 以接收令牌。

谢谢@andrewjj,你的回答帮了大忙

这里是为遇到客户端密码问题的人提供的附加信息。您无需将其关闭。

您需要根据用户名、clientId、客户端密码生成一个秘密哈希,如下所示:

消息=字节(用户名+app_client_id,'utf-8')

key= bytes(clientSecret,'utf-8')

secret_hash = base64.b64encode(hmac.new(key, message, digestmod=hashlib.sha256).digest()).decode()

来源:https://aws.amazon.com/premiumsupport/knowledge-center/cognito-unable-to-verify-secret-hash/

然后将秘密哈希添加到您的 AuthParameters,如下所示:

{
   "AuthParameters" : {
      "USERNAME" : "...",
      "PASSWORD" : "...",
      "SECRET_HASH" : "..."
   },
   "AuthFlow" : "USER_PASSWORD_AUTH",
   "ClientId" : "..."
}