Как провести сеанс с паспортом?

Итак, я хотел бы, чтобы моя пользовательская сессия сохранялась после входа в систему / регистрации, чего не происходит.

В официальной документации говорится, что для начала нужно добавить:

  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, поэтому должен ли я иметь дело с постоянным сеансом через редуктор вместо этого с моей аутентифицированной (истинной или ложной) переменной?

Я думаю, что сейчас я немного запутался между тем, что должно быть сделано на стороне сервера, и тем, что должно быть сделано на стороне клиента.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
0
4 285
3

Ответы 3

//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",
    },
  })
);

Другие вопросы по теме