2013-06-25 3 views
4

Я реализовал некоторую аутентификацию пользователя на одном динаре Heroku, используя express (node.js) + mongodb, и все работает нормально. Однако, когда я увеличиваю число динамиков (более 1), я не могу войти в систему, я постоянно переадресовываюсь на мою страницу входа, то есть моя сессия не была установлена. Вот мой код:Настройка сеансов в экспресс-приложении на нескольких приложениях dynos heroku

checkCookies = функция (Req, Рез, следующий) {

if(req.session.user){ 
    res.locals.user = req.session.user; 
    next(); 
    } 
    else{ 
    res.redirect('/login'); 
    } 
}; 
app.use(express.cookieParser()); 
    app.use(express.session({ secret: '0GBlJZ9EKBt2Zbi2flRPvztczCewBxXK', 
    cookie: {httpOnly: true, maxAge:14*24*60*60*1000} 
    })); 

Что является лучшим решением для обработки общего сеанса на экспресс/Node.js с использованием MongoDB?

ответ

5

connect-mongo Используйте модуль с курьерским.

var http = require('http'), 
    express = require('express'), 
    session = require('connect-mongo')(express) 

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

app.configure(function() { 
    app.use(express.cookieParser()); 
    app.use(express.session({ 
    store: new session({ 
     db: 'sessions' 
    }), 
    secret: 'yoursecret', 
    cookie: { 
     path: '/', 
     maxAge: 1000 * 60 * 60 * 24 // 1 day 
    } 
    })); 
    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'); 
    next(); 
    }); 
    app.set('jsonp callback', true); 
}); 
+0

Спасибо за объяснение! Можете ли вы сказать мне преимущество разрешения перекрестного домена и jsonp? Или скажите мне, где я могу что-то прочесть? Я google, и ничего не получилось. –

+1

Если у вас будет сайт example.com и вызывается из его запроса JS AJAX на api.com - это будет ваше приложение-узел, то это не позволит сделать это в большинстве браузеров из-за ограничения безопасности. Вы включили это на стороне сервера, чтобы разрешить доступ из других доменов, и вам нужно дополнительно добавить JSONP и использовать его, если вам нужна более старая поддержка браузеров. Если вы хотите иметь общие данные cookie сеанса, вам нужно добавить дополнительный бит к вашим запросам ajax, для jQuery это будет 'xhrFields: {withCredentials: true}'. Подробнее: http://goo.gl/Y1XK0 – moka

4

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

Я могу использовать сеансы cookie на нескольких динамиках, если я использую cookie-session, а не express-session. То, что отсутствует в первом сообщении в этом потоке, - это секретное значение, которое НЕ передается парсеру cookie. Это означает, что узел будет присваивать случайный хэш парсеру каждый раз, когда процесс перезапускается или когда начинается новый динамик.

Выполнение следующих работ для меня:

app.use(express.cookieParser('0GBlJZ9EKBt2Zbi2flRPvztczCewBxXK')); 
    app.use(express.session({ secret: '0GBlJZ9EKBt2Zbi2flRPvztczCewBxXK', 
    cookie: {httpOnly: true, maxAge:14*24*60*60*1000} 
    })); 
+0

Отличный ответ; большое спасибо! –