Итак, я хотел бы, чтобы моя пользовательская сессия сохранялась после входа в систему / регистрации, чего не происходит.
В официальной документации говорится, что для начала нужно добавить:
app.use(express.session({ secret: 'keyboard cat' }));
app.use(passport.initialize());
app.use(passport.session());
что я и сделал. Затем он указывает:
В типичном веб-приложении учетные данные, используемые для аутентификации пользователя, передаются только во время запроса на вход. Если аутентификация прошла успешно, сеанс будет установлен и поддерживаться с помощью файла cookie, установленного в браузере пользователя. Каждый последующий запрос будет содержать не учетные данные, а уникальный файл cookie, который идентифицирует сеанс. Для поддержки сеансов входа в систему Passport будет сериализовать и десериализовать пользовательские экземпляры в сеанс и обратно.
passport.serializeUser(function(user, done) {
console.info("serialize user: ", user);
done(null, user[0]._id);
});
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});
Если я правильно понимаю, при входе в систему пользователь должен увидеть, что устанавливается новый файл cookie. Мои функции сериализации и десериализации, похоже, работают. Консоль будет регистрировать данные пользователя после того, как я войду в систему. В консоли нет сообщения об ошибке. Однако при входе в систему я не вижу никаких файлов cookie.
Могу ли я добавить дополнительную команду вручную? что-то вроде этого :
res.cookie('userid', user.id, { maxAge: 2592000000 });
Я использую Redux, поэтому должен ли я иметь дело с постоянным сеансом через редуктор вместо этого с моей аутентифицированной (истинной или ложной) переменной?
Я думаю, что сейчас я немного запутался между тем, что должно быть сделано на стороне сервера, и тем, что должно быть сделано на стороне клиента.





//npm modules
const express = require('express');
const uuid = require('uuid/v4')
const session = require('express-session')
const FileStore = require('session-file-store')(session);
const bodyParser = require('body-parser');
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const users = [
{id: '2f24vvg', email: '[email protected]', password: 'password'}
]
// configure passport.js to use the local strategy
passport.use(new LocalStrategy(
{ usernameField: 'email' },
(email, password, done) => {
console.info('Inside local strategy callback')
// here is where you make a call to the database
// to find the user based on their username or email address
// for now, we'll just pretend we found that it was users[0]
const user = users[0]
if (email === user.email && password === user.password) {
console.info('Local strategy returned true')
return done(null, user)
}
}
));
// tell passport how to serialize the user
passport.serializeUser((user, done) => {
console.info('Inside serializeUser callback. User id is save to the session file store here')
done(null, user.id);
});
// create the server
const app = express();
// add & configure middleware
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())
app.use(session({
genid: (req) => {
console.info('Inside session middleware genid function')
console.info(`Request object sessionID from client: ${req.sessionID}`)
return uuid() // use UUIDs for session IDs
},
store: new FileStore(),
secret: 'keyboard cat',
resave: false,
saveUninitialized: true
}))
app.use(passport.initialize());
app.use(passport.session());
// create the homepage route at '/'
app.get('/', (req, res) => {
console.info('Inside the homepage callback')
console.info(req.sessionID)
res.send(`You got home page!\n`)
})
// create the login get and post routes
app.get('/login', (req, res) => {
console.info('Inside GET /login callback')
console.info(req.sessionID)
res.send(`You got the login page!\n`)
})
app.post('/login', (req, res, next) => {
console.info('Inside POST /login callback')
passport.authenticate('local', (err, user, info) => {
console.info('Inside passport.authenticate() callback');
console.info(`req.session.passport: ${JSON.stringify(req.session.passport)}`)
console.info(`req.user: ${JSON.stringify(req.user)}`)
req.login(user, (err) => {
console.info('Inside req.login() callback')
console.info(`req.session.passport: ${JSON.stringify(req.session.passport)}`)
console.info(`req.user: ${JSON.stringify(req.user)}`)
return res.send('You were authenticated & logged in!\n');
})
})(req, res, next);
})
// tell the server what port to listen on
app.listen(3000, () => {
console.info('Listening on localhost:3000')
})
попробуйте пройти по ссылке https://medium.com/@evangow/server-authentication-basics-express-sessions-passport-and-curl-359b7456003d
1
Проверить имя хоста.
В моем случае cookie был установлен на 127.0.0.1, а не на localhost.
2
Убедитесь, что express session вызывается до passport session.
Если кто-то использует мангуста с expressjs и паспорта, вы можете попробовать этот метод ниже. Это также сохраняет файл cookie после перезапуска сервера. Для других баз данных вы можете проверить Список хранилищ, совместимых с Expressjs
const session = require("express-session");
const MongoStore = require("connect-mongo")(session);
// before this setup mongoose connection then add this code.
app.use(
session({
store: new MongoStore({
mongooseConnection: mongoose.connection,
ttl: 365 * 24 * 60 * 60, // = 365 days.
}),
secret: process.env.AUTH_SECRET,
resave: true,
saveUninitialized: true,
cookie: {
secure: app.get("env") === "production",
},
})
);