簡體   English   中英

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

[英]req.isAuthenticated() returns false after successRedirect

我知道已經有很多帖子提到了相同的問題,但是,我找不到適合我的案例的解決方案。 以下是該問題的相關代碼:

users.js (route) 登錄表單向該路由提交 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, res, next);
    console.log("Exactly after authentication: " + req.isAuthenticated());
}

index.js (route) 這里,ensureAuthenticated 總是返回 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, res, 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 提交登錄表單時,此代碼不會被執行,因為 ensureAuthenticated() 為 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');
};

護照.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, false, { 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 -> passport.session)。 cookieParser 和 express-session 設置了相同的秘密(否則這是其他帖子所建議的問題)。

應用程序.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());

在您的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');

嘗試這樣做並查看 output

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM