จะเปลี่ยนสถานะผู้ใช้ FORCE_CHANGE_PASSWORD ได้อย่างไร


97

เมื่อใช้ AWS Cognito ฉันต้องการสร้างผู้ใช้ดัมมี่เพื่อวัตถุประสงค์ในการทดสอบ

จากนั้นผมก็ใช้คอนโซล AWSเพื่อสร้างผู้ใช้ดังกล่าว แต่ผู้ใช้มีของสถานะFORCE_CHANGE_PASSWORDชุด ด้วยค่าดังกล่าวผู้ใช้รายนี้ไม่สามารถพิสูจน์ตัวตนได้

มีวิธีเปลี่ยนสถานะนี้หรือไม่?

UPDATE พฤติกรรมเดียวกันเมื่อสร้างผู้ใช้จาก CLI


1
คำตอบของผู้ใช้จัดทำโดย @joe
donlys

คำตอบ:


15

ขออภัยคุณกำลังประสบปัญหา เราไม่มีกระบวนการขั้นตอนเดียวที่คุณสามารถสร้างผู้ใช้และรับรองความถูกต้องได้โดยตรง เราอาจเปลี่ยนแปลงสิ่งนี้ในอนาคตเช่นอนุญาตให้ผู้ดูแลระบบตั้งรหัสผ่านที่ผู้ใช้ใช้งานได้โดยตรง สำหรับตอนนี้เมื่อคุณสร้างผู้ใช้ทั้งการใช้AdminCreateUserหรือโดยการลงทะเบียนผู้ใช้ที่มี app CONFIRMEDที่ขั้นตอนพิเศษที่จะต้องทั้งการบังคับให้ผู้ใช้เปลี่ยนรหัสผ่านเมื่อเข้าสู่ระบบหรือมีผู้ใช้ตรวจสอบหมายเลขอีเมลหรือโทรศัพท์เพื่อเปลี่ยนสถานะของผู้ใช้เพื่อ


4
สำหรับตอนนี้เมื่อคุณสร้างผู้ใช้โดยใช้ AdminCreateUser หรือโดยการลงทะเบียนผู้ใช้ด้วยแอปจำเป็นต้องมีขั้นตอนเพิ่มเติมบังคับให้ผู้ใช้เปลี่ยนรหัสผ่านเมื่อเข้าสู่ระบบหรือให้ผู้ใช้ยืนยันอีเมลหรือหมายเลขโทรศัพท์เพื่อเปลี่ยนสถานะของผู้ใช้เป็น ยืนยัน efoorts พิเศษเหล่านี้คืออะไรกันแน่และฉันจะเรียกใช้จาก JS SDK ได้อย่างไร
Saurabh Tiwari

3
@joe ชี้ให้เห็นว่าเป็นไปได้แล้วเนื่องจากมีการเพิ่ม มองหา--permanentธง: stackoverflow.com/a/56948249/3165552
isaias-b

149

ฉันรู้ว่ามันผ่านมาระยะหนึ่งแล้ว แต่คิดว่านี่อาจช่วยคนอื่น ๆ ที่เจอโพสต์นี้

คุณสามารถใช้ 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%

หากส่งกลับข้อผิดพลาดเกี่ยวกับUnable to verify secret hash for clientให้สร้างไคลเอ็นต์แอปอื่นโดยไม่มีความลับและใช้รหัสไคลเอ็นต์นั้น

ขั้นตอนที่ 2:หากขั้นตอนที่ 1 สำเร็จก็จะตอบสนองด้วยความ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 ""%

หากคุณได้รับข้อผิดพลาดเกี่ยวกับการInvalid attributes given, XXX is missingส่งผ่านแอตทริบิวต์ที่ขาดหายไปโดยใช้รูปแบบuserAttributes.$FIELD_NAME=$VALUE

คำสั่งดังกล่าวควรส่งคืนผลการพิสูจน์ตัวตนที่ถูกต้องและโทเค็นที่เหมาะสม


สำคัญ:เพื่อให้ใช้งานได้กลุ่มผู้ใช้ Cognito ต้องมีไคลเอนต์แอปที่กำหนดค่าด้วยADMIN_NO_SRP_AUTHฟังก์ชันการทำงาน ( ขั้นตอนที่ 5 ในเอกสารนี้ )


