req.isAuthenticated () всегда ложно - PullRequest
1 голос
/ 24 мая 2019

Моя функция аутентификации с использованием passportjs всегда будет возвращать false, даже если пользователь уже существует, и он всегда будет перенаправлять на страницу входа, и это переписывает все мои маршруты аутентификации, поэтому, когда я вхожу в систему с действительными учетными данными пользователя или создаю новый пользователь, поведение по умолчанию заключается в перенаправлении на «секретную страницу», но это только перенаправление на страницу входа каждый раз.

Я не знаю, что я делаю не так, ребята, мне нужна ваша помощь, пожалуйста ... Я видел другие связанные вопросы, но большинство потоков на самом деле не отвечают на вопросы, или ответы, которые выглядят как решение, не работают, даже если я применил его, так как они должны быть, я все еще не знаю, что делать, чтобы сделать эта работа.

Я написал простое приложение для аутентификации пользователей при входе и выходе из системы с использованием маршрутов и passportjs.

Мой последний фрагмент кода настроен так, чтобы разрешить пользователю доступ к содержимому основного сайта, который в этом случае называется секретным шаблоном, только если пользователь является действительным пользователем (то есть он вошел в систему или успешно подписал). вверх).

Функция, которую я создал, выглядит следующим образом:

// Authenticate user Login
function isLoggedIn(req, res, next) {
    if(req.isAuthenticated()) {
        return next();
    }
    res.redirect('/login');
}

и это в основном должно было проверять, вошел ли пользователь уже в систему.

и затем я вызвал функцию как промежуточное ПО на одном из моих маршрутов:

app.get('/secret', isLoggedIn , (req, res)=>{
    res.render('secret');
});

Это должно гарантировать, что пользователь вошел в систему или зарегистрировался, прежде чем он получит доступ к секретной странице, в противном случае он должен вернуть страницу входа в систему и потребовать, чтобы пользователь вошел в систему или зарегистрировался, чтобы получить доступ к секретной странице.

Это мой полный код на всякий случай, у тебя пятнистые глаза, острее, чем у меня.

var express               = require('express'),
    app                   = express(),
    mongoose              = require('mongoose'),
    bodyParser            = require ('body-parser'),
    User                  = require('./models/user'),
    passport              = require('passport'),     
    localStrategy         = require('passport-local'),
    passportLocalMongoose = require('passport-local-mongoose'); 

mongoose.connect('mongodb://localhost/auth_demo_app', {
    useNewUrlParser: true
});

app.set('view engine', 'ejs');
app.use(express.static(__dirname + '/public'));
app.use(bodyParser.urlencoded({extended: true}));
app.use(passport.initialize());
app.use(passport.session());
app.use(require("express-session")({
    secret: "Rusty is the worst and ugliest dog in the wolrd",
    resave: true,
    saveUninitialized: true
}));

passport.use(new localStrategy(User.authenticate()));
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());


// ==================================================
// ROUTES
// ==================================================

app.get('/', (req, res)=>{
    res.render('home');
});

app.get('/secret',isLoggedIn, (req, res)=>{
    res.render('secret');
});

// AUTH ROUTES
// Register - Show Registration form
app.get('/register', (req, res)=>{
    res.render('register');
});
// Handle user Signup
app.post('/register', (req, res)=>{
    req.body.username
    req.body.password
    User.register(new User({username: req.body.username}), req.body.password, (err, user)=>{
        if(err){
            console.log(err);
            return res.render('register');
        }
        passport.authenticate('local')(req, res, ()=>{
            res.redirect('/secret');
        })
    })
});

// Login - Show Login form
app.get('/login', (req, res)=>{
    res.render('login');
});
// Handle user Signup
app.post('/login', passport.authenticate('local', {
        successRedirect: '/secret',
        failureRedirect: '/login',
    }),(req, res)=>{
        // Other stuff goes here 
});

// LOGOUT ROUTE
// Logs user out - ends user session
app.get('/logout', (req, res)=>{
    req.logOut();
    res.redirect('/');
});

// Authenticate user Login
function isLoggedIn(req, res, next) {
    if(req.isAuthenticated()) {
        console.log('User logged in successfully');
        return next();
    }
    res.redirect('/login');
}

app.listen(3000, ()=>{
    console.log('Server Started...');
});

console.log (req.isAuthenticated ()) // Всегда возвращает false.

1 Ответ

2 голосов
/ 25 мая 2019

Попробуйте изменить порядок с

app.use(passport.initialize());
app.use(passport.session());
app.use(require("express-session")({
    secret: "Rusty is the worst and ugliest dog in the wolrd",
    resave: true,
    saveUninitialized: true
}));

на

app.use(require("express-session")({
    secret: "Rusty is the worst and ugliest dog in the wolrd",
    resave: true,
    saveUninitialized: true
}));
app.use(passport.initialize());
app.use(passport.session());

Если вы используете файлы cookie, обязательно добавьте промежуточное программное обеспечение парсера файлов cookie

var express = require('express')
var cookieParser = require('cookie-parser')

var app = express()
app.use(cookieParser())

Еслиэто не тот случай, когда вы вызываете end, если вы используете axios, включите withCredentials

axios.get('some api url', {withCredentials: true});

, если вы используете fetch , обязательно добавьте учетные данные: «включить»

fetch('/...', {
  method: ..,
  headers: ...,
  credentials: 'include',
  body: ...
  ...})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...