护照 JS req.user 未定义
Passport JS req.user is undefined
我在其他地方看到过这个问题,但是,none 这些解决方案似乎对我有用。在尝试控制台记录 req.session 和 req.user 时,我有一个 return 会话,如下所示,但是,req.user return 未定义。我认为在序列化用户时存在问题,因为 VS 代码提醒我 passport.serialUser 函数中的“'id' 属性 类型用户不存在”,但它控制台记录 user.id 正确(我的用户文档的对象 ID)。
如果有人知道 user.id 属性 而不是 existing/the 用户未定义的可能原因,我将不胜感激。
passport.js 文件:
const LocalStrategy = require("passport-local").Strategy;
const bcrypt = require("bcrypt");
const User = require("../models/User");
const verifyCallback = (username, password, done) => {
User.findOne({ username: username })
.then((user) => {
if (!user) {
return done(null, false);
}
// Validate Password
bcrypt.compare(password, user.password).then((isMatch) => {
if (isMatch) {
return done(null, user);
} else {
return done(null, false);
}
});
})
.catch((err) => {
done(err);
});
};
const strategy = new LocalStrategy(verifyCallback);
passport.use(strategy);
passport.serializeUser((user, done) => {
done(null, user.id);
});
passport.deserializeUser((userId, done) => {
User.findById(userId)
.then((user) => {
done(null, user);
})
.catch((err) => done(err));
});
index.js 文件:
session({
secret: process.env.SECRET,
resave: false,
saveUninitialized: true,
store: sessionStore,
cookie: {
maxAge: 1000 * 60 * 60 * 24,
},
})
);
// Passport Auth Middleware
const passportConfig = require("./config/passport");
// Initialize Passport and Use Session for Serialize/Deserialization
app.use(passport.initialize());
app.use(passport.session());
app.use((req, res, next) => {
console.log(req.session);
console.log(req.user);
next();
});
控制台日志:
cookie: {
path: '/',
_expires: 2021-11-17T02:08:23.650Z,
originalMaxAge: 86400000,
httpOnly: true
}
}
undefined
用户文档示例:
{"_id":{"$oid":"6186c13beb18d33d5088f7b2"},
"username":"coolguy9",
"password":"bp5apH8Q8k8hP4WpCNt6/O40M9I0jlkG.LXIE3d/V89Kmtmk1plxa",
"firstname":"Bob",
"lastname":"Woodhull",
"team":"Warehouse",
"createdAt":{"$date":{"$numberLong":"1636221243904"}},
"updatedAt":{"$date":{"$numberLong":"1636221243904"}},
"__v":{"$numberInt":"0"}}```
问题已解决。在我前端的 loginAPI.js 文件中,它包含 axios 实例,我需要包含选项 withCredentials: true
.
示例:
baseURL: "http://localhost:8000/api/",
timeout: 1000,
withCredentials: true,
});
我在其他地方看到过这个问题,但是,none 这些解决方案似乎对我有用。在尝试控制台记录 req.session 和 req.user 时,我有一个 return 会话,如下所示,但是,req.user return 未定义。我认为在序列化用户时存在问题,因为 VS 代码提醒我 passport.serialUser 函数中的“'id' 属性 类型用户不存在”,但它控制台记录 user.id 正确(我的用户文档的对象 ID)。
如果有人知道 user.id 属性 而不是 existing/the 用户未定义的可能原因,我将不胜感激。
passport.js 文件:
const LocalStrategy = require("passport-local").Strategy;
const bcrypt = require("bcrypt");
const User = require("../models/User");
const verifyCallback = (username, password, done) => {
User.findOne({ username: username })
.then((user) => {
if (!user) {
return done(null, false);
}
// Validate Password
bcrypt.compare(password, user.password).then((isMatch) => {
if (isMatch) {
return done(null, user);
} else {
return done(null, false);
}
});
})
.catch((err) => {
done(err);
});
};
const strategy = new LocalStrategy(verifyCallback);
passport.use(strategy);
passport.serializeUser((user, done) => {
done(null, user.id);
});
passport.deserializeUser((userId, done) => {
User.findById(userId)
.then((user) => {
done(null, user);
})
.catch((err) => done(err));
});
index.js 文件:
session({
secret: process.env.SECRET,
resave: false,
saveUninitialized: true,
store: sessionStore,
cookie: {
maxAge: 1000 * 60 * 60 * 24,
},
})
);
// Passport Auth Middleware
const passportConfig = require("./config/passport");
// Initialize Passport and Use Session for Serialize/Deserialization
app.use(passport.initialize());
app.use(passport.session());
app.use((req, res, next) => {
console.log(req.session);
console.log(req.user);
next();
});
控制台日志:
cookie: {
path: '/',
_expires: 2021-11-17T02:08:23.650Z,
originalMaxAge: 86400000,
httpOnly: true
}
}
undefined
用户文档示例:
{"_id":{"$oid":"6186c13beb18d33d5088f7b2"},
"username":"coolguy9",
"password":"bp5apH8Q8k8hP4WpCNt6/O40M9I0jlkG.LXIE3d/V89Kmtmk1plxa",
"firstname":"Bob",
"lastname":"Woodhull",
"team":"Warehouse",
"createdAt":{"$date":{"$numberLong":"1636221243904"}},
"updatedAt":{"$date":{"$numberLong":"1636221243904"}},
"__v":{"$numberInt":"0"}}```
问题已解决。在我前端的 loginAPI.js 文件中,它包含 axios 实例,我需要包含选项 withCredentials: true
.
示例:
baseURL: "http://localhost:8000/api/",
timeout: 1000,
withCredentials: true,
});