2015-07-17 2 views
1

Я использую passjs для аутентификации своего экспресс-приложения. То, что я сделал, очень похоже на код учебника, но сеанс аутентификации всегда меня задевает.passjs не удалось аутентифицировать экспресс-сессию

В моем основном рабочем процессе я аутентификация пользователя с использованием местной стратегии

passport.authenticate('local', function (err, user, info) { 
    if (err) { 
     req.flash('error', { msg: err.message }); 
     return res.redirect('back'); 
    } 

    if (!user) { 
     // punish abuser... 
     }) 
     .catch(function (err) { 
     req.flash('error', { msg: err.message }); 
     return res.redirect('back'); 
     }); 
    } else { 
     // Log user in 
     debug('Info: ' + 'Logging in'.green.bold); 
     req.logIn(user, function (err) { 
     if (err) { 
      debug('Info: ' + 'Error occured '.red.bold); 
      req.flash('error', { msg: err.message }); 
      res.redirect('back'); 
     } 
     // req.session.passport.user = user.id; // <-- even tried hack, didn't work 
     // Send user on their merry way 
     res.redirect('/homepage'); 
     }); 
    } 
    }) 

Тогда для всех REQ на/домашнюю страницу, я заставить их проверить, если пользователь аутентифицирован

app.all('/api*', passportConf.isAuthenticated); 

где isAuthenticated() определяются как

exports.isAuthenticated = function (req, res, next) { 
    // Is the user authenticated? 
    if (req.isAuthenticated()) { 
    debug('Info: ' + '----authentication verified'); 
    return next(); 
    } else { 
    debug('Info: ' + '----authentication verification failed'); 
    // flash error message etc... 
    return res.redirect('/login'); 
    } 
}; 

Результаты показаны:

Info: --->> Password Matched! <<--- +0ms 
Info: Logging in +0ms 
Info: serializing user +0ms 
... 
POST /login 302 295.015 ms - 64 
... 
Executing (default): UPDATE "Sessions" SET "data"='{"cookie":{"//cookie"},"passport":{"user":37}}' 
... 
Info: ----authentication verification failed +0ms 
.... 
GET /api 302 19.094 ms - 68 

Executing (default): UPDATE "Sessions" SET "data"='{"cookie":{"//cookie"},"passport":{}, "attemptedURL":"/api"} 
... 
Info: de-serializing user +20ms 
... 
Executing (default): SELECT "//fields" FROM "Users" AS "User" WHERE "User"."id" = 37 LIMIT 1; 
Error: 500 [object SequelizeInstance:User] +5ms 

Запрос, безусловно, проходит проверку пароля и проходит до момента перенаправления и после того, как перенаправляется.

Есть 3 возможные причины, которые я наблюдал:

  • Два сеанса UPDATE записи идентичны, за исключением, что первый один имеет user.id сериализовать в, после редиректа, пользователь ушел.
  • de-serializing user и операция SELECT для поиска пользователя происходит после того, как запрос был приговорен к смерти. Возможно, возникла некоторая проблема с упорядочением/асинхронностью с моим кодом (я смотрел повсюду и ничего не нашел.)
  • 500 [object SequelizeInstance: User] действительно ошибка черного ящика, я понятия не имею, что это подразумевает ..

Застрял в этом в течение многих ночей ... любая помощь в этом очень ценится ...

ответ

1

500 [object SequelizeInstance:User], кажется, указывает, что вы передаете экземпляр sequelize к чему-то, где-то, который думает, что это ошибка. Возможно, вы вызываете обратный вызов, который ожидает err, user с user:

fn(user) 
// Where it should have been 
fn(null, user) 
Смежные вопросы