简体   繁体   中英

Parse-SDK-JS Express Webapplication and Passportjs Mixed Up Logged in Users Page

issue is: page content of logged in users mixed up with another logged in user

project attributes: I run project on

aws ec2 instance with nginx as proxy to pm2 started index.js of expressjs website with below library for my project

"aws-ses-mail": "^2.1.1",
"body-parser": "^1.15.2",
"cookie-parser": "^1.4.3",
"ejs": "^1.0.0",
"express": "~4.11.x",
"express-ejs-layouts": "^2.2.0",
"express-session": "^1.14.1",
"kerberos": "~0.0.x",
"mandrill": "^0.1.0",
"moment": "^2.14.1",
"parse": "~1.8.0",
"passport": "^0.3.2",
"passport-parse": "0.0.5",
"underscore": "^1.8.3"

also this code did not solve my problem:

app.disable('view cache');
app.use(function (req, res, next) {
    res.removeHeader("X-Powered-By");
    res.setHeader('Cache-Control', 'no-cache');
    next();
});

with the following index.js code:

var express = require('express');
var cookieParser = require('cookie-parser');
var _ = require('underscore');
var moment = require('moment');
var path = require('path');
var ejs = require('ejs');
var bodyParser = require('body-parser');
var session = require('express-session');
var ParseStrategy = require('passport-parse');
var expressLayouts = require('express-ejs-layouts');
var postActions = require('./post-actions');
var Utility = require('./libs/utilities');
var requireUser = require('./require-user'); 
var userAgentDetector = require('./user-agent-detector'); 

var passport = require('passport');
Parse = require('parse/node').Parse;

Parse.initialize("hashcode", "hashcode","hashcode");
Parse.CoreManager.set('SERVER_URL', 'http://localhost:1337/parse');
Parse.CoreManager.set('USE_MASTER_KEY', true);

var app = express();
app.use(bodyParser.json()); // for parsing application/json

app.set('views', __dirname+'/views');
app.set('view engine', 'ejs');
app.use(expressLayouts);
// Serve static assets from the /public folder
app.use('/public', express.static(path.join(__dirname, '/public')));
app.use(cookieParser());
app.use(bodyParser.urlencoded({ extended: true }));

var parseStrategy = new ParseStrategy({parseClient: Parse});
passport.use(parseStrategy);

code continue :

app.use(session({
    name: 'session-cookie-id',
    secret: 'secret',
    saveUninitialized: false,
    resave: false
}));
app.use(passport.initialize());
app.use(passport.session());

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

passport.deserializeUser(function(user, done) {
    // user.className = "_User";
    // user =  Parse.Object.fromJSON(user);
    // done(null, user);
    var sessionToken = user;
    var query = new Parse.Query('_Session');
    query.equalTo('sessionToken', sessionToken);
    query.include('user');
    return query.first({useMasterKey: true}).then(function(session) {
        user = session.get('user');
        if (user) {
            done(null, user);
        } else {
            done();
        }
    }, function(err) {
        done();
    });

});

app.use(userAgentDetector);
app.use(postActions);

code continue :

app.locals._ = _;
app.locals.moment = moment;


ejs.filters.videoMessageStr = function(str){
    //return some code;
};

ejs.filters.secureImageUrl = function (url) {
    return url.replace("http://", "https://s3.amazonaws.com/");
};

ejs.filters.getObjectThumb = function (userObject, params) {

    //return some code;

};

ejs.filters.getImageThumb = function (imageObject, params) {
    //return some code;
};

app.disable('view cache');
app.use(function (req, res, next) {
    res.removeHeader("X-Powered-By");
    res.setHeader('Cache-Control', 'no-cache');
    next();
});
// Controller code in separate files.
var homeController = require('./controllers/home');
var usersController = require('./controllers/users');

app.get('/', homeController.index);
app.get('/home', homeController.getHomePage);
app.get('/home/page/:page', homeController.getHomePage);
app.get('/messages', requireUser, messagesController.index);
app.get('/login-and-save', usersController.loginAndSave);

code continue :

app.get('/login', usersController.getLogin);

app.post('/login', function(req, res, next){
    passport.authenticate('parse',function(err, user, info) {
        if (err || !user) {
            return res.status(400).json(info);
        }   
        req.logIn(user, function(err) {
            if (err) {
                return res.status(400).json(err);
            }
            res.end("ok");
        });
    })(req, res);
});
app.get('/logout', function(req, res, next){
    req.logOut();
    res.redirect('/');
});


app.get('*', function(req, res) {
    res.render('home/404.ejs', { layout: false, url: req.url });
});

var port = process.env.PORT || 9000;
var httpServer = require('http').createServer(app);

httpServer.listen(port, function() {
    console.log('parse-server running on port ' + port + '.');
});

There are several things you need to take into consideration when porting your Cloud Code to parse-server , especially around authentication . The passport-parse library you're using to handle authentication appears to be written with parse.com apps in mind, and has not been updated in two years as of this writing. I highly suspect that module is depending on the old currentUser behavior of hosted Parse.com apps.

Take a look at the Parse Server Guide to learn more about what needs to be updated when moving over to parse-server .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM