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