express-Sitzung nicht ausloggen

Den code

app.js:

var express = require('express');
var session = require('express-session');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var mongoStore = require('connect-mongo')(session);
var mongoose = require('mongoose');
var passport = require('passport');

var config = require('./config');
var routes = require('./routes');

var mongodb = mongoose.connect(config.mongodb);

var app = express();

//view engine setup
app.set('views', config.root + '/views');
app.set('view engine', 'jade');
app.engine('html', require('ejs').renderFile);

app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
  extended: false
}));
app.use(cookieParser());
app.use(express.static(config.root + '/public'));

app.use(session({
  name: 'myCookie',
  secret: 'tehSecret',
  resave: true,
  saveUninitialized: true,
  unset: 'destroy',
  store: new mongoStore({
    db: mongodb.connection.db,
    collection: 'sessions'
  })
}));

app.use(passport.initialize());
app.use(passport.session());

app.use('/', routes);

app.set('port', config.port);

var server = app.listen(app.get('port'), function() {
  if (config.debug) {
    debug('Express server listening on port ' + server.address().port);
  }
});

routes.js:

var express = require('express');
var router = express.Router();

var config = require('../config');
var userController = require('../controllers/user');
var authController = require('../controllers/auth');

router.get('/', function(req, res) {
  res.render('index', {
    title: config.app.name
  });
});

router.route('/users')
  .post(userController.postUsers)
  .get(authController.isAuthenticated, userController.getUsers);
router.get('/signout', userController.signout);

module.exports = router;

models/user.js:

var mongoose = require('mongoose');
var bcrypt = require('bcrypt-nodejs');

var UserSchema = new mongoose.Schema({
  username: {
    type: String,
    unique: true,
    required: true
  },
  password: {
    type: String,
    required: true
  }
});

//Execute before each user.save() call
UserSchema.pre('save', function(callback) {
  var user = this;

  //Break out if the password hasn't changed
  if (!user.isModified('password')) return callback();

  //Password changed so we need to hash it
  bcrypt.genSalt(5, function(err, salt) {
    if (err) return callback(err);

    bcrypt.hash(user.password, salt, null, function(err, hash) {
      if (err) return callback(err);
      user.password = hash;
      callback();
    });
  });
});

UserSchema.methods.verifyPassword = function(password, cb) {
  bcrypt.compare(password, this.password, function(err, isMatch) {
    if (err) return cb(err);
    cb(null, isMatch);
  });
};

//Export the Mongoose model
module.exports = mongoose.model('User', UserSchema);

controllers/user.js:

var config = require('../config');

var User = require('../models/user');

exports.postUsers = function(req, res) {
  if (config.debug)
    console.log("user.postUsers()");

  var user = new User({
    username: req.body.username,
    password: req.body.password
  });

  user.save(function(err) {
    if (err)
      return res.send(err);

    if (config.debug)
      console.log("saved");

    res.json({
      message: 'New user created!'
    });
  });
};

exports.getUsers = function(req, res) {
  if (config.debug)
    console.log("user.getUsers()");

  User.find(function(err, users) {
    if (err)
      return res.send(err);

    if (config.debug)
      console.log("users", users);

    res.json(users);
  });
};

exports.signout = function(req, res) {
  if (config.debug)
    console.log("user.signout()");

  res.clearCookie('myCookie');

  req.session.destroy(function(err) {
    req.logout();
    res.redirect('/');
  });
};

controllers/auth.js:

var passport = require('passport');
var BasicStrategy = require('passport-http').BasicStrategy;

var config = require('../config');
var User = require('../models/user');

passport.serializeUser(function(user, done) {
  done(null, user.id);
});

passport.deserializeUser(function(id, done) {
  User.findById(id, function(err, user) {
    done(err, user);
  });
});

passport.use(new BasicStrategy(
  function(username, password, done) {
    User.findOne({
      username: username
    }, function(err, user) {
      if (err) {
        return done(err);
      }

      //No user found with that username
      if (!user) {
        return done(null, false);
      }

      //Make sure the password is correct
      user.verifyPassword(password, function(err, isMatch) {
        if (err) {
          return done(err);
        }

        //Password did not match
        if (!isMatch) {
          return done(null, false);
        }

        //Success
        return done(null, user);
      });
    });
  }
));

exports.isAuthenticated = passport.authenticate('basic', {
  session: false
});

Das problem

/signout-route nicht Ende der aktuellen Sitzung. In der req.session.destroy Rückruf der req.session ist undefined noch einen neuen GET-request auf /Nutzer verhält sich wie die session gültig ist.

Kann jemand helfen, deaktivieren Sie dieses problem aus?

  • Können Sie zu /Benutzer ohne Anmeldung?
  • NÖ. Basic Auth ist gefeuert. Aber, sobald ich mich einlogge, kann ich mich nicht Abmelden.
  • Könntest du bitte in der Konsole.log(req.Benutzer in die route ein?Und btw. afaik in Ihrer serialisieren Benutzer sollte es eigentlich sein Benutzer._id, brcause mongodb verwendet _id und nicht id standardmäßig.
  • Ich denke, man kann nicht ausloggen basic-auth einfach finden Sie stackoverflow.com/questions/233507/...
  • die req.user wurde nicht definiert. Ich habe authController.isAuthenticated auch der /signout-route und jetzt die req.user ist der derzeit angemeldete Benutzer-Objekt. Dennoch logout nicht durchgeführt.
  • haben Sie versucht, nach der Einrichtung Authentifiziert als middleware zu verwenden, erf.die logout () - ohne erf.Sitzung.destroy()? wie gerade außerhalb der Funktion..
  • ja, habe ich. Siehe stackoverflow.com/questions/26573227/...
  • Nun, wie ich diese bekommen, Sie sind eigentlich mit BasicAuth-Strategie, die mit Basic-HTTP Auth zur Authentifizierung Ihrer Benutzer. Basic HTTP Auth nicht unterstützt Protokollierung jemand aus. So solltest du eigentlich wechseln, um ein LocalStrategy von Pass statt. Wenn Sie allerdings wirklich tun müssen, Basic HTTP Auth, sollten Sie reagieren mit res.status(401) und leiten Sie ihn an, wo immer Sie wollen.
  • Ja. Ich fand auch irgendwo ein Kommentar, dass BasicAuth nicht unterstützt logout, aber nicht finden, alles, was im Pass docs. Ich kam schon zu der gleichen Lösung, die Abmeldung, wie Sie vorgeschlagen (siehe stackoverflow.com/a/26585325/451962). Trotzdem danke 🙂

InformationsquelleAutor Saran | 2014-10-26
Schreibe einen Kommentar