Express router create a new session not wanted

2019-07-16 14:04发布

I am doing a react project using express and passport-local for the authentication part based on this tutorial : https://scotch.io/tutorials/easy-node-authentication-setup-and-local

The authentification work very well, I added the express router to define my routes for my api, but when I call for example "/api/myroute" the router of express creates an other session and I lose the user, so my function isLoggedIn blocks the call of my controllers because there is no user in this new session. So my question is : Why the router recreate a session ? What it is wrong in my configuration ? Here is my code :

//server.js    
var path = require('path');
    var webpack = require('webpack');
    var webpackDevMiddleware = require('webpack-dev-middleware');
    var webpackHotMiddleware = require('webpack-hot-middleware');
    var config = require('./webpack.config');

    var express  = require('express');
    var app      = express();
    var port     = process.env.PORT || 8080;
    var mongoose = require('mongoose');
    var passport = require('passport');
    var flash    = require('connect-flash');

    var morgan       = require('morgan');
    var cookieParser = require('cookie-parser');
    var bodyParser   = require('body-parser');
    var session      = require('express-session');

    var configDB = require('./config/database.js');

    var router = express.Router();

    // configuration ===============================================================
    mongoose.connect(configDB.url); // connect to our database

    require('./config/passport')(passport); // pass passport for configuration

    // set up our express application
    app.use(morgan('dev')); // log every request to the console
    app.use(cookieParser()); // read cookies (needed for auth)
    app.use(bodyParser()); // get information from html forms

    app.set('view engine', 'ejs'); // set up ejs for templating

    // required for passport
    app.use(session({ secret: 'secret' })); // session secret
    app.use(passport.initialize());
    app.use(passport.session()); // persistent login sessions
    app.use(flash()); // use connect-flash for flash messages stored in session


    var compiler = webpack(config);
    app.use(webpackDevMiddleware(compiler, { noInfo: true, publicPath: config.output.publicPath }));
    app.use(webpackHotMiddleware(compiler));
    app.use('/plugins/bootstrap', express.static(path.join(__dirname, './plugins/bootstrap')));
    app.use('/plugins/jquery', express.static(path.join(__dirname, './plugins/jquery')));
    app.use('/plugins/font-awesome', express.static(path.join(__dirname, './plugins/font-awesome')));


    // all of our routes will be prefixed with /api
    app.use('/api', router);

    // routes ======================================================================
    require('./api/routes.js')(app, passport,router); // load our routes and pass in our app and fully configured passport


    // launch ======================================================================
    app.listen(port, function(error) {
      if (error) {
        console.error(error)
      } else {
        console.info("==>                 

1条回答
闹够了就滚
2楼-- · 2019-07-16 14:41

You seem to be using the fetch library. This library does not include the domain cookies by default, so in order to work your request should look like this:

fetch('/api/myroute', {
    credentials: 'same-origin' // This is the line you are missing 
}).then(response => response.json())
.then(json => {
    dispatch({
        type: types.MY_ACTION, forms: json, receivedAt: Date.now()
    })
})

See this link for more information.

查看更多
登录 后发表回答