【问题标题】:nodejs + passportjs + mongoose: How to pass provider name to templatesnode js + passport js + mongoose:如何将提供者名称传递给模板
【发布时间】:2017-03-27 10:00:28
【问题描述】:

我在 mongoose 模式文档中使用护照 js 进行用户凭证管理:

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

当通过本地护照或 Facebook 登录时,我想将自定义字段添加到护照会话返回提供者信息传递到模板。

那么我如何在 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);
    });
});

这对我来说很正常。提供者通过本地方法返回动态值,facebook ...

【问题讨论】:

    标签: node.js mongodb passport.js mongoose-schema


    【解决方案1】:
        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);
           });
    

    【讨论】:

    • 谢谢@Love-Kesk。我的意思是将自定义变量添加到护照会话中:req.user.provider 并在我的模板中访问。
    【解决方案2】:

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

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

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

    你可以再得到一个SO link

    【讨论】:

    • 谢谢。我想通过localfacebook, google ... 方法检查客户何时登录。如果在此处添加则为静态值。
    • 根据您的要求提供标志值的最简单方法,例如user.isFacebookUser:true。在您的所有提供者中相同,稍后在您想要的位置检查该值
    • 我尝试在路由器中添加简单的文本user.provider = "mymethod";console.log(req.user);,但信息不返回提供者是我的方法。
    • 它应该可以工作,在添加值时调试它(它来了)并检查你的目标位置
    • 在这条线以上return done(null, user);检查你得到了正确的值
    猜你喜欢
    • 2020-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    • 2016-10-28
    • 2016-12-17
    相关资源
    最近更新 更多