0
passportをnode.jsアプリに統合しようとしています。リダイレクト後にpassport.jsセッションが失われる
app.js
ファイル
const app = express();
app.set('view engine', 'pug');
app.use('/libs', express.static('node_modules'));
require('../config/auth.config')(app, data, passport);
app.use((req, res, next) => {
res.locals.user = req.user;
next();
});
app.get('/', (req, res) => {
// those objects are populated correctly after redirect from auth middleware
console.log(req.session)
console.log(req.user)
return res.render('home');
});
app.get('/login', console.log(req.user);
// req.user is undefined here
if (req.user) {
return res.redirect('/');
}
return res.render('login'););
app.post('/login', passport.authenticate('local', {
successRedirect: '/',
failureRedirect: '/login',
}));
auth.config.js
const express = require('express');
const session = require('express-session');
const cookieParser = require('cookie-parser');
const bodyParser = require('body-parser');
const LocalStrategy = require('passport-local');
const MongoStore = require('connect-mongo')(session);
const config = require('./config');
const configAuth = (app, {
users
}, passport, db) => {
app.use(cookieParser('Purple Unicorn'));
app.use(bodyParser.urlencoded({
extended: true,
}));
app.use(bodyParser.json());
app.use(session({
store: new MongoStore({
url: config.connectionString
}),
secret: 'Purple Unicorn',
resave: true,
saveUninitialized: true,
}));
app.use(passport.initialize());
app.use(passport.session());
passport.use(new LocalStrategy((username, password, done) => {
return users.login(username, password)
.then((user) => {
if (user) {
return done(null, user);
}
return done(null, false);
});
}));
passport.serializeUser((user, done) => {
done(null, user._id);
});
passport.deserializeUser((id, done) => {
users.getUserById(id)
.then((user) => {
console.log(user);
if (user) {
done(null, user);
}
done(null, false);
});
});
app.use((req, res, next) => {
res.locals = {
user: req.user,
};
next();
});
};
module.exports = configAuth;
データオブジェクトが正しく機能しています。
/login
の投稿要求が正しいデータの後に/
にリダイレクトされます。ここでconsole.log(req.user)
は正しいユーザーを表示します。また、req.session
オブジェクトにも追加されています。
/login
へのリンクをたどった後は、req.user
のチェックの後で私にリダイレクトされますが、undefined
が返されます。 mongoのセッションは正しく保存されています。
パスポートが正しくセッションを保存していないようです。
問題の1つは、常に 'done'コールバックを2度実行する' deserializeUser'メソッドです。 'if'文では、関数から出るために' return done(null、user); 'を使います。 –
ありがとうございます!これを回答として投稿することができますので、選択することができます。 –