Node + Passport - 多个用户

时间:2013-11-22 07:22:22

标签: node.js passport.js

当尝试从护照指南实施示例代码时,我遇到了一个问题,即最近登录的用户“替换”所有其他用户。例如:

user1登录并留下用户1的备注 user2登录
现在当user1离开笔记时,它会以user2

发布

用户会话是否需要使用connect-mongo存储在数据库中,或者护照是否跟踪单个会话?似乎API调用始终为最近的用户获取req.user,无论用户是谁。

类似的问题与序列化程序有问题。我不确定我的问题在哪里所以我只是发布它。

// Express setup
var http = require('http');
var express = require('express');
var app = express();
var signedIn = false;


// Mongoose setup
var mongoose = require('mongoose');
mongoose.connect('');

var UserSchema = mongoose.Schema({
    username: String,
    password: String
});

var NoteSchema = mongoose.Schema({
    text: String,
    user: String
});

// Used for password authorization
UserSchema.methods.validPassword = function (pwd) {
    return (this.password === pwd);
};

var Users = mongoose.model('Users', UserSchema);
var Notes = mongoose.model('Notes', NoteSchema);


// Passport setup
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;


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

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

// Use Local Strategy
passport.use(new LocalStrategy(
    function(username, password, done) {
        Users.findOne({ username: username }, function (err, user) {
            if (err) { 
                return done(err); }
            if (!user) {
                return done(null, false, {message: 'Incorrect username' });
            }
            if (!user.validPassword(password)) {
                return done(null, false, { message: 'Incorrect password' });
            }
            console.log(user.username + " is signed in");
            return done(null, user);
        });
        }
    ));

// App configuration

app.configure(function () {

    app.set('port', process.env.PORT || 5000);
    app.set('views', __dirname + '/views');
    app.set('view engine', 'jade');

    app.use(express.static(__dirname + '/public'));

    app.use(express.cookieParser());
    app.use(express.bodyParser());
    app.use(express.methodOverride());

    app.use(express.session({ secret: 'keyboard cat' }));
    app.use(passport.initialize());
    app.use(passport.session());
    app.use(app.router);
})


// Passport Authentication
app.post('/login',
  passport.authenticate('local', { successRedirect: '/notes',
                                   failureRedirect: '/login',
                                   /*failureFlash: true*/ })
);

// API
// Notes
app.get('/api/notes', function (req, res) {
    Notes.find({}, function (err, note) {
        if (err) {
            res.send(err);
        }

        res.json(note);
    })
})

app.post('/api/notes', function (req, res) {
    Notes.create({
        text : req.body.text,
        user : req.user.username,
        done : false

    }, function (err, note) {
        if (err) {
            res.send(err);
        }

        Notes.find(function (err, note) {
            if (err) {
                res.send(err);
            }

            res.json(note);
        })
    })
})

app.delete('/api/notes/:note_id', function (req, res) {
    Notes.remove({ _id : req.params.note_id },
        function (err, req) {
            if (err) {
                res.send(err);
            }

        Notes.find(function (err, note) {
            if (err) {
                res.send(err);
            }

            res.json(note);
        });
    });
});

// Users
// Create New User
app.post('/api/users', function (req, res, next) {
    Users.create({
        username : req.body.username,
        password : req.body.password,
        done : false
    }, function (err, user) {
        if (err) {
            res.send(err);
        } else {
            res.redirect('/login');
        }
    });
});


// Routes

app.get('/', function (req, res) {
    res.render('login');
});

app.get('/login', function (req, res) {
    res.render('login');
})

app.get('/newuser', function (req, res) {
    res.render('newuser');
})

app.get('/notes', function (req, res) {
    if (req.user != null) {
        console.log(req.user);
        res.render('index',  { 'userName' : req.user.username });
    } else {
        res.send("Not signed in!")
    }
});

// HTTP Server

http.createServer(app).listen(app.get('port'), function() {
    console.log("Express server listening on: " + app.get('port'));
})

1 个答案:

答案 0 :(得分:2)

我可以想到为什么会发生这种情况的几个原因:

  • 当你(错误地)创建一个全局变量来保存某种形式的状态信息时,比如你的可疑的signedIn变量(你似乎没有在发布的代码中这样做);
  • 使用app.locals您打算使用res.locals(您也没有这样做,但仍然值得一提);
  • 您是从同一浏览器的其他标签/窗口以第二个用户身份登录的;会话在选项卡/窗口之间共享,因此当您从一个选项卡以UserA身份登录,然后从另一个选项卡以UserB身份登录时,您无法再执行UserA之前的操作该会话被UserB会话覆盖;尝试从其他浏览器以UserB登录;