AWS Cognito 节点 lambda 迁移用户:未定义 authenticateUser

AWS Cognito node lambda migration user : authenticateUser is not defined

我想使用 AWS 控制台函数中的迁移用户 lambda 将用户从 userPool 1 迁移到 userPool 2。为了做到这一点,我使用了 AWS 提供的脚本,但我找不到如何使用 authenticateUser 例如。执行时未定义。

执行迁移lambda。 authenticateUser 未定义

我也试过创建一个层,成功导入并在我的 lambda 函数中设置了层,但也无法使其工作。

exports.handler = (event, context, callback) => {

    var user;

    if ( event.triggerSource == "UserMigration_Authentication" ) {

        // authenticate the user with your existing user directory service
        user = authenticateUser(event.userName, event.request.password);
        if ( user ) {
            event.response.userAttributes = {
                "email": user.emailAddress,
                "email_verified": "true"
            };
            event.response.finalUserStatus = "CONFIRMED";
            event.response.messageAction = "SUPPRESS";
            context.succeed(event);
        }
        else {
            // Return error to Amazon Cognito
            callback("Bad password");
        }
    }
    else if ( event.triggerSource == "UserMigration_ForgotPassword" ) {

        // Lookup the user in your existing user directory service
        user = lookupUser(event.userName);
        if ( user ) {
            event.response.userAttributes = {
                "email": user.emailAddress,
                // required to enable password-reset code to be sent to user
                "email_verified": "true"  
            };
            event.response.messageAction = "SUPPRESS";
            context.succeed(event);
        }
        else {
            // Return error to Amazon Cognito
            callback("Bad password");
        }
    }
    else { 
        // Return error to Amazon Cognito
        callback("Bad triggerSource " + event.triggerSource);
    }
};

authenticateUser 未定义

我的问题是:我们如何导入这个函数?

非常感谢。

该示例代码用于从遗留数据库迁移用户,而 authenticateUser、lookupUser 函数只是您的业务逻辑的抽象(AWS 无法为您编写)。例如,如果您必须从遗留数据库(而不是用户池)迁移,那么您将在 table 中查找他们的用户,获取他们的盐,使用与您相同的逻辑散列传递给迁移触发器的密码在您的遗留身份验证方法中执行,将其与遗留数据库中存储的散列密码进行比较,等等。(如果您以明文形式存储密码,它会变得更简单一些,但我们不考虑这一点。)

下面的代码片段应该可以为您完成大部分迁移工作。有人在 Github 上提出了类似的问题并引用了这个 Whosebug 问题。

const AWS = require('aws-sdk');
const cognitoIdentity = new AWS.CognitoIdentityServiceProvider({ region: '<your-region-here>' });

const UserPoolId = process.env.deprecatedUserPoolId;

exports.handler = async (event) => {
    const { userName } = event;

    const getUserParams = {
        Username: userName,
        UserPoolId
    };

    try {
        const user = await cognitoIdentity.adminGetUser(getUserParams).promise();
        //TODO: if you have custom attributes, grab them from the user variable and store them in the response below
        event.response = { finalUserStatus: "CONFIRMED" }
        return event;
    } catch (e) {
        throw e; //no user to migrate, give them an error in the client 
    }
};