2013-02-24 4 views
0

Я пытаюсь осуществить экспресс и паспортные сессий, как так:ExpressJS создает новую сессию на каждой смене страницы

app.use(connect.bodyParser()); 
    app.use(express.cookieParser()); 
    app.use(express.session({ 
    cookie: { 
     path: "/", 
     httpOnly: true, 
     maxAge: null 
    }, 
    store: redisStoreConnect, 
    secret: "something", 
    key: 'pksy.sid' 
    })); 
    app.use(passport.initialize()); 
    app.use(passport.session()); 

    passport.serializeUser (user, done) -> 
    done null, user.email 
    return 

    passport.deserializeUser (email, done) -> 
    User.findOne 
     email: email 
     , (err, user) -> 
     done err, user 
     return 
    return 

Если я перейти на страницу на моем сайте, новая сессия создается и хранится в Redis. Если я обновляю эту страницу, сессия, похоже, сохранится. Если я перейду к новой странице или даже если я закрою вкладку и снова откроюсь на той же странице, будет создан новый сеанс.

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

Обновление: Спасибо @robertklep за то, что напомнили мне, чтобы проверить, какой файл cookie был отправлен обратно (что я должен был сделать, чтобы начать). Оказывается, браузер отправляет обратно правильный файл cookie, и аутентификация работает. Сеансы на самом деле сохраняются, но по какой-то причине новый сеанс (не используемый браузером) создается с каждым запросом страницы. Как я могу остановить это?

+0

Как настроить паспорт? Кроме того, помогает ли вам установить maxAge значение тайм-аута (количество миллисекунд, сеанс может быть действительным)? – robertklep

+0

Я установил maxAge на 604800000, и ошибка остается. Это единственные две паспортные строки, которые, я думаю, повлияют на работу сессии. Помимо них я просто использую локальную стратегию и анонимную стратегию. –

+0

Вы также используете 'passport.serializeUser()' и 'passport.deserializeUser()'? – robertklep

ответ

3

«О, вы не знали, что браузер не отправляет cookie сессии с просьбой о значке?» говорит, что мой номер хакера, чей ilk создал необходимость в следующей отдельной строке кода.

11 часов отладки позже здесь является то, что решить эту проблему:

app.use express.favicon() 

Экспресс лечил фавиконки, как и любой другой ресурс, в то время как браузер был сделать специализированный, по-видимому, Cookieless запрос на него. Express предположил, что этот запрос должен был поступать от клиента без cookie сеанса, поэтому он создал для них новый сеанс; сеанс никогда не будет вызван снова. express.favicon() экономит день!

+1

Возможно, это связано с заказом, в котором вы называете промежуточное ПО, но эй, когда он работает работает ;) – robertklep

0

В моем случае я должен использовать

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

перед тем

app.use(app.router); 

Надеется, что это может помочь.