2016-04-06 4 views
0

В приложении экспресс-узла, использующем библиотеку паспорта для аутентификации, я конвертирую хранилище сеансов из MemoryStore в connect-couchdb. Страница входа в систему теперь взломана, и я думаю, что это связано с тем, что новое хранилище сеансов достаточно медленное, что оно подсвечивает гонку.Убедитесь, что сеанс-хранилище завершен до переадресации имени пользователя.

Я использую параметр «successReturnToOrRedirect: /» в паспорте, а «session get» для/происходит до того, как «набор сеансов» был записан в базу данных. Я использовал некоторые дополнительные протоколирования через connect-couchdb и код паспорта, чтобы подтвердить это.

Есть ли способ удостовериться, что req.session.save вызывается и завершается до того, как res.redirect получает название как часть успеха в паспорте? Дополнительный обратный вызов, который вы можете передать в authenticate(), заменяет всю встроенную обработку, я надеялся на решение, в котором оно может быть дополнено.

here Также отправленный

ответ

0

Сэр, один отвечает за управление сеансом является Экспресс и иметь необходимый интерфейс для плагинов вашей сессии магазин как MemoryStore. И если вы называете req.session.save вы заслуживаете обратного вызова тоже :-)

req.session.save(function(err) { 
    if (err) { 
    // Houston we have a problem 
    return err; 
    } 

    // Session saved 
}) 
+0

Проблема здесь в том, что passport.js дело с деталями низкого уровня проверки подлинности, и нет никакого способа, чтобы вручную вызвать req.session.save, прежде чем он перенаправляет (на успех). Вы можете настроить с помощью обратного вызова, но это заменяет весь обработчик. –

+0

Например, посмотрите на стратегию.success на https://github.com/jaredhanson/passport/blob/master/lib/middleware/authenticate.js –

0

Возможный способ обхода является заставить сеанс сохранить перед всеми переадресовывает, который случается работать в моем случае. Единственное res.redirect у нас есть часть паспорта. Что-то вроде:

module.exports = function(req, res, next) { 
    const _redirect = res.redirect; 
    res.redirect = function(args) { 
     if (req.session) { 
      req.session.save(err => { 
       if (err) { 
        // handle error 
       } 
       _redirect.call(res, args); 
      }) 
     } else { 
      _redirect.call(res, args); 
     } 
    } 
} 
Смежные вопросы