PassportJS和Express 4未正确保存cookie /会话

时间:2016-06-13 22:02:01

标签: javascript node.js express cookies typescript

我有一个使用Express 4和Passport 0.3.2的应用程序。我设置了// PATH ENTER path.enter() .append("path") .attr("fill", "#21addd") .attr('class', 'arc') // PATH TRANSITION path.transition() .duration(1200) .ease('linear') .attr('d', function(d){ console.log(d);drawArc(d)}) .call(arcTween); 策略,在passport-local端点发送用户名和密码时获取正确的用户信息。

但是,用户信息永远不会正确保存。因此,/session始终未在所有侦听器中定义,req.user始终返回false。

我看到其他帖子经常发现中间件设置的排序问题,但我已经以正确的方式订购了它们,所以我不知道从哪里开始。

以下是req.isAuthenticated()的{​​{1}}听众:

POST

以下是我的/session设置:

app.post("/session",
    passport.authenticate('local'),
    (req: any, res: any) => {
        // if we reach this point, we authenticated correctly
        res.sendStatus(201);
    }
);

以下是我的应用设置:

LocalStrategy

我使用以下依赖版本:

passport.use(new LocalStrategy(
    (username, password, done) => {
        let users = userRepository.getAll();

        let usernameFilter = users.filter(u => u.getUsername() === username);
        if (!usernameFilter || usernameFilter.length !== 1) {
            return done(null, false, { message: 'Incorrect username.' });
        }

        if (!password || password !== "correct") {
            return done(null, false, { message: 'Incorrect password.' });
        }

        return done(null, usernameFilter[0]);
    }
));

我已向let app = express(); app.use(cookieParser()); app.use(bodyParser.json()); app.use(expressSession({ secret: 'my secret key', resave: true, saveUninitialized: true })); app.use(passport.initialize()); app.use(passport.session()); 添加了回调,但会引发错误。这是我的回调:

"body-parser": "^1.15.1",
"cookie-parser": "^1.4.3",
"express": "^4.13.4",
"express-session": "^1.13.0",
"passport": "^0.3.2",
"passport-local": "^1.0.0"

我收到以下错误:

  

错误:无法将用户序列化为会话

3 个答案:

答案 0 :(得分:2)

来自护照文件:

  

请注意,使用自定义回调时,应用程序负责建立会话(通过调用req.login())并发送响应。

啊,好,我们正在取得进展。您必须配置通行证以序列化和反序列化用户信息。有关信息,请参阅this。应该注意,您将用您自己的数据库访问对象替换User

答案 1 :(得分:0)

当我遇到相关问题时,我在谷歌搜索中发现了这个问题。

我意识到express-session不会延续会话,例如服务器重启之间。 Read here for more info

所以我换了express-session代替cookie-session

app.use(cookieSession({
    name: 'MyAppName',
    keys: ['very secret key'],
    maxAge: 30 * 24 * 60 * 60 * 1000 // 30 days
}));

然后PassportJS坚持我的会议,不需要进一步的改变!

答案 2 :(得分:0)

查看@JamesMonger的问题和@ pulse0ne的答案后,我想出了解决问题的方法。我的会话在创建护照和cookie会话时也没有被创建。我在这里共享问题代码和解决方案,以便有人可以从中受益。 旧代码无效

server.get('/auth/google/callback', passport.authenticate('google'),
(req, res) => {
     res.redirect('/api/current_user');
});

添加会话后:true,会话已创建,我能够从请求中检索它。

server.get('/auth/google/callback', passport.authenticate('google', {session: true}),
(req, res) => {
      res.redirect('/api/current_user');
});

版本:

    "body-parser": "^1.19.0",
    "cookie-session": "^1.3.3",
    "express": "^4.16.4",
    "passport": "^0.4.0",
相关问题