我使用 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 Callback路线:
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()
以确保正在保存会话。
信息中心路线:
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);
});
});
潜在问题:
console.log
消息在任何时候运行。答案 0 :(得分:5)
首先,您需要使用authenticate作为中间件来保护路由和登录。
// 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);
谷歌策略的内部是您要搜索用户的位置。
// 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);
});
});