PassportJs isAuthenticated является ложным после входа в систему - PullRequest
0 голосов
/ 07 декабря 2018

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

APP.JS FILE

const express = require('express');
const axios = require('axios');
const mongoose = require('mongoose');
const bodyParser = require('body-parser');
const cookieSession = require('cookie-session')
const keys = require('./config/keys')
const passport = require('passport');
const passportSetup = require('./config/passport-setup');

//initializing express app
const app = express();

//CORS headers

app.use(function(req, res, next) {
    res.header('Access-Control-Allow-Credentials', true);
    res.header('Access-Control-Allow-Origin', req.headers.origin);
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
    res.header('Access-Control-Allow-Headers', 'X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept');
    if ('OPTIONS' == req.method) {
         res.send(200);
     } else {
         next();
     }
    });

//body-parser for form parsing
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));


//cookie session
app.use(cookieSession({
    name : 'session',
    keys: [keys.session.cookieKey],
    maxAge : 24*60*60*1000, // 24 hrs
    domain : 'http//:localhost:8080'
}));

//initialize passport 

app.use(passport.initialize());
app.use(passport.session());


//initializing log-in route
app.use('/authentication', require('./routes/logInRoute'));
//initializing sign-up route
app.use('/authentication', require('./routes/signUpRoute'));



//connecting to database
mongoose.connect('mongodb://127.0.0.1/crypto', { useNewUrlParser: true })

ФАЙЛ PASSPORT-SETUP.JS

const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const User = require('../models/user-model');

passport.serializeUser((user,done)=>{
    console.log('serialize called');
    done(null, user.id);
});

passport.deserializeUser((id,done)=>{
    console.log('deserialize called')
    User.findById(id, (error,user)=>{
        done(error,user);
    })

});


passport.use(
    new LocalStrategy({
        usernameField : 'email',
        passwordField : 'password',
    },
    (username,password,done) => {
        console.log('strategy called')
        User.findOne({email:username}, (err,user)=>{
            if(err){return done(err);}
            if(!user) {return done(null,false)}
            if(user.password !=password){return done(null,false); }
            console.log('user found');
            return done(null,user);
        });
    }
));

LOGINROUTE.JS ФАЙЛ

const router = require('express').Router()
const passport = require('passport');

const authMiddleware = (req,res,next) =>{
    console.log(req.session);
    console.log('middleware fired');
    console.log(req.isAuthenticated())
    if(!req.isAuthenticated()){

        res.status(401).send('You are not authenticated');
    }else{
        return next();
    }
}

router.post('/login', (req,res,next) =>{
    passport.authenticate("local", (err,user,info)=>{
        if(err){
            return next(err);
        }

        if(!user){
            return res.status(400).send([user, "cannot log in", info]);
        }
        req.login(user, err=>{
            console.log(req.session);
            res.send ("Logged in");
        });
    }) (req,res,next);
} )

router.get('/user', authMiddleware, (req,res)=>{
    user.find(user=>{
        console.log('searching for user')
        return user.id === req.session.passport.user
    });

    console.log([user,req.session]);

    res.send({user:user});
})

module.exports = router;

НАЧАЛЬНЫЙ ВЫЗОВ ИЗ VUE APP

getUserdata(){
     this.axios.get('http://127.0.0.1:3000/authentication/user', {
       withCredentials: true
     })
      .then((response)=>{
        self.$set(this,'user',response.data.user)
      })
      .catch((errors)=>{
        console.log(errors)
        this.$router.push('/');
      })

}

То, что я сделал до сих пор без каких-либо результатов:

  • Установка промежуточного программного обеспечения сеанса перед любым промежуточным программным обеспечением паспорта;
  • Добавлены заголовки CORS для принятия учетных данных и withCredentials: истинный заголовок вызова;
  • Вместо использования стандартной аутентификации добавлен настраиваемый обратный вызов с req.login;
  • Попытка настройки vue.config.js прокси мой запрос в случае, если мое приложение не может сохранить сеанс из-за междоменного взаимодействия;

Проблемы, которые у меня возникают:

  • Passport.deserializeUser ()никогда не называется

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

РЕДАКТИРОВАТЬ # 1:

В настоящее время я пытаюсь использовать экспресс-сессию вместо cookie-сессии, и я наконец-то что-то получаю.

app.use(require('express-session')({
    secret: 'crackalackin',
    resave: true,
    saveUninitialized: true,
    cookie : { secure : false, maxAge : (4 * 60 * 60 * 1000) }, // 4 hours

}));

пока я искал решение, прежде чем нашел этот пост: https://github.com/jaredhanson/passport/issues/452, поэтому я попытался console.log (sessionStorage) в своем коде и получил следующие результаты:

  //this is when I am logging in  
Session {                                                                                              
      cookie:                                                                                              
       { path: '/',                                                                                        
         _expires: 2018-12-07T21:24:31.206Z,                                                               
         originalMaxAge: 14400000,                                                                         
         httpOnly: true,                                                                                   
         secure: false },                                                                                  
      passport: { user: '5c066a79624c6a0b888d7888' } }    
       //this is when I am being redirected                                          
    Session {                                                                                              
      cookie:                                                                                              
       { path: '/',                                                                                        
         _expires: 2018-12-07T21:24:31.293Z,                                                               
         originalMaxAge: 14400000,                                                                         
         httpOnly: true,                                                                                   
         secure: false } }                                                                                 
    MemoryStore {                                                                                          
      _events:                                                                                             
       [Object: null prototype] {                                                                          
         disconnect: [Function: ondisconnect],                                                             
         connect: [Function: onconnect] },                                                                 
      _eventsCount: 2,                                                                                     
      _maxListeners: undefined,                                                                            
      sessions:                                                                                            
       [Object: null prototype] {                                                                          
         FIZ6y81PZH2qwd0fLVkQcZddeECrjJFN:                                                                 
          '{"cookie":{"originalMaxAge":14399999,"expires":"2018-12-07T21:24:31.190Z","secure":false,"httpOn
    ly":true,"path":"/"}}',                                                                                
         'j2eQDhhENf_Zt-wo5PmckZXTxExPTkix':                                                               
          '{"cookie":{"originalMaxAge":14400000,"expires":"2018-12-07T21:24:31.219Z","secure":false,"httpOn
    ly":true,"path":"/"},"passport":{"user":"5c066a79624c6a0b888d7888"}}' },                 

Как видите, где-то хранится идентификатор пользователя.Все еще расследуем

**** РЕШЕНО! ****

При подаче запроса axios вы должны сделать это следующим образом

this.axios.create({withCredentials : true}).get(URL)
      .then((response)=>{
        console.log(response)
      })
      .catch((errors)=>{
        console.log(errors)
        this.$router.push('/');
      })
  }

Теперь cookie корректно отправляется из браузера на сервер, вызывается deserializeUser (), и req.isAuthenticated () имеет значение true):

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

...