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

Rak*_*kib 20 api rest command-line-interface amazon-web-services amazon-cognito

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


概要


亚马逊cognito提供3种登录:

  • 联合登录(创建标识池) - 使用FB,Twitter,G +等社交连接
  • AWS管理登录(创建用户池) - 使用亚马逊自己的托管注册,登录,忘记密码,重置密码服务
  • 开发人员提供登录(我自己管理的自定义身份验证服务)

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


Amazon Cognito有几个用于android,iOS,javascript,Xamarin等的SDK .Cognito还提供REST API,用于在官方SDK支持的平台之外构建.我正在为不同的平台构建应用程序,因此,REST API是我唯一的方式,因为我的平台没有官方SDK.

Cognito REST API为" 注册 "," 忘记密码 "," 确认验证 "等提供了各种端点,但令人惊讶的是,REST API没有用于简单登录/登录的任何端点.


Cognito CLI API文档中,我拥有" 注册用户 "," 确认注册 "," 更改密码 "," 验证电话号码 "," 忘记密码 "等所需的所有OFFICIAL CLI API .令人惊讶的是,没有为LOGIN提及CLI API .我希望应该有一些像" $ aws cognito-idp log-in"的CLI API ,就像有" $ aws cognito-idp sign-up"或" $ aws cognito-idp forgot-password"等.


同样从这个入门教程开始,它讨论了"*在成功验证用户*之后收到的令牌应该做什么".但是,它没有讨论如何使用Cognito User Pool API在第一时间成功进行身份验证.示例仅适用于Android,iOS,javascript SDK.对于没有SDK的平台,没有可用的身份验证示例.


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

小智 26

这个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/
Run Code Online (Sandbox Code Playgroud)

其中aws-auth-data.json是:

{
   "AuthParameters" : {
      "USERNAME" : "yourusername@example.com",
      "PASSWORD" : "yourpassword"
   },
   "AuthFlow" : "USER_PASSWORD_AUTH",
   "ClientId" : "75........................"
}
Run Code Online (Sandbox Code Playgroud)

用户池客户端必须允许USER_PASSWORD_AUTH才能使用 - 这是AWS端设置.

  • 你好!在哪里可以找到 Cognito idp 网址? (3认同)
  • 很好的答案,请注意,如果您不使用us-east-1区域,则需要修改url以添加您的区域。 (2认同)
  • 效果很好,谢谢!我在手册中找不到任何地方,所以对您表示敬意!:-) (2认同)
  • 创建另一个应用程序客户端并禁用客户端秘密凭据后与我合作 /sf/ask/4260853061/ -sdk/60870028#60870028 (2认同)

Bla*_*ack 12

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

您可以使用Postmancurl命令。此示例期望使用 Postman。

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

将其添加Bodyraw

{
    "AuthParameters": {
        "USERNAME": "youremail@example.com",
        "PASSWORD": "temporary-password",
    },
    "AuthFlow": "USER_PASSWORD_AUTH",
    "ClientId": "2s........................"
}
Run Code Online (Sandbox Code Playgroud)

headers

X-Amz-Target: AWSCognitoIdentityProviderService.InitiateAuth
Content-Type: application/x-amz-json-1.1
Run Code Online (Sandbox Code Playgroud)

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

如果您收到此回复,则表示没问题,否则请继续步骤 2。

{
    "AuthenticationResult": {
        "AccessToken": "eyJra........",
        "ExpiresIn": 3600,
        "IdToken": "eyJra........",
        "RefreshToken": "eyJjd........",
        "TokenType": "Bearer"
    },
    "ChallengeParameters": {}
}
Run Code Online (Sandbox Code Playgroud)
  1. RespondToAuthChallenge - 这是新步骤

如果您收到这样的挑战:

{
    "ChallengeName": "NEW_PASSWORD_REQUIRED",
    "ChallengeParameters": {
        "USER_ID_FOR_SRP": "1231-......",
        "requiredAttributes": "[]",
        "userAttributes": "{\"email_verified\":\"true\",\"email\":\"youremail@example.com\"}"
    },
    "Session": "Sfas......"
}
Run Code Online (Sandbox Code Playgroud)

您需要设置新密码。将其添加Bodyraw

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

headers

X-Amz-Target: AWSCognitoIdentityProviderService.RespondToAuthChallenge
Content-Type: application/x-amz-json-1.1
Run Code Online (Sandbox Code Playgroud)

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

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


Har*_*var 8

直接分享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/
Run Code Online (Sandbox Code Playgroud)

文件 jsonuser-data.json

{"AuthParameters" : {"USERNAME" : "sadfsf", "PASSWORD" : "password"}, "AuthFlow" : "USER_PASSWORD_AUTH", "ClientId" : "csdfhripnv7sq027kktf75"}
Run Code Online (Sandbox Code Playgroud)

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


Bru*_*ce0 7

更新:

正如你在下面的评论中指出,认证流程如下记载:http://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-authentication-flow.html.这可能有助于澄清身份验证流程

这有点违反直觉,但对于您不希望用户明确登录的移动应用程序,它确实有意义,而是为用户携带令牌.请注意,AWS Userpools SDK for iOS中有一个显式的登录(登录)API.我没有使用它,但我想它只是一个备用的客户端API来完成相同的InitiateAuth()后续RespondToAuthChallenge()流程.此处记录了iOS登录示例 - IOS SDK示例:登录用户

原帖:

此处提供了用于启动身份验证的Cognito User Pools API文档

如果你在一个实现用户池的应用程序它的工作方式变得更清晰SDK的(我做了一个在斯威夫特的iOS,它是澄清,因为JSON响应的日志记录详细,你可以种看看是怎么回事,如果你仔细查看日志).

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

我相信,这两件事的组合是你所谓的LOGIN,它就像登录一样.在API的,它被设置方式是企图获取用户信息,当用户未认证揭开序幕的是InitiateAuth()和(iOS中无论如何)的API做了回调写你索要密码的代码,并发送RespondToAuthChallenge()请求等等

  • 很好....我想知道为什么没有任何关于如何在官方文档中登录用户的直接示例/说明.这种流程不是很直观. (4认同)

Che*_*hta 6

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

要添加到@md-abdul-munim 的答案,我们建议使用客户端 SDK 之一。如果您正在构建 REST API,然后构建与这些 API 通信的前端,那么最好从前端集成 Cognito。

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