В общем такая проблема. Делаю авторизацию для node.js приложения используя Passport.js и локальную стратегию авторизации. При первой загрузки страницы express-session создает пустую сессию в Mongo DB, и cookie для определения этой сессии. Когда я авторизуюсь passport, создает ещё одну сессию но уже с данными пользователя, и получаеться что куки определяют пустую сессию.
Cookie читают сессию U0jZB1hyyTufzng6gRM9sH-B1hTS95eM, но в ней нет нужных данных пользователя они в 8Yw-dXn2kkrxDNqOryi81W2u7jkxBQgb
App.js
import express from 'express';
import cookieParser from 'cookie-parser';
import session from 'express-session';
import passport from 'passport';
import React from 'react';
import ReactDOM from 'react-dom/server';
import { Provider } from 'react-redux';
import { match, RouterContext } from 'react-router'
import escapeHTML from 'lodash/string/escape';
import bodyParser from 'body-parser';
import flash from 'express-flash';
import {
fetchComponentsData,
getMetaDataFromState,
} from './utils';
import routes from '../shared/routes.jsx';
import configureStore from '../shared/store/configureStore';
import clientConfig from '../etc/client-config.json';
import api from './api';
import mongoose from './lib/mongoose';
require('./lib/passport.js')(passport)
const app = express();
const secretKey = 'mySecretKey';
app.use(bodyParser.json({ limit: 1024 * 1024, verify: (req, res, buf) => {
try {
JSON.parse(buf);
} catch (e) {
res.status(0).send({
error: {
code: 'BROKEN_JSON',
message: 'Please, verify your json'
}
});
}
} }));
app.use(cookieParser(secretKey));
const MongoStore = require('connect-mongo')(session);
app.use(session({
secret: secretKey,
resave: true,
rolling: true,
saveUninitialized: true,
store: new MongoStore({ mongooseConnection: mongoose.connection }),
cookie: {
httpOnly: true,
maxAge: 14 * 24 * 3600000, // 2 недели
secure: false
}
}));
app.use(passport.initialize());
app.use(passport.session());
app.use(flash())
app.use('/static', express.static('public/static'));
app.use('/api/v1', api);
pasport.js
import mongoose from './mongoose';
import './models/User';
const LocalStrategy = require('passport-local').Strategy;
const User = mongoose.model('users');
module.exports = function(passport) {
passport.serializeUser(function(user, done) {
console.log('serializeUser1 = ', user.id)
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
console.log('deserializeUser = ', id)
User.findById(id, function(err, user){
err
? done(err)
: done(null, user);
});
});
// Локальная авторизация
passport.use('local-login', new LocalStrategy({
usernameField : 'username',
passwordField : 'password',
passReqToCallback : true //
},
function(req, username, password, done) { // callback with email and password from our form
User.findOne({ 'username' : username }, function(err, user) {
if (err)
return done(err, req.flash('info', 'Неизвестная ошибка'));
if (!user)
return done(null, false, req.flash('info', 'Пользователь не найден')); // req.flash is the way to set flashdata using connect-flash
if (!user.validPassword(password))
return done(null, false, req.flash('info', 'Неверный пароль')); // create the loginMessage and save it to session as flashdata
return done(null, user);
});
}));
};
auth.js
import passport from 'passport';
module.exports = {
login: function(req, res, next) {
passport.authenticate('local-login', function(err, user, info) {
if (err) { return next(err); }
if (!user) { return res.redirect('/login'); }
req.logIn(user, function(err) {
if (err) { return next(err); }
console.log(user);
next()
// return res.redirect('/users/' + user.username);
});
})(req, res, next);
},
isAutStatus: function(req, res, next) {
// console.log('1111', req.user, req.isAuthenticated())
req.isAuthenticated()
? next()
: req.body.authStatus = 'Не авторизован'
next()
}
};
route.js
import express from 'express';
import routesFunc from './lib/routes';
import authMiddleware from './lib/middlewares/auth'
const router = new express.Router();
const routes = routesFunc();
// Пользователи
router.post('/user/register', authMiddleware.isAutStatus, routes.users.register.bind(routes.users));
router.post('/user/login', authMiddleware.isAutStatus, authMiddleware.login, routes.users.login.bind(routes.users));
router.get('/user/checkSession', routes.users.checkSession.bind(routes.users));
export default router;
Сборка персонального компьютера от Artline: умный выбор для современных пользователей