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 habeauthController.isAuthenticated
auch der /signout-route und jetzt diereq.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 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie, wie ich, kam hier als eine Folge von Frage-Titel eher als full-details - die Antwort ist erf.Sitzung.destroy(). Ich denke, dass die logout Funktion ist insbesondere für passport.js und wird nicht funktionieren, wenn Sie mit standard-express-Sitzung.
Lösung
controllers/user.js:
Btw. nicht Sinn der Sitzung(en) immer noch in der DB, die sofort nach der Abmeldung. Mongod überprüft und löscht diejenigen, die nicht nach 60 s.
in sign out-api ohne Verwendung von
req.session.destroy()
versuchenreq.logout();
. Ich hoffe, es wird funktionieren.destroy
).