[英]req.user not wired by Passport
如標題所示,無論我在哪里調用req.user,它都會向我輸出一個未定義的對象,並導致500 Internal Server Error。
這是我到目前為止的代碼(不是全部,只是感興趣的部分):
app.js
app.use(cookieParser());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(session({
secret: 'keyboard cat',
resave: false,
saveUninitialized: true,
cookie: { secure: true }
})); //This was added as a second temptative
app.use(passport.initialize());
app.use(passport.session());
// config
passport.use('local', new LocalStrategy({
usernameField: 'email',
passwordField: 'pwd',
session: false
},
function (username, password, done) {
User.findOne({ email: username }, (err, usr) => {
if (err) { return done(err); }
// TODO: refactor for right error message handling as below!!
if (!usr)
return done(null, false, { success: false, status: 403, message: 'Incorrect username.' });
if (!usr.authenticate(password))
return done(null, false, { success: false, status: 403, message: 'Incorrect password.' });
if (!usr.verified)
return done(null, false, { succes: false, status: 400, message: 'User not confirmed' });
delete usr.salt;
delete usr.password;
return done(null, usr);
});
})
);
passport.serializeUser(function (user, done) {
const tempUser = Object.assign({}, { x: user.id, y: user.email, z: user.salt });
done(null, user.id);
});
passport.deserializeUser(function (id, done) {
console.warn(`WE DID IT`);
User.findById(id, function (err, user) {
console.log(`id in input ${id}`);
console.log(`deserializing user ${user}`);
done(err, user);
});
});
我用於auth的控制器 :
exports.authenticate = (req, res) => {
passport.authenticate('local', { session: false /*, failureCallback: failureCallback */}, (err, user, info) => {
if (!err) {
if (!user)
res.json(info);
else {
var userCopy = Object.assign({}, user._doc);
delete userCopy.password;
delete userCopy.salt;
delete userCopy.profilePicture;
Activity.checkin.getActiveUserCheckin(userCopy._id, (err, activeCheckin) => {
if(!err){
if(!!activeCheckin) userCopy.activeCheckinOnStructure = activeCheckin.structureId;
var token = jwt.sign(userCopy, require('../../secret'));
res.send({ success: true, status: 200, token: token });
}else{
res.send({ success: false, status: 500, message: err });
}
});
}
}
})(req, res);
};
我嘗試過的事情:首先,我嘗試添加一個Express-Session(如您在app.use(session)部分中所見)以添加Express'會話。 然后,我嘗試將用戶設置為類似app.set(“ user”,user),但這並不好,因為在調用方法時我無法訪問app變量。
在我看來,app.js部分和login部分的配置已經很好地完成了,並且護照應該自動將req.user字段連接起來,但是這並沒有發生,我無法解釋自己為什么這是真的嗎
該特定問題的問題在於從未調用過userSerializer。 添加req.login解決了這一天
passport.authenticate('local', { session: true /*, failureCallback: failureCallback */}, (err, user, info) => {
if (!err) {
if (!user)
res.json(info);
else {
var userCopy = Object.assign({}, user._doc);
delete userCopy.password;
delete userCopy.salt;
delete userCopy.profilePicture;
Activity.checkin.getActiveUserCheckin(userCopy._id, (err, activeCheckin) => {
if(!err){
if(!!activeCheckin) userCopy.activeCheckinOnStructure = activeCheckin.structureId;
var token = jwt.sign(userCopy, require('../../secret'));
req.login(user, function(err) {
if (err) {
return res.status(401).json(err);
} else {
res.send({ success: true, status: 200, token: token });
}
});
}else{
res.send({ success: false, status: 500, message: err });
}
});
}
}
})(req, res);
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.