req.isAuthenticated()在成功后返回false

我知道已经有很多帖子提到同一个问题,但是,我找不到适合我的情况的解决方案。这是该问题的相关代码:

users.js(路由) 登录表单将向该路由提交POST请求。

var express = require('express');
var router = express.Router();

// Require controllers
var usersController = require('../../controllers/usersController');

/* POST login */
router.post('/login',usersController.loginaccount);

module.exports = router;

usersController.js 护照认证在这里处理。
req.isAuthenticated()在此也返回false。但是,将执行successRedirect,这意味着用户已成功通过身份验证。

'use strict';

var bodyParser = require('body-parser');
var mysql = require('mysql');
var bcrypt = require('bcryptjs');
var Client = require('../models/Client');
var passport = require('passport');
var Sequelize = require('sequelize');


var urlencodedParser = bodyParser.urlencoded({ extended: false });

/* POST - Login */

module.exports.loginaccount = function (req,res,next) {
    passport.authenticate('local',{
        successRedirect: '../dashboard',failureRedirect: '/users/login',failureflash: true
    }) (req,next);
    console.log("Exactly after authentication: " + req.isAuthenticated());
}

index.js(路由) 在这里,确保authenticAuthenticated始终返回false

var express = require('express');
var router = express.Router();

// Require controllers
var indexcontroller = require('../../controllers/indexcontroller');

/* GET dashboard page */
router.get('/dashboard',ensureAuthenticated,indexcontroller.dashboardPage);

function ensureAuthenticated(req,next) {
    if (req.isAuthenticated())
        {console.log("AUTHENTICATED"); return next();}
    else{
        console.log("NOT AUTHENTICATED");
        req.flash('error_msg','Please log in to view this resource');
        res.redirect('/users/login');
    }
}

module.exports = router;

indexcontroller.js 提交登录表单时,此代码不会执行,因为sureAuthenticated()为false。

'use strict';

var bodyParser = require('body-parser');
var mysql = require('mysql');

var urlencodedParser = bodyParser.urlencoded({ extended: false });

/* GET - Dashboard page */
module.exports.dashboardPage = function(req,res) {
    // console.log(req.user);
    // console.log(req.isAuthenticated());
    res.render('dashboard');
};

passport.js

const LocalStrategy = require('passport-local').Strategy;
const Sequelize = require('sequelize');
const bcrypt = require('bcryptjs');

// Load User Model
const Client = require('../models/Client');

module.exports = function(passport) {
    passport.use(
        new LocalStrategy({ usernameField: 'username'},function(username,password,done) {
            // Match User
            Client.findOne({ where: {username: username} })
                .then(function(user) { 
                    if(!user) {
                        return done(null,false,{ message: 'That username is not registered'});
                    }

                    // Match password
                    bcrypt.compare(password,user.password,function(err,isMatch) {
                        if(err) throw err;

                        if(isMatch) {
                            return done(null,user);
                        } else {
                            return done(null,{ message: 'Password incorrect'});
                        }
                    });  
                })
                .catch(function(err) { console.log(err) });
        })
    )

    passport.serializeuser(function(user,done) {
        console.log('Serializing user');
        done(null,user.id);
    });

    passport.deserializeuser(function(id,done) {
        console.log('Deserializing user');
        console.log('User ID:',id);
        Client.findByPk(id)
        .then(function(err,user) {
            console.log('User ID:',id);
            done(err,user);
        });
    });
}

所有必需的中间件均以正确的顺序设置(express-session-> passport.initialize-> password.session)。 cookieParser和express-session设置有相同的秘密(否则这是其他帖子所建议的问题)。

app.js

var createError = require('http-errors');
var express = require('express');
var expressLayouts = require('express-ejs-layouts');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var mysql = require('mysql');
var flash = require('connect-flash');
var session = require('express-session');
var passport = require('passport');
var bodyParser = require('body-parser');
var cors = require('cors');

// Passport config
require('./config/passport')(passport);

var usersController = require('./controllers/usersController');
var indexRouter = require('./api/routes/index');
var usersRouter = require('./api/routes/users');
var roomsRouter = require('./api/routes/rooms');

var app = express();

app.use(cors());
// view engine setup
app.set('views',path.join(__dirname,'views'));
// EJS
app.use(expressLayouts);
app.use(express.json());
app.set('view engine','ejs');

app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser('secret'));
app.use(express.static(path.join(__dirname,'public')));

// Express Session
app.use(session({
  secret: 'secret',resave: true,saveUninitialized: true,cookie: { maxAge: 60000 }
}));

// Passport middleware
app.use(passport.initialize());
app.use(passport.session());

lanzhufeng22 回答:req.isAuthenticated()在成功后返回false

在您的 app.js 中,需要在设置passpor中间件之后定义路由。

例如:

var createError = require('http-errors');
var express = require('express');
var expressLayouts = require('express-ejs-layouts');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var mysql = require('mysql');
var flash = require('connect-flash');
var session = require('express-session');
var passport = require('passport');
var bodyParser = require('body-parser');
var cors = require('cors');

// Passport config
require('./config/passport')(passport);

var usersController = require('./controllers/usersController');

var app = express();

app.use(cors());
// view engine setup
app.set('views',path.join(__dirname,'views'));
// EJS
app.use(expressLayouts);
app.use(express.json());
app.set('view engine','ejs');

app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser('secret'));
app.use(express.static(path.join(__dirname,'public')));

// Express Session
app.use(session({
  secret: 'secret',resave: true,saveUninitialized: true,cookie: { maxAge: 60000 }
}));

// Passport middleware
app.use(passport.initialize());
app.use(passport.session());

var indexRouter = require('./api/routes/index');
var usersRouter = require('./api/routes/users');
var roomsRouter = require('./api/routes/rooms');

尝试执行此操作并查看输出

本文链接:https://www.f2er.com/3143365.html

大家都在问