Authentication Challenge Trigger什么时候执行?
When Is Authentication Challenge Trigger executed?
作为我的用户池的 Auth Challenge
,我定义了一个 Lambda 函数。此函数向 Authy 发送请求以请求一键式身份验证。
我想要此设置以将 Authy 多重身份验证添加到 Cognito 登录过程。
然而,当我进行身份验证时,使用用户名和密码登录 Cognito 用户,此 lambda 函数不会被触发!
我做错了什么? Lambda 触发器是否仅为注册过程定义?谢谢
--------------------更新:-------------------- --------------------------
我的登录代码,需要用户名和密码:
authenticate(userName, userPassword) {
var userData = {Username: userName, Pool : CognitoUserPool}
var cognitoUser = new AWSCognito.CognitoIdentityServiceProvider.CognitoUser(userData);
var authenticationData = {Username : userName, Password : userPassword};
var authenticationDetails = new AWSCognito.CognitoIdentityServiceProvider.AuthenticationDetails(authenticationData);
cognitoUser.authenticateUser(authenticationDetails, {
onSuccess: function (session) {
AWSInitialize(cognitoUser, session);
face.showHome();
}.bind(this),
mfaRequired: function(session){
new MFAConfirmation(cognitoUser, 'login');
},
onFailure: function(err) {
alert(err);
}
});
};
触发器的定义位置:
Define Auth Challenge lambda 仅在 CUSTOM_AUTH 流的上下文中起作用,因此您必须在验证时将 CUSTOM_AUTH 作为 AuthFlow 传递。在 Javascript 你可以做:
cognitoUser.setAuthenticationFlowType('CUSTOM_AUTH');
Cognito 使用 AWS Lambda 触发器开发人员指南中的示例实际上就是这样做的。他们允许您在使用用户名和密码进行身份验证后定义另一个质询。
Define Auth Challenge 示例可让您在使用用户名和密码进行身份验证后设置另一个质询。当您指定 CUSTOM_CHALLENGE 作为质询时,它会调用 Create Auth Challenge lambda 触发器。
exports.handler = function(event, context) {
if (event.request.session.length == 1 && event.request.session[0].challengeName == 'SRP_A') {
event.response.issueTokens = false;
event.response.failAuthentication = false;
event.response.challengeName = 'PASSWORD_VERIFIER';
} else if (event.request.session.length == 2 && event.request.session[1].challengeName == 'PASSWORD_VERIFIER' && event.request.session[1].challengeResult == true) {
event.response.issueTokens = false;
event.response.failAuthentication = false;
event.response.challengeName = 'CUSTOM_CHALLENGE';
} else if (event.request.session.length == 3 && event.request.session[2].challengeName == 'CUSTOM_CHALLENGE' && event.request.session[2].challengeResult == true) {
event.response.issueTokens = true;
event.response.failAuthentication = false;
} else {
event.response.issueTokens = false;
event.response.failAuthentication = true;
}
context.done(null, event);
}
作为我的用户池的 Auth Challenge
,我定义了一个 Lambda 函数。此函数向 Authy 发送请求以请求一键式身份验证。
我想要此设置以将 Authy 多重身份验证添加到 Cognito 登录过程。
然而,当我进行身份验证时,使用用户名和密码登录 Cognito 用户,此 lambda 函数不会被触发!
我做错了什么? Lambda 触发器是否仅为注册过程定义?谢谢
--------------------更新:-------------------- --------------------------
我的登录代码,需要用户名和密码:
authenticate(userName, userPassword) {
var userData = {Username: userName, Pool : CognitoUserPool}
var cognitoUser = new AWSCognito.CognitoIdentityServiceProvider.CognitoUser(userData);
var authenticationData = {Username : userName, Password : userPassword};
var authenticationDetails = new AWSCognito.CognitoIdentityServiceProvider.AuthenticationDetails(authenticationData);
cognitoUser.authenticateUser(authenticationDetails, {
onSuccess: function (session) {
AWSInitialize(cognitoUser, session);
face.showHome();
}.bind(this),
mfaRequired: function(session){
new MFAConfirmation(cognitoUser, 'login');
},
onFailure: function(err) {
alert(err);
}
});
};
触发器的定义位置:
Define Auth Challenge lambda 仅在 CUSTOM_AUTH 流的上下文中起作用,因此您必须在验证时将 CUSTOM_AUTH 作为 AuthFlow 传递。在 Javascript 你可以做:
cognitoUser.setAuthenticationFlowType('CUSTOM_AUTH');
Cognito 使用 AWS Lambda 触发器开发人员指南中的示例实际上就是这样做的。他们允许您在使用用户名和密码进行身份验证后定义另一个质询。
Define Auth Challenge 示例可让您在使用用户名和密码进行身份验证后设置另一个质询。当您指定 CUSTOM_CHALLENGE 作为质询时,它会调用 Create Auth Challenge lambda 触发器。
exports.handler = function(event, context) {
if (event.request.session.length == 1 && event.request.session[0].challengeName == 'SRP_A') {
event.response.issueTokens = false;
event.response.failAuthentication = false;
event.response.challengeName = 'PASSWORD_VERIFIER';
} else if (event.request.session.length == 2 && event.request.session[1].challengeName == 'PASSWORD_VERIFIER' && event.request.session[1].challengeResult == true) {
event.response.issueTokens = false;
event.response.failAuthentication = false;
event.response.challengeName = 'CUSTOM_CHALLENGE';
} else if (event.request.session.length == 3 && event.request.session[2].challengeName == 'CUSTOM_CHALLENGE' && event.request.session[2].challengeResult == true) {
event.response.issueTokens = true;
event.response.failAuthentication = false;
} else {
event.response.issueTokens = false;
event.response.failAuthentication = true;
}
context.done(null, event);
}