我有一个使用Express 4和Passport 0.3.2的应用程序。我已经设置了passport-local
策略,当/session
端点发送用户名和密码时,它会获取正确的用户信息。
但是,用户信息永远不会正确保存。因此,req.user
在所有听众中始终未定义,而req.isAuthenticated()
总是返回false。
我已经看到其他帖子经常发现中间件设置的顺序问题,但是我已经以正确的方式订购它们,所以我不知道从哪里开始。
这是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"
我已经为我的POST /session
添加了回调,但是会引发错误。这是我的回调:
app.post("/session",
passport.authenticate('local', {
session: false
}),
(req: express.Request, res: express.Response) => {
req.logIn(req.user, (err: any) => {
if (err)
throw err;
});
// if we reach this point, we authenticated correctly
res.sendStatus(201);
}
);
我抛出以下错误:
错误:无法将用户序列化为会话
来自护照文件:
请注意,使用自定义回调时,应用程序负责建立会话(通过调用req.login())并发送响应。
啊,好,我们正在取得进展。您必须配置通行证以序列化和反序列化用户信息。有关信息,请参阅this。应该注意的是,您将用自己的数据库访问对象替换User
。
当我遇到相关问题时,我在谷歌搜索中发现了这个问题。
我意识到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坚持我的会议,不需要进一步的改变!
在看了@ JamesMonger的问题和@ pulse0ne的答案之后,我想出了如何解决我的问题。我的会话也没有与护照和cookie会话一起创建。我在这里分享问题代码和解决方案,以便有人可以从中受益。旧代码不起作用
server.get('/auth/google/callback', passport.authenticate('google'),
(req, res) => {
res.redirect('/api/current_user');
});
添加session: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",