Я пытаюсь создать экспресс-приложение, которое позволит вам войти в мое приложение 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 на своем сервере, код можно найти здесь,Настройки экспресс-сессии также не изменились.Надеюсь, это кому-нибудь поможет, потому что, честно говоря, мне потребовалось слишком много времени, чтобы понять это.