24
เป็นประโยชน์อย่างน่าอัศจรรย์ เคล็ดลับอีกสองข้อ: หากคุณได้รับข้อผิดพลาดเกี่ยวกับ "ไม่สามารถตรวจสอบแฮชลับสำหรับไคลเอนต์" ให้สร้างไคลเอนต์แอปอื่นโดยไม่มีความลับและใช้สิ่งนั้น ( stackoverflow.com/questions/37438879/… ) หากคุณได้รับข้อผิดพลาดเกี่ยวกับ "แอตทริบิวต์ที่ระบุไม่ถูกต้อง XXX หายไป" ให้ส่งแอตทริบิวต์ที่ขาดหายไปโดยใช้รูปแบบuserAttributes.$FIELD_NAME=$VALUE( github.com/aws/aws-sdk-js/issues/1290 )
Lane Rettig

หากคุณไม่สามารถนำผู้ใช้ของคุณออกจาก FORCE_CHANGE_PASSWORD ด้วยคำสั่ง CLI (รวมถึงคำตอบนี้) ให้ลอง "admin-disabled-user" จากนั้น "admin-enable-user" หรือใช้คอนโซล จากนั้นให้ใช้กระบวนการนี้หรือคุณอาจสามารถใช้ขั้นตอนการรีเซ็ตรหัสผ่านปกติได้ บางครั้งผู้ใช้จะ 'หมดอายุ' หากไม่ได้ลงชื่อเข้าใช้ cognito ภายในขีด จำกัด ที่กำหนดไว้ล่วงหน้า (ค่าเริ่มต้น 7 วันที่ฉันคิด)
comfytoday

ลองใช้ CLI และภายในแลมบ์ดาได้รับข้อผิดพลาดนี้: แอตทริบิวต์ที่ระบุไม่ถูกต้องไม่มีชื่อ
kolodi

1
@misher คุณได้รับสิ่งนั้นเนื่องจากคุณสมบัติที่จำเป็น คุณสามารถรวมไว้ในการโทรได้ แต่ไวยากรณ์ค่อนข้างแปลก:--challenge-responses NEW_PASSWORD=password,USERNAME=username,userAttributes.picture=picture,userAttributes.name=name
edzillion

88

ในที่สุดก็มีการเพิ่ม AWSCLI: https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/admin-set-user-password.html

คุณสามารถเปลี่ยนรหัสผ่านของผู้ใช้และสถานะการอัปเดตโดยใช้:

aws cognito-idp admin-set-user-password --user-pool-id <your user pool id> --username user1 --password password --permanent

ก่อนใช้สิ่งนี้คุณอาจต้องอัปเดต AWS CLI ของคุณโดยใช้:

pip3 install awscli --upgrade


13
นี่คือโซลูชันล่าสุดและมีประสิทธิภาพสูงสุด!
บริจาค

7
นี่น่าจะเป็นคำตอบ
Mr. Young

4
ทางออกที่ดีที่สุดและง่ายที่สุดในปี 2020 ขอบคุณ!
ทิวดอร์

23

เพียงเพิ่มรหัสนี้หลังจาก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

การเรียกซ้ำ FTW! ขอบคุณ! (การเรียกซ้ำเป็นการthisท้าทายรหัสผ่านใหม่ที่สมบูรณ์)
Paul S

22

คุณสามารถเปลี่ยนสถานะผู้ใช้นั้นได้FORCE_CHANGE_PASSWORDโดยเรียกrespondToAuthChallenge()ผู้ใช้ดังนี้:

var params = {
  ChallengeName: 'NEW_PASSWORD_REQUIRED', 
  ClientId: 'your_own3j6...0obh',
  ChallengeResponses: {
    USERNAME: 'user3',
    NEW_PASSWORD: 'changed12345'
  },
  Session: 'xxxxxxxxxxZDMcRu-5u...sCvrmZb6tHY'
};

