node.js - PassportJs isAuthenticated 不认证

标签 node.js express session authentication passport.js

我已通过 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/

相关文章:

php - session flash 消息执行两次 Laravel

java - 为 Web 应用程序选择纯 HTTPS 或 HTTP/HTTPS

php - 无法重新生成 session ID zend 框架 2?

jquery - SQL Server 与 jQuery 和 Node js 的连接

javascript - sequelizejs 关系/关联、hasMany/belongsTo 与定义模型上的引用

node.js - Api rest Express Nodejs 超时

javascript - Angular 参数和 Express 命中了错误的请求 URL

javascript - 在 Node.js 中打破回调函数内的 "for"循环

node.js - NPM 安装错误 - node-gyp

javascript - 在 sails.js 下使用 SSL 时 Passport.js 无法初始化