2016-10-27 3 views
16

Используя AWS Cognito, я хочу создать фиктивных пользователей для тестирования.Как изменить статус пользователя FORCE_CHANGE_PASSWORD?

Затем я использую AWS Console для создания такого пользователя, но пользователь имеет свой статус набор для FORCE_CHANGE_PASSWORD. С этим значением этот пользователь не может быть аутентифицирован.

Есть ли способ изменить этот статус?

UPDATE же поведение при создании пользователя из CLI

ответ

8

К сожалению у вас возникли трудности. У нас нет одноэтапного процесса, когда вы можете просто создавать пользователей и проверять их подлинность напрямую. Мы могли бы изменить это в будущем, чтобы позволить администраторам устанавливать пароли, которые могут использоваться пользователями напрямую. На данный момент, когда вы создаете пользователей либо с помощью AdminCreateUser, либо путем регистрации пользователей с приложением, требуются дополнительные шаги, либо заставляя пользователей изменять пароль при входе в систему, либо если пользователи проверяют адрес электронной почты или номер телефона, чтобы изменить статус пользователя на ПОДТВЕРЖДЕНО.

+0

Да, я хочу иметь возможность создавать API-доступ к моему приложению и давать пользователю их имя пользователя и пароль. Я не хочу, чтобы они могли его изменить. – Craig

+0

Я нахожусь в аналогичном сценарии, где менее техническим людям хотелось бы управлять пользователями из пользовательского интерфейса AWS Cognito. Просто хочу, чтобы создать пользователя, а затем отправить им свои учетные записи для входа в систему. Ответ «completeNewPasswordChallenge» на самом деле позволил мне сделать именно это, но чувствует себя грязным от клиента. – pjdicke

6

Вы можете изменить этот статус пользователя FORCE_CHANGE_PASSWORD по телефону respondToAuthChallenge() на пользователя, как это:

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 
}); 

После этого вы увидите в консоли, что подтверждается статус user3

+1

Благодарим вас за ответ, но он выходит за рамки. Как уже говорилось выше, мне нужно полностью управлять консолью или CLI без необходимости стороннего процесса. – Domsware

+0

Я не понимаю, как вы сюда попали. Что вы назвали для того, чтобы получить сеанс, из которого вы закончили XXX? Когда я вызываю adminInitiateAuth, я получаю сообщение об ошибке UserNotFoundException. –

+2

Извините, если этот ответ не был кристально чистым. Вот более подробная информация: 1. В пуле пользователей есть клиент с именем «your_own3j63rs8j16bxxxsto25db00obh», который создается БЕЗ сгенерированного секретного ключа. Вышеприведенный код не будет работать, если клиенту назначен ключ. 2) ключ сеанса значение, возвращаемое вызовом 'cognitoidentityserviceprovider.adminInitiateAuth ({ AuthFlow: 'ADMIN_NO_SRP_AUTH', ClientId: 'your_own3j63rs8j16bxxxsto25db00obh', UserPoolId: 'мы-восток-1_DtNSUVT7n', AuthParameters: { USERNAME:«user3 ', PASSWORD:' original_password ' } }, callback); ' –

24

Я знаю, что прошло какое-то время, но подумал, что это может помочь другим людям, которые попадают на этот пост.

Вы можете использовать AWS CLI для изменения пароля пользователей, однако это многоэтапный процесс:
Шаг 1, чтобы получить маркер сеанса для нужного пользователя:
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%

это ответит вызов «NEW_PASSWORD_REQUIRED», другие параметры задачи и ключ сеанса пользователя. Затем вы можете запустить вторую команду для ответа на вызов:
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 ""%

это должно вернуть действительный результат аутентификации и соответствующие токены.

Для этого для пула пользователей Cognito ДОЛЖЕН иметь клиент приложения, настроенный с функциональностью ADMIN_NO_SRP_AUTH. (примечание, шаг 5 http://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-settings-client-apps.html)

+5

Удивительно полезно. Еще два совета: если вы получите сообщение об ошибке «Невозможно проверить секретный хеш для клиента», создайте еще один клиент приложения без секретности и используйте его (https://stackoverflow.com/questions/37438879/resolve-unable-to-verify -secret-хэш-для-клиента-в-АМАЗОНКИ-Cognito-userpools). Если вы получили сообщение об ошибке «Недопустимые атрибуты, XXX отсутствует», передайте отсутствующие атрибуты с использованием формата 'userAttributes. $ FIELD_NAME = $ VALUE' (https://github.com/aws/aws-sdk-js/issues/1290). –

+0

Спасибо, это сработало для меня. Пожалуйста, исправьте опечатку в команде seccond: '--Client-id' ->' --client-id' – tista3

+0

Я искал шаг за шагом, как это - отлично, спасибо. – leftclickben

0

OK. У меня наконец есть код, где администратор может создать нового пользователя. Процесс выглядит следующим образом:

  1. Администратор создает пользователю
  2. Пользователь получает письмо с их временным паролем
  3. входа пользователя в систему и просят изменить свой пароль

Шаг 1 является твердый часть.Вот мой код для создания пользователя в узле JS:

let params = { 
    UserPoolId: "@[email protected]", 
    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: "@[email protected]", 
     Username: username 
    }, function(err) { 
     if (err) { 
     console.log(err, err.stack); 
     } else { 
     console.log("Success!"); 
     resolve(data); 
     } 
    }); 
    } 
}); 

В принципе, вы должны послать вторую воздаем, чтобы заставить электронную почту, чтобы быть проверено считается. Пользователю по-прежнему необходимо перейти на электронную почту, чтобы получить временный пароль (который также проверяет электронную почту). Но без этого второго вызова, который устанавливает подтверждение электронной почты, вы не получите правильный ответ, чтобы сбросить пароль.

3

Просто добавьте этот код после onSuccess: function (result) { ... }, в свою функцию входа. Затем ваш пользователь будет иметь статус ПОДТВЕРЖДЕНО.

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); 
} 
+1

Это работает для меня.Вы даже можете передать текущий пароль, если вы не хотите его менять. – mvandillen

+0

Работал и для меня! Благодаря! – pjdicke

1

Вы можете решить эту проблему с помощью амазонки-Cognito-тождественного-JS SDK посредством аутентификации с временным паролем, после создания учетной записи с cognitoidentityserviceprovider.adminCreateUser() и работает cognitoUser.completeNewPasswordChallenge() в cognitoUser.authenticateUser(,{newPasswordRequired}) - все внутри функции, которая создает свой пользователь.

Я использую приведенный ниже код внутри лямбда AWS для создания учетных записей пользователей Cognito. Я уверен, что его можно оптимизировать, быть терпеливым со мной. Это мой первый пост, и я до сих пор довольно новичок в 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 }); 
    }); 
+0

Просьба привести пример кода. –

+0

@Tom - это сработает для вас? все, что я могу прояснить? –

+0

Намного лучше. –

Смежные вопросы