How do i make logins happen via Amazon Cognito REST APIs (for user pools) on platforms for which there is no official SDK? - 请注意,我要求的是用户池 - 而不是身份池 .
故事梗概
亚马逊cognito提供3种登录:
-
联合登录(创建 identity pools ) - 使用FB,Twitter,G等社交连接
-
AWS托管登录(创建 user pools ) - 使用亚马逊自己的托管注册,登录,忘记密码,重置密码服务
-
开发人员提供了登录(我自己管理的自定义身份验证服务)
I am using the second one (with User Pools)
Amazon Cognito有几个用于android,iOS,javascript,Xamarin等的SDK .Cognito还提供REST API,用于在官方SDK支持的平台之外构建 . I am building an app for a different platform 因此,REST API是我唯一的方式,因为我的平台没有官方SDK .
Cognito REST API为“注册', '忘记密码', '确认验证”等提供了各种 endpoints ,但令人惊讶的是, the REST API does not have any endpoint for simple signin / login .
从Cognito CLI API docs我有“注册用户所需的所有OFFICIAL CLI API ", "确认注册", "更改密码", "验证电话号码", "忘记密码”等 Surprisingly there is no CLI API mentioned for LOGINs. 我希望应该有一些CLI API,如“ $ aws cognito-idp log-in " just like there is for " $ aws cognito-idp sign-up " or for " $ aws cognito-idp forgot-password ”等 .
同样来自this getting started tutorial,它谈到“应该用令牌收到 AFTER 成功验证用户”应该做什么 . 但是,它没有谈论 HOW TO 使成功的身份验证发生在Cognito User Pool API的第一位 . 示例仅适用于Android,iOS,javascript SDK . 对于没有SDK的平台,没有可用的身份验证示例 .
因此, How do i make logins happen via Amazon Cognito REST APIs (for user pools) on platforms for which there is no official SDK?
5 回答
Update:
正如您在下面的评论中指出的那样,验证流程在此处记录: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 Example: Sign in a UserOriginal Post:
用于启动身份验证的Cognito用户池API文档是available here
如果你在其中一个SDK中实现一个用户池应用程序,它的工作方式会变得更加清晰(我在Swift for iOS中做了一个,因为JSON响应的记录很详细,你可以看到发生了什么,如果你仔细查看日志) .
但假设我理解了您的问题:总之,您应该
InitiateAuth()
并且对此的响应(来自Cognito用户池服务器)是一个挑战 . 然后你做RespondToAuthChallenge()
(也在该API文档中记录),并且对此的响应是认证结果 - 假设密码/会话/令牌被接受 .我相信,这两件事的组合是你所谓的LOGIN,它就像登录一样 . 在API中,它的设置方式是,当用户未经身份验证时尝试获取用户信息将启动
InitiateAuth()
并且(无论如何在iOS中)API会对您编写的代码进行回调以询问密码,并发送RespondToAuthChallenge()
请求等AWS Cognito团队的开发人员之一 .
要添加到@md-abdul-munim's answer,我们建议使用其中一个客户端SDK . 如果您正在构建REST API,然后是与这些API对话的前端,那么最好只从前端集成Cognito .
如果您绝对需要从后端使用Cognito,我们的GA版本将提供身份验证API . 在我们的Cognito用户池测试版中,只能通过客户端SDK进行身份验证 .
根据您的讨论,我认为您正在尝试从Web前端进行此操作 . 因为,cognito为您提供必要的后端支持,它希望您从表示层进行通信(例如,身份验证,注册等) - 这就是您为不同的移动平台找到SDK的原因 . 他们还有用于Web应用程序的SDK-可以通过他们的Javascript SDK访问 .
这是一个详细的教程,用于实现您使用JS SDK从Web前端提出的问题 - Accessing Your User Pools using the Amazon Cognito Identity SDK for JavaScript
我有类似的问题和想知道如何在Elixir后端集成Cognito并找到这个库:https://github.com/aws-beam/aws-elixir
通过阅读其源代码我可以理解,他们最终发出一个POST请求,其中包含头
"X-Amz-Target": "AWSCognitoIdentityProviderService.#{name_of_api_action}"
(这里是:https://github.com/aws-beam/aws-elixir/blob/master/lib/aws/cognito_identity_provider.ex#L564) . 那没有授权 Headers ,它们被添加到其他地方,但我发现它很有趣 . 构造请求URL的函数如下,因此您应该能够了解被调用的 endpoints .我必须说我尝试使用日文写的这篇文章 - https://qiita.com/yujikawa/items/e79929ed14277102f4b8,并且无法使其工作,可能是因为我不确定适当的AWS_ENDPOINT环境变量应该是什么 . 我目前正在考虑试用Ruby SDK,从文档的外观来看似乎没问题 . 但是,尽管如此,这些信息仍然可以帮助某些人 .
这个curl命令对我有用:
其中aws-auth-data.json是:
用户池客户端必须允许USER_PASSWORD_AUTH才能使用 - 这是AWS端设置 .