首页 > 解决方案 > Cognito 用户更新属性出现错误 - 错误:用户未通过身份验证

问题描述

我收到错误:更新用户属性时用户未通过身份验证错误。如果这不是更新的方式,请分享更新的方式。我提到了https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserAttributes.html,但不明白。

更新代码

function update(username, password) {
try {
    var attributeList = [];
    attributeList.push(new AmazonCognitoIdentity.CognitoUserAttribute({
        Name: "custom:role",
        Value: "some new value"
    }));

    var authenticationDetails = new AmazonCognitoIdentity.AuthenticationDetails({
        Username: username,
        Password: password,
    });
    var userPool = new AmazonCognitoIdentity.CognitoUserPool(poolData);

    var userData = {
        Username: username,
        Pool: userPool
    };
    var cognitoUser = new AmazonCognitoIdentity.CognitoUser(userData);

    cognitoUser.updateAttributes(attributeList, (err, result) => {
        if (err) {
            console.log("\n\n\n\nUpdate Error: ", err, "\n\n\n");
        } else {
            console.log(result);
        }
    });
} catch (e) {
    console.log("\n\n\n\nCommon Error", e, "\n\n\n");
}
}

此处出错

Update Error:  Error: User is not authenticated
    at CognitoUser.updateAttributes (C:\Users\Kiran\Documents\Projects\Rentals-Backend\node_modules\amazon-cognito-identity-js\lib\CognitoUser.js:1040:23)
    at update (C:\Users\Kiran\Documents\Projects\Rentals-Backend\models\user.js:94:21)
    at C:\Users\Kiran\Documents\Projects\Rentals-Backend\models\user.js:33:9
    at new Promise (<anonymous>)
    at Object.exports.signIn (C:\Users\Kiran\Documents\Projects\Rentals-Backend\models\user.js:32:12)
    at exports.signIn (C:\Users\Kiran\Documents\Projects\Rentals-Backend\controllers\user.js:12:11)
    at Layer.handle [as handle_request] (C:\Users\Kiran\Documents\Projects\Rentals-Backend\node_modules\express\lib\router\layer.js:95:5)
    at next (C:\Users\Kiran\Documents\Projects\Rentals-Backend\node_modules\express\lib\router\route.js:137:13)
    at Route.dispatch (C:\Users\Kiran\Documents\Projects\Rentals-Backend\node_modules\express\lib\router\route.js:112:3)
    at Layer.handle [as handle_request] (C:\Users\Kiran\Documents\Projects\Rentals-Backend\node_modules\express\lib\router\layer.js:95:5)
    at C:\Users\Kiran\Documents\Projects\Rentals-Backend\node_modules\express\lib\router\index.js:281:22
    at Function.process_params (C:\Users\Kiran\Documents\Projects\Rentals-Backend\node_modules\express\lib\router\index.js:335:12)
    at next (C:\Users\Kiran\Documents\Projects\Rentals-Backend\node_modules\express\lib\router\index.js:275:10)
    at urlencodedParser (C:\Users\Kiran\Documents\Projects\Rentals-Backend\node_modules\body-parser\lib\types\urlencoded.js:82:7)
    at Layer.handle [as handle_request] (C:\Users\Kiran\Documents\Projects\Rentals-Backend\node_modules\express\lib\router\layer.js:95:5)
    at trim_prefix (C:\Users\Kiran\Documents\Projects\Rentals-Backend\node_modules\express\lib\router\index.js:317:13)
    at C:\Users\Kiran\Documents\Projects\Rentals-Backend\node_modules\express\lib\router\index.js:284:7
    at Function.process_params (C:\Users\Kiran\Documents\Projects\Rentals-Backend\node_modules\express\lib\router\index.js:335:12)
    at next (C:\Users\Kiran\Documents\Projects\Rentals-Backend\node_modules\express\lib\router\index.js:275:10)
    at C:\Users\Kiran\Documents\Projects\Rentals-Backend\node_modules\body-parser\lib\read.js:130:5
    at invokeCallback (C:\Users\Kiran\Documents\Projects\Rentals-Backend\node_modules\raw-body\index.js:224:16)
    at done (C:\Users\Kiran\Documents\Projects\Rentals-Backend\node_modules\raw-body\index.js:213:7)
    at IncomingMessage.onEnd (C:\Users\Kiran\Documents\Projects\Rentals-Backend\node_modules\raw-body\index.js:273:7)
    at IncomingMessage.emit (events.js:375:28)
    at IncomingMessage.emit (domain.js:470:12)
    at endReadableNT (internal/streams/readable.js:1317:12)
    at processTicksAndRejections (internal/process/task_queues.js:82:21)

标签: amazon-web-servicesamazon-cognito

解决方案


您应该在调用 updateAttributes 之前对用户进行身份验证

cognitoUser.authenticateUser(

https://docs.aws.amazon.com/cognito/latest/developerguide/authentication.html

// Amazon Cognito creates a session which includes the id, access, and refresh tokens of an authenticated user.

var authenticationData = {
        Username : 'username',
        Password : 'password',
    };
    var authenticationDetails = new AmazonCognitoIdentity.AuthenticationDetails(authenticationData);
    var poolData = { UserPoolId : 'us-east-1_ExaMPle',
        ClientId : '1example23456789'
    };
    var userPool = new AmazonCognitoIdentity.CognitoUserPool(poolData);
    var userData = {
        Username : 'username',
        Pool : userPool
    };
    var cognitoUser = new AmazonCognitoIdentity.CognitoUser(userData);
    cognitoUser.authenticateUser(authenticationDetails, {
        onSuccess: function (result) {
            var accessToken = result.getAccessToken().getJwtToken();

            /* Use the idToken for Logins Map when Federating User Pools with identity pools or when passing through an Authorization Header to an API Gateway Authorizer */
            var idToken = result.idToken.jwtToken;
        },

        onFailure: function(err) {
            alert(err);
        },

});

推荐阅读