in packages/amazon-cognito-identity-js/src/CognitoUser.js [449:575]
authenticateUserInternal(dataAuthenticate, authenticationHelper, callback) {
const challengeName = dataAuthenticate.ChallengeName;
const challengeParameters = dataAuthenticate.ChallengeParameters;
if (challengeName === 'SMS_MFA') {
this.Session = dataAuthenticate.Session;
return callback.mfaRequired(challengeName, challengeParameters);
}
if (challengeName === 'SELECT_MFA_TYPE') {
this.Session = dataAuthenticate.Session;
return callback.selectMFAType(challengeName, challengeParameters);
}
if (challengeName === 'MFA_SETUP') {
this.Session = dataAuthenticate.Session;
return callback.mfaSetup(challengeName, challengeParameters);
}
if (challengeName === 'SOFTWARE_TOKEN_MFA') {
this.Session = dataAuthenticate.Session;
return callback.totpRequired(challengeName, challengeParameters);
}
if (challengeName === 'CUSTOM_CHALLENGE') {
this.Session = dataAuthenticate.Session;
return callback.customChallenge(challengeParameters);
}
if (challengeName === 'NEW_PASSWORD_REQUIRED') {
this.Session = dataAuthenticate.Session;
let userAttributes = null;
let rawRequiredAttributes = null;
const requiredAttributes = [];
const userAttributesPrefix = authenticationHelper.getNewPasswordRequiredChallengeUserAttributePrefix();
if (challengeParameters) {
userAttributes = JSON.parse(
dataAuthenticate.ChallengeParameters.userAttributes
);
rawRequiredAttributes = JSON.parse(
dataAuthenticate.ChallengeParameters.requiredAttributes
);
}
if (rawRequiredAttributes) {
for (let i = 0; i < rawRequiredAttributes.length; i++) {
requiredAttributes[i] = rawRequiredAttributes[i].substr(
userAttributesPrefix.length
);
}
}
return callback.newPasswordRequired(userAttributes, requiredAttributes);
}
if (challengeName === 'DEVICE_SRP_AUTH') {
this.Session = dataAuthenticate.Session;
this.getDeviceResponse(callback);
return undefined;
}
this.signInUserSession = this.getCognitoUserSession(
dataAuthenticate.AuthenticationResult
);
this.challengeName = challengeName;
this.cacheTokens();
const newDeviceMetadata =
dataAuthenticate.AuthenticationResult.NewDeviceMetadata;
if (newDeviceMetadata == null) {
return callback.onSuccess(this.signInUserSession);
}
authenticationHelper.generateHashDevice(
dataAuthenticate.AuthenticationResult.NewDeviceMetadata.DeviceGroupKey,
dataAuthenticate.AuthenticationResult.NewDeviceMetadata.DeviceKey,
errGenHash => {
if (errGenHash) {
return callback.onFailure(errGenHash);
}
const deviceSecretVerifierConfig = {
Salt: Buffer.from(
authenticationHelper.getSaltDevices(),
'hex'
).toString('base64'),
PasswordVerifier: Buffer.from(
authenticationHelper.getVerifierDevices(),
'hex'
).toString('base64'),
};
this.verifierDevices = deviceSecretVerifierConfig.PasswordVerifier;
this.deviceGroupKey = newDeviceMetadata.DeviceGroupKey;
this.randomPassword = authenticationHelper.getRandomPassword();
this.client.request(
'ConfirmDevice',
{
DeviceKey: newDeviceMetadata.DeviceKey,
AccessToken: this.signInUserSession.getAccessToken().getJwtToken(),
DeviceSecretVerifierConfig: deviceSecretVerifierConfig,
DeviceName: userAgent,
},
(errConfirm, dataConfirm) => {
if (errConfirm) {
return callback.onFailure(errConfirm);
}
this.deviceKey =
dataAuthenticate.AuthenticationResult.NewDeviceMetadata.DeviceKey;
this.cacheDeviceKeyAndPassword();
if (dataConfirm.UserConfirmationNecessary === true) {
return callback.onSuccess(
this.signInUserSession,
dataConfirm.UserConfirmationNecessary
);
}
return callback.onSuccess(this.signInUserSession);
}
);
return undefined;
}
);
return undefined;
}