cognitoidentityserviceprovider.respondToAuthChallenge(params, function(err, data) {
  if (err) console.log(err, err.stack); // an error occurred
  else     console.log(data);           // successful response
});

หลังจากนี้คุณจะเห็นในคอนโซลที่สถานะเป็นuser3CONFIRMED


1
ฉันไม่เข้าใจว่าคุณมาที่นี่ได้อย่างไร คุณเรียกว่าอะไรเพื่อให้เซสชันที่คุณ XXX ออกไป เมื่อฉันโทรหา adminInitiateAuth ฉันได้รับข้อผิดพลาดว่า UserNotFoundException
Ryan Shillington

3
ขออภัยหากคำตอบนั้นไม่ชัดเจน รายละเอียดเพิ่มเติมมีดังนี้ 1. กลุ่มผู้ใช้มีไคลเอนต์ชื่อ 'your_own3j63rs8j16bxxxsto25db00obh' ซึ่งสร้างขึ้นโดยไม่มีคีย์ลับที่สร้างขึ้น รหัสข้างต้นจะไม่ทำงานหากลูกค้าได้รับการกำหนดคีย์ 2) คีย์เซสชันคือค่าที่ส่งคืนโดยการโทรcognitoidentityserviceprovider.adminInitiateAuth({ AuthFlow: 'ADMIN_NO_SRP_AUTH', ClientId: 'your_own3j63rs8j16bxxxsto25db00obh', UserPoolId: 'us-east-1_DtNSUVT7n', AuthParameters: { USERNAME: 'user3', PASSWORD: 'original_password' } }, callback);
Ariel Araza

3) user3ถูกสร้างขึ้นในคอนโซลและให้รหัสผ่านในตอนแรก'original_password'
Ariel Araza

ตกลง. ฉันเข้าใจแล้วว่าทำไมฉันถึงได้รับ UserNotFoundException เป็นเพราะฉันใช้นามแฝงเป็นชื่อผู้ใช้ในการเข้าสู่ระบบซึ่งทำงานได้ดีใน JS API แต่ดูเหมือนจะใช้กับ adminInitiateAuth ไม่ได้ ขอบคุณ Ariel Araza ฉันขอขอบคุณสำหรับความช่วยเหลือของคุณ
Ryan Shillington

เย้! ในที่สุดฉันก็ใช้งานได้ ขอบคุณ! ขอบคุณ Ariel!
Ryan Shillington

11

ไม่แน่ใจว่าคุณยังต่อสู้กับสิ่งนี้อยู่หรือไม่ แต่เพื่อสร้างผู้ใช้ทดสอบจำนวนมากเท่านั้นฉันใช้สิ่งawscliนี้

  1. ใช้คำสั่งย่อย sign-up จาก cognito-idp เพื่อสร้างผู้ใช้
aws cognito-idp sign-up \
   --region %aws_project_region% \
   --client-id %aws_user_pools_web_client_id% \
   --username %email_address% \
   --password %password% \
   --user-attributes Name=email,Value=%email_address%
  1. ยืนยันผู้ใช้โดยใช้ admin-confirm-sign-up
aws cognito-idp admin-confirm-sign-up \
--user-pool-id %aws_user_pools_web_client_id% \
--username %email_address%

5

อัพเดท:

ตอนนี้ฉันกำลังใช้สิ่งนี้แปลเป็นขยายภายใน NodeJS Lambda:

// enable node-fetch polyfill for Node.js
global.fetch = require("node-fetch").default;
global.navigator = {};

const AWS = require("aws-sdk");
const cisp = new AWS.CognitoIdentityServiceProvider();

const Amplify = require("@aws-amplify/core").default;
const Auth = require("@aws-amplify/auth").default;

...


