nodejs + passportjs + mongoose:如何将提供商名称传递给模板

nodejs + passportjs + mongoose: How to pass provider name to templates

我将 passport js 用于用户凭据管理和 mongoose 模式文档:

var customerSchema = new Schema({
    info: {
        firstname: String,
        lastname: String,
        telephone: String,
        fax: String
    },
    local: {
        email: {
            type: String
        },
        password: {
            type: String
        }
    },
        facebook: {
        id: String,
        token: String,
        email: String,
        name: String,
        photo: String
    },
    google: {
        id: String,
        token: String,
        email: String,
        name: String,
        photo: String
    },
    status: String
}, {
    timestamps: true
});

当使用 passportjs 登录并添加提供商名称时:

passport.use('local.login', new LocalStrategy({
    usernameField: 'email',
    passwordField: 'password',
    passReqToCallback: true
}, function(req, email, password, done) {
    req.checkBody('email', 'Email address invalid.').notEmpty().isEmail();
    req.checkBody('password', 'Password invalid.').notEmpty();

    var errors = req.validationErrors();

    if (errors) {
        var messages = [];
        errors.forEach(function(error) {
            messages.push(error.msg);
        });
        return done(null, false, req.flash('error', messages));
    }
    //find user
    Customer.findOne({
        'local.email': email
    }, function(err, customer) {
        if (err) {
            return done(err);
        }

        if (!customer) {
            return done(null, false, {
                message: 'Customer not found.'
            });
        }
        if (!customer.validPassword(password)) {
            return done(null, false, {
                message: 'Customer info invalid.'
            });
        }
        customer.provider = "local"; //Add more var to customer info
        console.log("User Info: " + customer.provider);
        return done(null, customer);
    });

}));

passport.serializeUser(function(user, done) {
    console.log("Serialize User: " + user);
    done(null, user._id);
});

当通过本地 passport 或 facebook 登录时,我想将自定义字段添加到 passport 会话中 return 提供商信息传递到模板。

那么我如何在 Passport 中执行此操作?

更新 1:

定义的变量:

var provider = null;

在:

...
if (!customer.validPassword(password)) {
        return done(null, false, {
             message: 'Customer info invalid.'
        });
}
provider = "local"; //Add more var to customer info
return done(null, customer);
...

我已经使用@Love-Kesh 帮助代码:

passport.deserializeUser(function(customerId, done) {

    Customer.findById(customerId, function(err, user) {

        var newUser = user.toObject();
        newUser['provider'] = provider;

        done(err, newUser);
    });
});

它符合我的意思。提供者 return 通过方法本地、facebook 的动态值...

如果我没记错的话,你想在 passport session 上添加额外的信息。

因此,如果您想在护照会话中添加自定义信息,则可以将其添加到 deserializeUser

passport.deserializeUser(function(id, done) {
    getUser(id).then(function(user) {
        user.anything = 'whatever you want';
        return done(null, user);
    });
});

你可以再得到一个SO link

    passport.use('local.login', new LocalStrategy({
    usernameField: 'email',
    passwordField: 'password',
    passReqToCallback: true
}, function(req, email, password, done) {
    req.checkBody('email', 'Email address invalid.').notEmpty().isEmail();
    req.checkBody('password', 'Password invalid.').notEmpty();

    var errors = req.validationErrors();

    if (errors) {
        var messages = [];
        errors.forEach(function(error) {
            messages.push(error.msg);
        });
        return done(null, false, req.flash('error', messages));
    }


    //check if user local 
    //need to pass provider from client side
    if(req.body.provider=='local'){

        //find user
        Customer.findOne({
            'local.email': email
        }, function(err, customer) {
            if (err) {
                return done(err);
            }

            if (!customer) {
                return done(null, false, {
                    message: 'Customer not found.'
                });
            }
            if (!customer.validPassword(password)) {
                return done(null, false, {
                    message: 'Customer info invalid.'
                });
            }
        customer.provider = "local"; //Add more var to customer info
        console.log("User Info: " + customer.provider);
        return done(null, customer);
    });

    }else{

        //do whatever you want

    }
});

}



}));

passport.serializeUser(function(user, done) {
    console.log("Serialize User: " + user);

    //pass complete user here 
    done(null, user);
});

更新了下面的代码

passport.deserializeUser(function(loggedUser, done) {
            var provider = loggedUser.provider;

           Customer.findById(loggedUser.id,function(error, user) {

            //need to convert into object
            var newUser=user.toObject();                   
            newUser['provider']=provider;

            return done(null, newUser);



        });

          //or return direct  return done(null, loggedUser);
       });