Passport + Express - конфликт между пользовательскими сессиями - PullRequest
0 голосов
/ 15 октября 2018

У меня есть простое приложение Node + Express с аутентификацией Passport Local, оно работает почти идеально (правильные страницы подаются, вход / выход работает и т. Д.).

Одна проблема заключается в том, что если второйпользователь входит в систему, этот сеанс «берет на себя» сеанс первого пользователя, и внезапно первый пользователь теперь входит в систему как второй пользователь!

Это почти наверняка проблема с порядком промежуточного программного обеспечения, но у меня нетне смог его найти - я довольно новичок в паспорте и экспрессе.Код взят из документов и примеров, но я, возможно, испортил порядок.

Я следовал порядку в этом ответе , но он все еще не работает.Кто-нибудь может подсказать, где я могу быть перепутан?

Основной сервер:

var express = require('express');
var passport = require('passport');
var Strategy = require('passport-local').Strategy;
var url = require('url');
var db = require('./db');

// Configure the local strategy for use by Passport.

passport.use(new Strategy(
  function(username, password, cb) {
    db.users.findByUsername(username, function(err, user) {
      if (err) { return cb(err); }
      if (!user) { return cb(null, false); }
      if (user.password != password) { return cb(null, false); }
      return cb(null, user);
    });
  }));

// Configure Passport authenticated session persistence.

passport.serializeUser(function(user, cb) {    
  console.log('DEBUG: serializeUser called ' + user.id);    
  cb(null, user.id);
});

passport.deserializeUser(function(id, cb) {    
  console.log('DEBUG: deserializeUser called ' + id);    
  db.users.findById(id, function (err, user) {
    if (err) { return cb(err); }
    cb(null, user);
  });
});

// Create a new Express application.

// Use application-level middleware for common functionality  (Order is important!)
// Initialize Passport and restore authentication state, if any, from the session.

var app = express();

app.use(require('cookie-parser')());
app.use(require('body-parser').urlencoded({ extended: true }));
app.use(require('express-session')({ secret: 'qwerty', resave: false, saveUninitialized: false }));  // Step 2.
app.use(passport.initialize());
app.use(passport.session()); 


app.post('/login', 
  passport.authenticate('local', { failureRedirect: '/login.html' }),
  function(req, res) {
    console.log('Logged In: ' + req.user.username);
    res.redirect('/');
  });

app.get('/logout', function(req, res){

    if (req.user != null) {          
        console.log('Logged Out: ' + req.user.username);
        req.logout();    
    } else {
        console.log('Warning: null user logging out');
    }

    res.redirect('/login.html');
});

app.get('/user', function(req, res){   
    if (req.user != null) {          
        res.send(req.user.displayName);      
    } else {
        res.send('ERROR: No current user?');
    }
});

function isAuthenticated(req, res, next) {

    if (req.user) {   // User is logged in
        return next();
    }

   if (req.url.startsWith('/login')) {   // Allow login through to avoid infinite loop
       return next();
   }

   res.redirect('/login.html');
}

app.use('/', isAuthenticated, express.static('/public/'));

Файл db / users.js:

var records = [
    { id: 1, username: 'jill', password: 'birthday', displayName: 'Jill'}
    { id: 2, username: 'jack', password: 'hello',    displayName: 'Jack'}
];

exports.findById = function(id, cb) {
  process.nextTick(function() {
    var idx = id - 1;
    if (records[idx]) {
      cb(null, records[idx]);
    } else {
      cb(new Error('User ' + id + ' does not exist'));
    }
  });
}

exports.findByUsername = function(username, cb) {
  process.nextTick(function() {
    for (var i = 0, len = records.length; i < len; i++) {
      var record = records[i];
      if (record.username === username) {
        return cb(null, record);
      }
    }
    return cb(null, null);
  });
}

1 Ответ

0 голосов
/ 06 ноября 2018

Tumbleweeds!

Получается, что все работало нормально - проблема была только в том, что Chrome повторно использовал свою сессию на вкладках.Я нашел полезный комментарий в ответе на этот вопрос.Один логин из Chrome, а другой из IE работает нормально, без конфликтов.

Узел + Паспорт - несколько пользователей

...