Node.js 使用;用户名";Jwt和passport中的字段

Node.js 使用;用户名";Jwt和passport中的字段,node.js,jwt,passport.js,Node.js,Jwt,Passport.js,我正在使用node.js和passport.js使用jwt。如果我使用电子邮件作为用户名,我可以进行身份验证。但是如果我使用实际的用户名,我无法使它工作。这给了我一个“电子邮件未注册”的错误。下面是我如何实现它的: passport.js passport.use( new localStrategy({ usernameField: 'email' }, (username, password, done) => { User.findOn

我正在使用node.js和passport.js使用jwt。如果我使用电子邮件作为用户名,我可以进行身份验证。但是如果我使用实际的用户名,我无法使它工作。这给了我一个“电子邮件未注册”的错误。下面是我如何实现它的:

passport.js

passport.use(
    new localStrategy({ usernameField: 'email' },
        (username, password, done) => {
            User.findOne({ email: username },
                (err, user) => {
                    if (err)
                        return done(err);
                    // unknown user
                    else if (!user)
                        return done(null, false, { message: 'Email is not registered' });
                    // wrong password
                    else if (!user.verifyPassword(password))
                        return done(null, false, { message: 'Wrong password.' });
                    // authentication succeeded
                    else
                        return done(null, user);
                });
        })
);
var userSchema = new mongoose.Schema({
    firstName: {
        type: String,
        required: 'First name can\'t be empty'
    },
    middleName: {
        type: String,
    },
    lastName: {
        type: String,
        required: 'Last name can\'t be empty'
    },
    userName: {
        type: String,
        required: 'Username can\'t be empty'
    },
    email: {
        type: String,
        required: 'Email can\'t be empty',
        unique: true
    },
    password: {
        type: String,
        required: 'Password can\'t be empty',
        minlength : [4,'Password must be atleast 4 character long']
    },
    saltSecret: String,
    isActivated: {
        type: Boolean,
    },
    dateAdded: {
        type: Date
    }
});
module.exports.authenticate = (req, res, next) => {
    // call for passport authentication
    passport.authenticate('local', (err, user, info) => {
        // error from passport middleware
        if (err) return res.status(404).json(err);
        // registered user
        if (user) return res.status(200).json({ "token": user.generateJwt() });
        // unknown user or wrong password
        else return res.status(401).json(info);
    })(req, res);
}
user.model.js

passport.use(
    new localStrategy({ usernameField: 'email' },
        (username, password, done) => {
            User.findOne({ email: username },
                (err, user) => {
                    if (err)
                        return done(err);
                    // unknown user
                    else if (!user)
                        return done(null, false, { message: 'Email is not registered' });
                    // wrong password
                    else if (!user.verifyPassword(password))
                        return done(null, false, { message: 'Wrong password.' });
                    // authentication succeeded
                    else
                        return done(null, user);
                });
        })
);
var userSchema = new mongoose.Schema({
    firstName: {
        type: String,
        required: 'First name can\'t be empty'
    },
    middleName: {
        type: String,
    },
    lastName: {
        type: String,
        required: 'Last name can\'t be empty'
    },
    userName: {
        type: String,
        required: 'Username can\'t be empty'
    },
    email: {
        type: String,
        required: 'Email can\'t be empty',
        unique: true
    },
    password: {
        type: String,
        required: 'Password can\'t be empty',
        minlength : [4,'Password must be atleast 4 character long']
    },
    saltSecret: String,
    isActivated: {
        type: Boolean,
    },
    dateAdded: {
        type: Date
    }
});
module.exports.authenticate = (req, res, next) => {
    // call for passport authentication
    passport.authenticate('local', (err, user, info) => {
        // error from passport middleware
        if (err) return res.status(404).json(err);
        // registered user
        if (user) return res.status(200).json({ "token": user.generateJwt() });
        // unknown user or wrong password
        else return res.status(401).json(info);
    })(req, res);
}
user.controller.js

passport.use(
    new localStrategy({ usernameField: 'email' },
        (username, password, done) => {
            User.findOne({ email: username },
                (err, user) => {
                    if (err)
                        return done(err);
                    // unknown user
                    else if (!user)
                        return done(null, false, { message: 'Email is not registered' });
                    // wrong password
                    else if (!user.verifyPassword(password))
                        return done(null, false, { message: 'Wrong password.' });
                    // authentication succeeded
                    else
                        return done(null, user);
                });
        })
);
var userSchema = new mongoose.Schema({
    firstName: {
        type: String,
        required: 'First name can\'t be empty'
    },
    middleName: {
        type: String,
    },
    lastName: {
        type: String,
        required: 'Last name can\'t be empty'
    },
    userName: {
        type: String,
        required: 'Username can\'t be empty'
    },
    email: {
        type: String,
        required: 'Email can\'t be empty',
        unique: true
    },
    password: {
        type: String,
        required: 'Password can\'t be empty',
        minlength : [4,'Password must be atleast 4 character long']
    },
    saltSecret: String,
    isActivated: {
        type: Boolean,
    },
    dateAdded: {
        type: Date
    }
});
module.exports.authenticate = (req, res, next) => {
    // call for passport authentication
    passport.authenticate('local', (err, user, info) => {
        // error from passport middleware
        if (err) return res.status(404).json(err);
        // registered user
        if (user) return res.status(200).json({ "token": user.generateJwt() });
        // unknown user or wrong password
        else return res.status(401).json(info);
    })(req, res);
}
我需要使用“用户名”和“密码”字段进行身份验证,而不是电子邮件。我之所以使用电子邮件,是因为我所遵循的是教程中使用的内容。多谢各位

以下是我如何尝试实施以获得我需要的,但它不起作用:

passport.use(
    new localStrategy({ usernameField: 'userName' },
        (username, password, done) => {
            User.findOne({ userName: username },
                (err, user) => {
                    if (err)
                        return done(err);
                    // unknown user
                    else if (!user)
                        return done(null, false, { message: 'Useris not registered' });
                    // wrong password
                    else if (!user.verifyPassword(password))
                        return done(null, false, { message: 'Wrong password.' });
                    // authentication succeeded
                    else
                        return done(null, user);
                });
        })
);
试试这个

 passport.use(
    new localStrategy({ usernameField: 'userName' },
        (username, password, done) => {
            User.findOne({ userName: username},
                (err, user) => {
                    if (err)
                        return done(err);
                    // unknown user
                    else if (!user)
                        return done(null, false, { message: 'Email is not registered' });
                    // wrong password
                    else if (!user.verifyPassword(password))
                        return done(null, false, { message: 'Wrong password.' });
                    // authentication succeeded
                    else
                        return done(null, user);
                });
        })
)

在您的前端表单上,不是只有两个字段可供登录吗?一个用于密码,另一个用于电子邮件/用户名?或者你是单独使用电子邮件和用户名表单吗?我只需要使用用户名。在后端和前端,我想使用用户名而不是电子邮件。我已更新了我的答案,请确保您正在请求正文中发送
username