我一直在研究为Web应用程序设置登录,让客户端查看S3中托管的数据,并发现AWS Cognito有一个托管的Web UI [link],可以为我处理大部分身份验证流程,我面临的问题是我无法找到如何将Web UI的输出集成到我的应用程序中.Cognito中的大多数现有文档仅引用了如何使用各种API来创建自己的UI,这让我对我的问题的答案感到困惑.
是否有任何使用Cognito托管UI创建的信息?
亚马逊表示,您可以在几分钟内将经过身份验证的登录与Cognito集成,但我已经看了几周而且无法弄明白.
javascript amazon-s3 amazon-web-services amazon-cognito aws-cognito
我使用AWS Cognito来管理我的Web应用程序的用户注册和用户访问.具体来说,我使用的是Cognito托管的UI.这意味着Cognito为我的用户提供了一个用户注册用户界面,我没有权限修改我的应用程序的用户注册或登录页面(除了Cognito提供的控件).我使用电子邮件地址作为用户名,因此只需要新用户提供电子邮件地址和密码.
Cognito将电子邮件地址视为区分大小写.如果用户使用电子邮件地址JOHN_smith@randommail.com注册,则他们无法使用john_smith@randommail.com登录.
我希望注册和登录的用户电子邮件地址不区分大小写.
通常,在将电子邮件地址发送到服务器之前,通过在客户端中将电子邮件地址设置为小写来处理这一点很简单.但是我无法访问由Cognito托管的客户端UI.
因此,我的计划是尝试使用Cognito预注册触发器调用的Lambda函数来小写用户提供的电子邮件.
预注册
当用户尝试注册(注册)时,Amazon Cognito会调用此触发器,允许您执行自定义验证以接受或拒绝注册请求.
这是我写的lamdba函数:
'use strict';
console.log('Loading function');
exports.handler = (event, context, callback) => {
console.log('Received event:', JSON.stringify(event, null, 2));
var triggerSource = event.triggerSource;
console.log('Received triggerSource:', triggerSource);
var email = event.request.userAttributes.email;
console.log('Received email:', email);
var modifiedEvent = event;
if (email !== null) {
var lowerEmail = email.toLowerCase();
modifiedEvent.request.userAttributes.email = lowerEmail;
console.log('Set email in request to', lowerEmail);
console.log('Modified event:', JSON.stringify(modifiedEvent, null, 2));
} else {
console.log('Email evaluated as NULL, exiting …Run Code Online (Sandbox Code Playgroud) 在AWS Cognito中,您可以将用户添加到组(首次创建组之后).用户可以属于一个或多个组.
使用JavaScipt SDK(https://github.com/aws/amazon-cognito-identity-js),有没有办法读取分配的组?会aws-sdk提供访问权限amazon-cognito-identity-js吗?
我想在亚马逊认知用户确认后重定向到特定网址.
当用户注册时,他将收到带有验证链接的确认邮件,如下所示 :https:// <> .auth.us-west-2.amazoncognito.com/confirmUser?client_id = << >>&user_name = << >>&confirmation_code = << >>
如果用户点击上述链接,它将重定向到确认页面.
用户确认完成后,页面应重定向到我的应用程序.
请给我一些解决这个问题的想法.
我正在尝试Cognito使用他们的Go 实现基于身份验证SDK.我已经能够使基本username/password身份验证工作,但当我添加2因素身份验证时,SMS我遇到了困难.
重现步骤 :
问题,我收到了error:
CodeMismatchException: Invalid code or auth state for the user.
status code: 400, request id: 1513894e-8efa-11e8-a8f8-97e5e083c03b
Run Code Online (Sandbox Code Playgroud)
SMS验证码当然是正确的,因此它似乎必须与auth状态有关.
对Cognito的调用如下所示:
c.cip.SignUp(&cognitoidentityprovider.SignUpInput{
ClientId: aws.String(c.clientID),
Username: aws.String(username),
Password: aws.String(password),
UserAttributes: []*cognitoidentityprovider.AttributeType{
{
Name: aws.String("email"),
Value: aws.String(email),
},
{
Name: aws.String("name"),
Value: aws.String(fullName),
},
},
})
c.cip.ConfirmSignUp(&cognitoidentityprovider.ConfirmSignUpInput{
ClientId: aws.String(c.clientID),
Username: aws.String(username),
ConfirmationCode: aws.String(code),
})
//Add the phone number
c.cip.AdminUpdateUserAttributes(&cognitoidentityprovider.AdminUpdateUserAttributesInput{
UserPoolId: aws.String(c.userPoolID),
Username: aws.String(username),
UserAttributes: …Run Code Online (Sandbox Code Playgroud) 我正在调用adminInitiateAuth并为我自己的lambda返回一个奇怪的AccessDeniedException.
这是我正在调用的代码:
var params = {
AuthFlow: "ADMIN_NO_SRP_AUTH",
ClientId: "@cognito_client_id@",
UserPoolId: "@cognito_pool_id@",
AuthParameters: {
USERNAME : username,
PASSWORD : tempPassword
},
};
cognitoIdentityServiceProvider.adminInitiateAuth(params, function(error, data) {
if (error) {
console.log("ERROR! Login failed: " + JSON.stringify(error), error.stack);
} else {
console.log("Login sent back: " + JSON.stringify(data));
}
});
Run Code Online (Sandbox Code Playgroud)
我得到的错误信息是:
ERROR! Login failed: {"message":"arn:aws:lambda:us-east-1:201473124518:function:main-devryan-users_onCognitoLogin failed with error AccessDeniedException.","code":"UnexpectedLambdaException","time":"2017-02-25T18:54:15.109Z","requestId":"ce42833f-fb8b-11e6-929b-2f78b63faa12","statusCode":400,"retryable":false,"retryDelay":1.0853444458916783} UnexpectedLambdaException: arn:aws:lambda:us-east-1:201473124518:function:main-devryan-users_onCognitoLogin failed with error AccessDeniedException.
Run Code Online (Sandbox Code Playgroud)
有谁知道我为什么会收到这个错误?
通过阅读Cognito Identity Provider文档,我了解到它似乎提供了与Facebook/Google/Twitter作为身份提供商的开箱即用集成.
我的应用程序是一个以开发人员为中心的应用程序,因此我希望除了上述身份提供商的帐户之外,还允许用户使用他们的Github帐户进行注册/登录.那可能吗?
如果可能的话,我需要做多少额外的工作(比较开箱即用的Facebook/Google社交注册功能)?
single-sign-on oauth-2.0 openid-connect amazon-cognito aws-cognito
因此,我试图了解AWS Cognito,但我遇到了一些问题.
所以,现在我可以注册一个帐户,并验证并登录.简单就够了.边缘的情况是我的墙壁.
这是我到目前为止的信息:
username一旦创建,就不能改变username价值观email被标记为别名,在Cognito术语中表示我可以使用它来进行登录username.如果email选择作为别名,则根据文档,相同的值不能用作用户名(http://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-settings-attributes.html#user -pool-settings-aliases):
如果选择电子邮件作为别名,则用户名与有效的电子邮件格式不匹配.同样,如果选择电话号码作为别名,则该用户池的服务将不接受与有效电话号码模式匹配的用户名.
只有在帐户经过验证后,该email地址才能用于登录(http://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-settings-attributes.html#user-pool-settings-别名)
在验证电话号码和电子邮件地址后,电话号码和电子邮件地址仅成为用户的活动别名.因此,如果您选择将它们用作别名,我们建议您选择自动验证电子邮件地址和电话号码.
这就是我的优势所在.
如果一个用户注册,但不立即确认:
在他们看来,他们已注册但未验证他们的帐户.在这一点上,它实际上没有办法验证他们认为他们注册的帐户.我猜它可以通过消息解决:
"在您验证电子邮件地址之前,警告您的帐户不会被创建." 或类似的规定.无论如何...
username.username甚至可以是什么,因为他们只输入了他们的电子邮件地址."堆积"可能是一个过于强烈的短语,这可能是一个非常边缘的情况.
现在好的方面是,因为他们没有"验证"他们,email他们可以使用相同的email地址再次注册,因为email它没有得到唯一约束,直到它verified.如果有人试图验证已经验证的地址,他们会得到一个AliasExistsException.这实际上提出了一个我刚刚测试过的有趣点.
我可以使用电子邮件地址注册,然后验证该电子邮件地址,以便确认该帐户.然后,我可以右转并使用相同的电子邮件地址注册,在尝试使用重复的电子邮件地址验证该帐户之前,我没有收到正式的AWS错误.以前没有办法表明这个错误?我想期望开发人员在预注册触发器中编写验证服务:
当用户提交其信息以进行注册时,将调用此触发器,允许您执行自定义验证以接受或拒绝注册请求.
总结一下,并重申一下这个问题:
实际上,似乎需要在使用带有Cognito的电子邮件地址时需要预先注册Lambda,以确保不存在具有电子邮件的帐户,因为在验证尝试之前不会处理AWS异常制作.
我的假设在这里是否正确?根据这里的要求,我认为让用户知道电子邮件地址不能尽快提供是非常合理的.例如:
John …Run Code Online (Sandbox Code Playgroud) Cognito Console中的标识池在哪里.如文档中所述,它具有以下格式:
IdentityPoolId
标识为REGION:GUID的标识池标识.
但我只看到Pool Id并Pool ARN在控制台中.哪种格式不同.