Member 13757366 Ответов: 0

Isauthenticated() всегда возвращает false в экспресс-паспорте


Функция req.isAuthenticated() api.js всегда возвращает false независимо от того, вошел ли пользователь в систему или нет. Эта конкретная функция, похоже, не работает.
Я не знаю, что делать. Я застрял на этом надолго.

Любая помощь будет высоко оценена.

Я тестирую свой код на продвинутом клиенте rest.

app.js (основной файл):

var http_errors = require('http-errors');
    var express = require('express');
    var path = require('path');
    var favicon = require('serve-favicon');
    var logger = require('morgan');
    var passport = require('passport');
    var session = require('express-session');
    var cookieParser = require('cookie-parser');
    var bodyParser = require('body-parser');
    
    var api = require('./routes/api');
    var authenticate = require('./routes/authenticate')(passport);
    
    var app = express();
    
    app.use(cookieParser('super duper secret'));
    app.use(session({
        secret: 'super duper secret',
        resave: true,
        saveUninitialized: true
    }));
    app.use(logger('dev'));
    app.use(bodyParser.json());
    app.use(bodyParser.urlencoded({ extended: false }));
    app.use(express.static(path.join(__dirname, 'public')));
    app.use(passport.initialize());
    app.use(passport.session());
    
    // view engine setup
    app.set('views', path.join(__dirname, 'views'));
    app.set('view engine', 'ejs');
    
    app.use('/api', api);
    app.use('/auth', authenticate);
    
    //Initialize passport
    var initPassport = require('./passport-init');
    initPassport(passport);
    
    module.exports = app;


Файлы маршрутизации:-

api.js:

var express = require('express');
    var router = express.Router();
    
    router.use(function(req, res, next){
        
        if(req.method === "GET"){
            //continue to the next middleware or request handler
            return next();
        }
        
        if (!req.isAuthenticated()){
            //user not authenticated, redirect to login page
            return res.redirect('/#login');
        }
        
        //user authenticated continue to next middleware or handler
        return next();
    });
    
    //api for all posts
    router.route('/posts')
    
        //returns all posts
        .get(function(req, res){
        
            //temporary solution
            res.send({message: 'TODO return all posts'});
        })
    
        //posts all posts
        .post(function(req, res){
        
            //temporary solution
            res.send({message: 'TODO create a new post'});
        })
    
    module.exports = router;

authenticate.js:

var express = require('express');
    var router = express.Router();
    
    module.exports = function(passport){
    
    	//sends successful login state back to angular
    	router.get('/success', function(req, res){
    		res.send({state: 'success', user: req.user ? req.user : null});
    	})
    
    	//sends failure login state back to angular
    	router.get('/failure', function(req, res){
    		res.send({state: 'failure', user: null, message: "Invalid username or password"});
    	})
    
    	//log in
    	router.post('/login', passport.authenticate('login', {
    		successRedirect: '/auth/success',
    		failureRedirect: '/auth/failure'
    	}))
    
    	//sign up
    	router.post('/signup', passport.authenticate('signup', {
    		successRedirect: '/auth/success',
    		failureRedirect: '/auth/failure'
    	}))
    
    	//log out
    	router.get('/signout', function(req, res) {
    		req.logout();
    		res.redirect('/');
    	});
    
    	return router;
    }

passport-init.js (файл, который использует паспортный модуль):

var LocalStrategy   = require('passport-local').Strategy;
    var bCrypt = require('bcrypt-nodejs');
    //temporary data store
    var users = {};
    module.exports = function(passport){
    
    	// Passport needs to be able to serialize and deserialize users to support persistent login sessions
    	passport.serializeUser(function(user, done) {
            
            //tell passport which id to use for user
    		console.log('serializing user:',user.username)
    		return done(null, user.username);
    	})
    
    	passport.deserializeUser(function(username, done) {
            User.findById(username, function(err, user){
    		return done(err,users[username]);
            })
    	})
    
    	passport.use('login', new LocalStrategy({
    			passReqToCallback : true
    		},
    		function(req, username, password, done) { 
    
                if(!users[username]){
                    return done('user not found',false);
                }
            
                if(!isValidPassword (users[username],password)){
                    return done('invalid password', false);
                }
            
                console.log('sucessfully logged in')
    			return done(null, users[username]);
    		}
    	))
    
    	passport.use('signup', new LocalStrategy({
    			passReqToCallback : true // allows us to pass back the entire request to the callback
    		},
    		function(req, username, password, done) {
            
                if(users[username]){
                    return done('username already taken', false);
                }
                
                users[username] = {
    				username: username,
    				password: createHash(password)
    			}
            
                console.log('sucessfully signed in')
                console.log(users[username])
    			return done(null, users[username]);
    		}
    	))
    
        var isValidPassword = function(user, password){
    		return bCrypt.compareSync(password, user.password);
    	}
        
    	var createHash = function(password){
    		return bCrypt.hashSync(password, bCrypt.genSaltSync(10), null);
    	}
    };


Что я уже пробовал:

Я пробовал много решений, таких как добавление файлов cookie (которые, насколько я понял из других форумов, являются причиной того, что req.isAuthenticated() не работает), явно вызывая logIn (хотя passport.authenticate в authenticate.js вызывает его по умолчанию) и некоторые другие небольшие средства защиты, такие как изменение порядка моих промежуточных программ, но ничего не работает.

0 Ответов