/*
  this_user: {
    given_name: string,
    password: string,
    email: string,
    cell: string
  }
*/
const create_cognito = (this_user) => {
  let this_defaults = {
    password_temp: Math.random().toString(36).slice(-8),
    password: this_user.password,
    region: global._env === "prod" ? production_region : development_region,
    UserPoolId:
      global._env === "prod"
        ? production_user_pool
        : development_user_pool,
    ClientId:
      global._env === "prod"
        ? production_client_id
        : development_client_id,
    given_name: this_user.given_name,
    email: this_user.email,
    cell: this_user.cell,
  };

  // configure Amplify
  Amplify.configure({
    Auth: {
      region: this_defaults.region,
      userPoolId: this_defaults.UserPoolId,
      userPoolWebClientId: this_defaults.ClientId,
    },
  });
  if (!Auth.configure())
    return Promise.reject("could not configure amplify");

  return new Promise((resolve, reject) => {
    let _result = {};

    let this_account = undefined;
    let this_account_details = undefined;

    // create cognito account
    cisp
      .adminCreateUser({
        UserPoolId: this_defaults.UserPoolId,
        Username: this_defaults.given_name,
        DesiredDeliveryMediums: ["EMAIL"],
        ForceAliasCreation: false,
        MessageAction: "SUPPRESS",
        TemporaryPassword: this_defaults.password_temp,
        UserAttributes: [
          { Name: "given_name", Value: this_defaults.given_name },
          { Name: "email", Value: this_defaults.email },
          { Name: "phone_number", Value: this_defaults.cell },
          { Name: "email_verified", Value: "true" },
        ],
      })
      .promise()
      .then((user) => {
        console.warn(".. create_cognito: create..");
        _result.username = user.User.Username;
        _result.temporaryPassword = this_defaults.password_temp;
        _result.password = this_defaults.password;

        // sign into cognito account
        return Auth.signIn(_result.username, _result.temporaryPassword);
      })
      .then((user) => {
        console.warn(".. create_cognito: signin..");

        // complete challenge
        return Auth.completeNewPassword(user, _result.password, {
          email: this_defaults.email,
          phone_number: this_defaults.cell,
        });
      })
      .then((user) => {
        console.warn(".. create_cognito: confirmed..");
        this_account = user;
        // get details
        return Auth.currentAuthenticatedUser();
      })
      .then((this_details) => {
        if (!(this_details && this_details.attributes))
          throw "account creation failes";

        this_account_details = Object.assign({}, this_details.attributes);

        // signout
        return this_account.signOut();
      })
      .then(() => {
        console.warn(".. create_cognito: complete");
        resolve(this_account_details);
      })
      .catch((err) => {
        console.error(".. create_cognito: error");
        console.error(err);
        reject(err);
      });
  });
};

ฉันกำลังตั้งรหัสผ่านชั่วคราวจากนั้นจึงรีเซ็ตเป็นรหัสผ่านที่ผู้ใช้ร้องขอ

โพสต์เก่า:

คุณสามารถแก้ปัญหานี้ได้โดยใช้ amazon-cognito-identity-js SDK โดยการพิสูจน์ตัวตนด้วยรหัสผ่านชั่วคราวหลังจากสร้างบัญชีด้วยcognitoidentityserviceprovider.adminCreateUser()และเรียกใช้cognitoUser.completeNewPasswordChallenge()ภายในcognitoUser.authenticateUser( ,{newPasswordRequired})- ทั้งหมดนี้อยู่ในฟังก์ชันที่สร้างผู้ใช้ของคุณ

ฉันใช้รหัสด้านล่างใน AWS lambda เพื่อสร้างบัญชีผู้ใช้ 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 });
    });

@ ทอม - มันเหมาะกับคุณไหม? อะไรที่ฉันสามารถชี้แจง?
qqan.ny

ตอนนี้ดีขึ้นมาก
Tom Aranda

@ qqan.ny ใช้สัญญาและการติดต่อกลับในเวลาเดียวกันหรือไม่? ทำไม?
Iurii Golskyi

@Iurii Golskyi - ตอนนั้นฉันไม่รู้ดีกว่าเพิ่งเริ่มเรียนรู้ทั้ง AWS และ JS ตั้งแต่เริ่มต้น
qqan.ny

4

สำหรับ Java SDK สมมติว่าไคลเอ็นต์ Cognito ของคุณได้รับการตั้งค่าและคุณมีผู้ใช้ของคุณอยู่ในสถานะ FORCE_CHANGE_PASSWORD คุณสามารถทำสิ่งต่อไปนี้เพื่อให้ผู้ใช้ของคุณได้รับการยืนยัน ... จากนั้นจึงรับรองความถูกต้องตามปกติ

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

