【问题标题】:Express router create a new session not wantedExpress 路由器创建一个不需要的新会话
【发布时间】:2016-07-07 19:50:28
【问题描述】:

我正在根据本教程使用 express 和 passport-local 为身份验证部分做一个反应项目: https://scotch.io/tutorials/easy-node-authentication-setup-and-local

身份验证工作得很好,我添加了 express 路由器来为我的 api 定义我的路由,但是当我调用例如“/api/myroute”时,express 的路由器创建了另一个会话并且我失去了用户,所以我的函数isLoggedIn 阻止了我的控制器的调用,因为这个新会话中没有用户。所以我的问题是:为什么路由器重新创建会话?我的配置有什么问题?这是我的代码:

//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("==> ????  Listening on port %s. Open up http://localhost:%s/ in your browser.", port, port)
      }
    });
    console.log('The magic happens on port ' + port);

这是我的 routes.js :

module.exports = function(app, passport,router) {
    var MyController = require("../api/controllers/mycontroller");


    // =====================================
    // HOME PAGE (with login links) ========
    // =====================================
    app.get('/', function(req, res) {
        console.log("welcome")
        res.render('index.ejs', { message: ""}); // load the index.ejs file
    });

    // =====================================
    // LOGIN ===============================
    // =====================================
    // show the login form
    app.get('/login', function(req, res) {
        console.log("login")
        // render the page and pass in any flash data if it exists
        res.render('index.ejs', { message: req.flash('loginMessage') });
    });

    app.post('/login', passport.authenticate('local-login', {
        successRedirect : '/welcome', // redirect to the secure profile section
        failureRedirect : '/login', // redirect back to the signup page if there is an error
        failureFlash : true // allow flash messages
    }));

    // =====================================
    // SIGNUP ==============================
    // =====================================
    // show the signup form
    app.get('/signup', function(req, res) {
        console.log("signup")
        // render the page and pass in any flash data if it exists
        res.render('signup.ejs', { message: req.flash('signupMessage') });
    });

    // process the signup form
    app.post('/signup', passport.authenticate('local-signup', {
        successRedirect : '/welcome', // redirect to the secure profile section
        failureRedirect : '/signup', // redirect back to the signup page if there is an error
        failureFlash : true // allow flash messages
    }));

    // process the signup form
    // app.post('/signup', do all our passport stuff here);

    // =====================================
    // LOGOUT ==============================
    // =====================================
    app.get('/logout', function(req, res) {
        console.log("logout")
        req.logout();
        res.redirect('/');
    });

    router.get('/myroute', isLoggedIn, function(req, res) {
        //HERE the router recreate a session and req.user is now undefined why ?
        MyController.getAllObjects(req,res);
    });


    // =====================================
    // HOME SECTION =====================
    // =====================================
    // we will want this protected so you have to be logged in to visit
    // we will use route middleware to verify this (the isLoggedIn function)
    app.get('*', isLoggedIn, function(req, res) {
        console.log("HOME")
        res.render('home.ejs', {
            user : req.user // get the user out of session and pass to template
        });
    });
};

// route middleware to make sure a user is logged in
function isLoggedIn(req, res, next) {

    // if user is authenticated in the session, carry on
    if (req.isAuthenticated())
        return next();

    console.log("redirect because not log in")
    // if they aren't redirect them to the home page
    res.redirect('/');

}

登入、登出、登入...功能是本教程的复制粘贴。

【问题讨论】:

  • 你的服务器配置看起来不错,你能告诉我们来自客户端的调用吗?
  • 是的,它是这样的:return fetch('/api/myroute') .then(response => response.json()) .then(json => { dispatch({ type: types.MY_ACTION , 形式: json, receivedAt: Date.now() }) })

标签: node.js express passport.js passport-local


【解决方案1】:

您似乎正在使用 fetch 库。默认情况下,此库不包含域 cookie,因此为了正常工作,您的请求应如下所示:

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()
    })
})

更多信息请参见this link

【讨论】:

    猜你喜欢
    • 2012-02-28
    • 2020-02-03
    • 2015-08-14
    • 1970-01-01
    • 1970-01-01
    • 2019-01-21
    • 2021-06-15
    • 2019-11-04
    • 2021-04-21
    相关资源
    最近更新 更多