我已通过 Google+ 登录 设置了 PassportJS。
Google 身份验证似乎工作正常,但当我重定向到只有经过身份验证的用户才能访问的页面时。 Passport 的 isAuthenticated()
函数似乎总是返回 false
我见过有人提到你应该能够通过控制台日志找到用户:req.session.passport.user
但是当我控制台日志 req.session
我得到的是:
sessionID: 'Q5NaeyfnAphOK633tKjiGnbbex0KJj7e',
session:
Session {
cookie:
{ path: '/',
_expires: null,
originalMaxAge: null,
httpOnly: true } },
Google 回调路线:
router.get("/google/callback", function(req, res, next) {
passport.authenticate("google", function(err, user, info) {
req.session.save(()=>{
res.redirect("/api/v1/dashboard");
console.log("after Passport AUTH");
});
})(req, res, next);
});
注意:我添加了手动 req.session.save()
以确保 session 被保存。
仪表盘路线:
router.get("/", middleware.isLoggedIn , function(req, res) {
console.log("Request: Get All Dashboard Data!");
models.PortfolioBalance.findAll({ raw: true }).then(function(
portfolioBalance
) {
res.render("dashboard/index", { portfoliobalances: portfolioBalance });
});
});
中间件模块:
module.exports = {
isLoggedIn: function(req, res, next) {
console.log("===========================================");
console.log("isAuthenticated: ", req.isAuthenticated);
console.log("===========================================");
if (req.isAuthenticated()) {
return next();
}
console.log("not authenticated");
res.redirect("/login");
}
};
序列化和反序列化:
// used to serialize the user for the session
passport.serializeUser(function(user, done) {
console.log("SerializeUser:", models.User.userId);
done(null, user.id);
});
// used to deserialize the user
passport.deserializeUser(function(id, done) {
console.log("deserializeUser:", models.User.userId);
models.User.findOne({ where: { userId: id } }).then(function(
err,
user
) {
done(err, user);
});
});
潜在问题:
- 这可能是 passportJS 没有正确序列化和反序列化的问题吗?为什么?因为我从未在身份验证过程中的任何时候看到正在运行的
console.log
消息。
最佳答案
首先,您需要使用身份验证作为中间件来保护路由和登录。
// put in a separate file and then import where you need it for this example lets say auth.js
module.exports = function (){
return {
authenticate: passport.authenticate('google', function (err,user){
if(err)
res.redirect('/login');
if(user)
res.redirect("/api/v1/dashboard");
})(req,res);
}
};
如果你登录,你可能会这样设置
// where you have your routing
var auth = require('path_to_auth.js')();
router.post('/login', auth.authenticate);
在 google 策略内部是您要搜索用户的地方。
// from the passport-google npmjs.com documentation adjust for the actual strategy you use
passport.use(new GoogleStrategy({
returnURL: 'http://localhost:3000/auth/google/return',
realm: 'http://localhost:3000/'
},
function(identifier, done) {
User.findByOpenID({ openId: identifier }, function (err, user) {
return done(err, user);
});
}
));
您还应该导入用户模型,然后像这样进行序列化和反序列化
var User = mongoose.model('User', UserSchema); // adjust to your schema
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
User.findById(id, function (err, user) {
done(err, user);
});
});
关于node.js - PassportJs isAuthenticated 不认证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48024549/