Comment le changement de Statut de l'Utilisateur de FORCER le CHANGEMENT de MOT de passe?
en utilisant AWS Cognito, je veux créer des utilisateurs fictifs à des fins de test.
j'ai ensuite utiliser le Console AWS pour créer un tel utilisateur, mais l'utilisateur a ses statutFORCE_CHANGE_PASSWORD. Avec cette valeur, cet utilisateur ne peut pas être authentifié.
Est-il un moyen de modifier ce statut?
mise à jour Même comportement lors de la création d'utilisateur à partir de CLI
7 réponses
Désolé vous rencontrez des difficultés. Nous n'avons pas de processus en une étape où vous pouvez créer des utilisateurs et les authentifier directement. Nous pourrions changer cela dans le futur de manière à permettre aux administrateurs de définir des mots de passe directement utilisables par les utilisateurs. Pour l'instant, lorsque vous créez des utilisateurs en utilisant AdminCreateUser ou en signant les utilisateurs avec l'application, des étapes supplémentaires sont nécessaires, soit forcer les utilisateurs à changer le mot de passe lors de la connexion ou avoir les utilisateurs de vérifier le courriel ou le numéro de téléphone pour changer le statut de l'utilisateur CONFIRMÉ.
je sais que ça fait longtemps mais j'ai pensé que ça pourrait aider d'autres personnes qui ont trouvé ce post.
vous pouvez utiliser L'AWS CLI pour changer le mot de passe de l'utilisateur, cependant c'est un processus en plusieurs étapes:
L'étape 1 est d'obtenir un jeton de session de l'utilisateur désiré:aws cognito-idp admin-initiate-auth --user-pool-id %USER POOL ID% --client-id %APP CLIENT ID% --auth-flow ADMIN_NO_SRP_AUTH --auth-parameters USERNAME=%USERS USERNAME%,PASSWORD=%USERS CURRENT PASSWORD%
cela répondra avec le challenge "NEW_PASSWORD_REQUIRED", d'autres paramètres du challenge et la clé de session des utilisateurs. Ensuite, vous pouvez lancer la deuxième commande pour lancer le défi réponse:aws cognito-idp admin-respond-to-auth-challenge --user-pool-id %USER POOL ID% --client-id %CLIENT ID% --challenge-name NEW_PASSWORD_REQUIRED --challenge-responses NEW_PASSWORD=%DESIRED PASSWORD%,USERNAME=%USERS USERNAME% --session %SESSION KEY FROM PREVIOUS COMMAND with ""%
ceci devrait retourner un résultat D'authentification valide et des jetons appropriés.
pour que cela fonctionne, le Pool D'utilisateurs de Cognito doit avoir un client App configuré avec la fonctionnalité ADMIN_NO_SRP_AUTH. (note étape 5 http://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-settings-client-apps.html)
Vous pouvez modifier ce statut d'utilisateur FORCE_CHANGE_PASSWORD en appelant respond toauthchallenge () sur l'utilisateur comme ceci:
var params = {
ChallengeName: 'NEW_PASSWORD_REQUIRED',
ClientId: 'your_own3j63rs8j16bxxxsto25db00obh',
ChallengeResponses: {
USERNAME: 'user3',
NEW_PASSWORD: 'changed12345'
},
Session: 'xxxxxxxxxxZDMcRu-5u019i_gAcX5lw1biFnKLtfPrO2eZ-nenOLrr5xaHv-ul_-nGsOulyNG12H85GJ2UGiCGtfe-BdwTmQ-BMUnd2Twr9El45xgpGKWDrYcp11J4J9kZN71ZczynizRJ7oa5a_j2AiBYukzhd_YzPWGscrFu98qqn_JoiLsJ7w9v_C_Zpw6-ixCs09suYQKZ3YlWNFmMpC2nSiKrXUA8ybQkdj6vIO68d-vtYq0mVHt410v2TBtK4czOAh5MieO55kgvGHCxvEusQOTeFYh4Mjh1bwcHWRvSV6mVIrVSm4FnRs0u26vUDq79CgkuycRl2iOoqxc1abcaANKmEB45r2oPnmPZIhVqNO5eHe6fpac7s3pHwLKvNOv7EaQkjyY9Vb5gINmSjXBjBl3O3aqQ7KXyueuHHSLrfchP64SwuNQZSfL1Vis0ap5JtSat3udslzUBiU8FEhmJNwPX08QyIm4DqviTLp6lDqH5pH6BuvO9OUHPrEcDzufOx1a76pld-9f-NGfactCUZC0elQcAiGSqbwfiRYHn7TDHuX1WKf9L9E6GvhJhB154SxxhXsLm3Yv9DhWhOlVbhdbzR2Bq4dqJRDOPY2wengFX6v36TLlYZTHbGEc_PbSlx8Ru80avxehAmUNtNqDYjGbXq0vBWaEiJmkr1isF7XsCvrmZb6tHY'
};
cognitoidentityserviceprovider.respondToAuthChallenge(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log(data); // successful response
});
après cela, vous verrez dans la console que le statut de user3 est confirmé
il suffit d'ajouter ce code après votre onSuccess: function (result) { ... },
dans votre fonction de connexion. Votre utilisateur aura alors l'état confirmé.
newPasswordRequired: function(userAttributes, requiredAttributes) {
// User was signed up by an admin and must provide new
// password and required attributes, if any, to complete
// authentication.
// the api doesn't accept this field back
delete userAttributes.email_verified;
// unsure about this field, but I don't send this back
delete userAttributes.phone_number_verified;
// Get these details and call
cognitoUser.completeNewPasswordChallenge(newPassword, userAttributes, this);
}
vous pouvez résoudre cela en utilisant le SDK amazon-cognito-identity-js en vous authentifiant avec le mot de passe temporaire après la création du compte avec cognitoidentityserviceprovider.adminCreateUser()
, et en cours d'exécution cognitoUser.completeNewPasswordChallenge()
à l'intérieur de cognitoUser.authenticateUser( ,{newPasswordRequired})
- tout à l'intérieur de la fonction qui crée l'utilisateur.
j'utilise le code ci-dessous dans AWS lambda pour créer des comptes utilisateurs Cognito activés. Je suis sûr qu'il peut être optimisée, être patient avec moi. Ceci est mon premier post, et je suis encore assez nouveau pour JavaScript.
var AWS = require("aws-sdk");
var AWSCognito = require("amazon-cognito-identity-js");
var params = {
UserPoolId: your_poolId,
Username: your_username,
DesiredDeliveryMediums: ["EMAIL"],
ForceAliasCreation: false,
MessageAction: "SUPPRESS",
TemporaryPassword: your_temporaryPassword,
UserAttributes: [
{ Name: "given_name", Value: your_given_name },
{ Name: "email", Value: your_email },
{ Name: "phone_number", Value: your_phone_number },
{ Name: "email_verified", Value: "true" }
]
};
var cognitoidentityserviceprovider = new AWS.CognitoIdentityServiceProvider();
let promise = new Promise((resolve, reject) => {
cognitoidentityserviceprovider.adminCreateUser(params, function(err, data) {
if (err) {
reject(err);
} else {
resolve(data);
}
});
});
promise
.then(data => {
// login as new user and completeNewPasswordChallenge
var anotherPromise = new Promise((resolve, reject) => {
var authenticationDetails = new AWSCognito.AuthenticationDetails({
Username: your_username,
Password: your_temporaryPassword
});
var poolData = {
UserPoolId: your_poolId,
ClientId: your_clientId
};
var userPool = new AWSCognito.CognitoUserPool(poolData);
var userData = {
Username: your_username,
Pool: userPool
};
var cognitoUser = new AWSCognito.CognitoUser(userData);
let finalPromise = new Promise((resolve, reject) => {
cognitoUser.authenticateUser(authenticationDetails, {
onSuccess: function(authResult) {
cognitoUser.getSession(function(err) {
if (err) {
} else {
cognitoUser.getUserAttributes(function(
err,
attResult
) {
if (err) {
} else {
resolve(authResult);
}
});
}
});
},
onFailure: function(err) {
reject(err);
},
newPasswordRequired(userAttributes, []) {
delete userAttributes.email_verified;
cognitoUser.completeNewPasswordChallenge(
your_newPoassword,
userAttributes,
this
);
}
});
});
finalPromise
.then(finalResult => {
// signout
cognitoUser.signOut();
// further action, e.g. email to new user
resolve(finalResult);
})
.catch(err => {
reject(err);
});
});
return anotherPromise;
})
.then(() => {
resolve(finalResult);
})
.catch(err => {
reject({ statusCode: 406, error: err });
});
pour Java SDK, en supposant que votre client Cognito est configuré et que vous avez votre utilisateur dans L'état FORCE_CHANGE_PASSWORD, vous pouvez faire ce qui suit pour obtenir la confirmation de votre utilisateur... et ensuite autorisé comme normal.
AdminCreateUserResult createUserResult = COGNITO_CLIENT.adminCreateUser(createUserRequest());
AdminInitiateAuthResult authResult = COGNITO_CLIENT.adminInitiateAuth(authUserRequest());
Map<String,String> challengeResponses = new HashMap<>();
challengeResponses.put("USERNAME", USERNAME);
challengeResponses.put("NEW_PASSWORD", PASSWORD);
RespondToAuthChallengeRequest respondToAuthChallengeRequest = new RespondToAuthChallengeRequest()
.withChallengeName("NEW_PASSWORD_REQUIRED")
.withClientId(CLIENT_ID)
.withChallengeResponses(challengeResponses)
.withSession(authResult.getSession());
COGNITO_CLIENT.respondToAuthChallenge(respondToAuthChallengeRequest);
j'Espère que ça aide avec ceux des tests d'intégration (Désolé pour la mise en forme)
OK. J'ai enfin de code où un administrateur peut créer un nouvel utilisateur. Le processus se déroule comme ceci:
- administrateur crée l'utilisateur
- L'utilisateur reçoit un email avec son mot de passe temporaire
- L'utilisateur se connecte et on lui demande de changer son mot de passe
L'Étape 1 est la partie difficile. Voici mon code pour créer un utilisateur dans Node Js:
let params = {
UserPoolId: "@cognito_pool_id@",
Username: username,
DesiredDeliveryMediums: ["EMAIL"],
ForceAliasCreation: false,
UserAttributes: [
{ Name: "given_name", Value: firstName },
{ Name: "family_name", Value: lastName},
{ Name: "name", Value: firstName + " " + lastName},
{ Name: "email", Value: email},
{ Name: "custom:title", Value: title},
{ Name: "custom:company", Value: company + ""}
],
};
let cognitoIdentityServiceProvider = new AWS.CognitoIdentityServiceProvider();
cognitoIdentityServiceProvider.adminCreateUser(params, function(error, data) {
if (error) {
console.log("Error adding user to cognito: " + error, error.stack);
reject(error);
} else {
// Uncomment for interesting but verbose logging...
//console.log("Received back from cognito: " + CommonUtils.stringify(data));
cognitoIdentityServiceProvider.adminUpdateUserAttributes({
UserAttributes: [{
Name: "email_verified",
Value: "true"
}],
UserPoolId: "@cognito_pool_id@",
Username: username
}, function(err) {
if (err) {
console.log(err, err.stack);
} else {
console.log("Success!");
resolve(data);
}
});
}
});
Fondamentalement, vous avez besoin d'envoyer une deuxième commande pour forcer l'e-mail considéré comme vérifié. L'utilisateur doit toujours aller à son e-mail pour obtenir le mot de passe temporaire (qui vérifie également l'e-mail). Mais sans ce deuxième appel qui règle le courriel à vérifier, vous ne recevrez pas le bon appel pour réinitialiser leur mot de passe.