หวังว่าจะช่วยในการทดสอบการรวมเหล่านั้น (ขออภัยเกี่ยวกับการจัดรูปแบบ)


4

โดยทั่วไปนี่เป็นคำตอบเดียวกัน แต่สำหรับ. Net C # SDK:

ต่อไปนี้จะสร้างผู้ดูแลระบบโดยใช้ชื่อผู้ใช้และรหัสผ่านที่ต้องการ มีโมเดลผู้ใช้ดังต่อไปนี้:

public class User
{
    public string Username { get; set; }
    public string Password { get; set; }
}

คุณสามารถสร้างผู้ใช้และทำให้พร้อมใช้งานโดยใช้:

   public void AddUser(User user)
    {
        var tempPassword = "ANY";
        var request = new AdminCreateUserRequest()
        {
            Username = user.Username,
            UserPoolId = "MyuserPoolId",
            TemporaryPassword = tempPassword
        };
        var result = _cognitoClient.AdminCreateUserAsync(request).Result;
        var authResponse = _cognitoClient.AdminInitiateAuthAsync(new AdminInitiateAuthRequest()
        {
            UserPoolId = "MyuserPoolId",
            ClientId = "MyClientId",
            AuthFlow = AuthFlowType.ADMIN_NO_SRP_AUTH,
            AuthParameters = new Dictionary<string, string>()
            {
                {"USERNAME",user.Username },
                {"PASSWORD", tempPassword}
            }
        }).Result;
        _cognitoClient.RespondToAuthChallengeAsync(new RespondToAuthChallengeRequest()
        {
         ClientId = "MyClientId",
            ChallengeName = ChallengeNameType.NEW_PASSWORD_REQUIRED,
            ChallengeResponses = new Dictionary<string, string>()
            {
                {"USERNAME",user.Username },
                {"NEW_PASSWORD",user.Password }
            },
            Session = authResponse.Session
        });
    }

3

หากคุณพยายามเปลี่ยนสถานะเป็นผู้ดูแลระบบจากคอนโซล จากนั้นทำตามขั้นตอนด้านล่างหลังจากสร้างผู้ใช้

  1. ใน Cognito goto -> "Manage user pool" ->
  2. ไปที่ "การตั้งค่าไคลเอนต์แอป" ในส่วนการรวมแอป
  3. ตรวจสอบรายการด้านล่าง i) Cognito User Pool ii) การให้รหัสการอนุญาต iii) การให้สิทธิ์โดยนัย iv) โทรศัพท์ v) อีเมล vi) openid vii) โปรไฟล์ aws.cognito.signin.user.admin viii)
  4. ป้อน URL เรียกกลับของแอปพลิเคชันของคุณ หากคุณไม่แน่ใจให้ป้อนเช่นhttps://google.comเป็นต้นไปคุณสามารถเปลี่ยนเป็น URL เรียกกลับจริงของคุณได้
  5. คลิกที่บันทึกการเปลี่ยนแปลง
  6. เมื่อบันทึกการเปลี่ยนแปลงแล้วให้คลิกที่ลิงค์ "Launch Hosted UI"
  7. ป้อนข้อมูลรับรองของผู้ใช้ที่สร้างขึ้นใหม่
  8. รีเซ็ตรหัสผ่านด้วยข้อมูลรับรองใหม่และแบ่งปันให้กับผู้ใช้

ขั้นตอนที่ 2

ขั้นตอนที่ 3 4 5 6

ขั้นตอนที่ 7

ขั้นตอนที่ 8


2

ฉันรู้ว่ามันเป็นคำตอบเดียวกัน แต่คิดว่ามันอาจช่วยGoชุมชนนักพัฒนาได้ โดยพื้นฐานแล้วเป็นการเริ่มต้นคำขอรับรองความถูกต้องรับเซสชันและตอบสนองต่อความท้าทายNEW_PASSWORD_REQUIRED

func sessionWithDefaultRegion(region string) *session.Session {
    sess := Session.Copy()
    if v := aws.StringValue(sess.Config.Region); len(v) == 0 {
        sess.Config.Region = aws.String(region)
    }

    return sess
}



func (c *CognitoAppClient) ChangePassword(userName, currentPassword, newPassword string)   error {

    sess := sessionWithDefaultRegion(c.Region)
    svc := cognitoidentityprovider.New(sess)

    auth, err := svc.AdminInitiateAuth(&cognitoidentityprovider.AdminInitiateAuthInput{
        UserPoolId:aws.String(c.UserPoolID),
        ClientId:aws.String(c.ClientID),
        AuthFlow:aws.String("ADMIN_NO_SRP_AUTH"),
        AuthParameters: map[string]*string{
            "USERNAME": aws.String(userName),
            "PASSWORD": aws.String(currentPassword),
        },

    })



    if err != nil {
        return err
    }

    request := &cognitoidentityprovider.AdminRespondToAuthChallengeInput{
        ChallengeName: aws.String("NEW_PASSWORD_REQUIRED"),
        ClientId:aws.String(c.ClientID),
        UserPoolId: aws.String(c.UserPoolID),
        ChallengeResponses:map[string]*string{
            "USERNAME":aws.String(userName),
            "NEW_PASSWORD": aws.String(newPassword),
        },
        Session:auth.Session,
    }


    _, err = svc.AdminRespondToAuthChallenge(request)

    return err 
}

นี่คือการทดสอบหน่วย:

import (
    "fmt"
    "github.com/aws/aws-sdk-go/service/cognitoidentityprovider"
    . "github.com/smartystreets/goconvey/convey"
    "testing"
)


func TestCognitoAppClient_ChangePassword(t *testing.T) {


    Convey("Testing ChangePassword!", t, func() {
        err := client.ChangePassword("user_name_here", "current_pass", "new_pass")



        Convey("Testing ChangePassword Results!", func() {
            So(err, ShouldBeNil)

        })

    })
}

1

ตกลง. ในที่สุดฉันก็มีรหัสที่ผู้ดูแลระบบสามารถสร้างผู้ใช้ใหม่ได้ กระบวนการจะเป็นดังนี้:

  1. ผู้ดูแลระบบสร้างผู้ใช้
  2. ผู้ใช้ได้รับอีเมลพร้อมรหัสผ่านชั่วคราว
  3. ผู้ใช้เข้าสู่ระบบและขอให้เปลี่ยนรหัสผ่าน

ขั้นตอนที่ 1 เป็นส่วนที่ยาก นี่คือรหัสของฉันสำหรับสร้างผู้ใช้ใน 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);
      }
    });
  }
});

โดยทั่วไปคุณต้องส่งคำสั่งที่สองเพื่อบังคับให้อีเมลได้รับการพิจารณายืนยัน ผู้ใช้ยังคงต้องไปที่อีเมลเพื่อรับรหัสผ่านชั่วคราว (ซึ่งจะยืนยันอีเมลด้วย) แต่หากไม่มีสายที่สองที่ตั้งค่าอีเมลให้ยืนยันคุณจะไม่ได้รับการติดต่อกลับเพื่อรีเซ็ตรหัสผ่าน


ฉันยังไม่ได้รับอีเมลข้อเสนอแนะใด ๆ ?
Vinicius

แปลกคุณตั้งค่าที่อยู่อีเมลอย่างถูกต้องใน Cognito พร้อมการเข้าถึง SES ฯลฯ หรือไม่? Cogntio จะไม่เพียงแค่ส่งอีเมลถึงผู้อื่นจนกว่าคุณจะยืนยันที่อยู่อีเมลที่คุณพยายามส่งถึงหรือคุณได้รับอนุมัติให้ส่งถึงใครก็ได้
Ryan Shillington

ฉันได้รับอีเมลรหัสยืนยันดังนั้นการตั้งค่าจึงถูกต้อง เพียงแค่อีเมลที่มีรหัสผ่านชั่วคราวไม่มา ... ฉันลงเอยด้วยการสร้างแลมบ์ดาที่แนบมากับทริกเกอร์การลงทะเบียนล่วงหน้าเพื่อส่งอีเมล
Vinicius
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.