Как передать больше переменных через функцию обратного вызова паспорта?

У меня есть следующая функция:

passport.use(new LocalStrategy(
    function (username, password, done) {

        connection.query('SELECT * FROM accounts WHERE username = ?  LIMIT 1', [username], function (err, rows, fields) {
            if (!err) {
                if (rows.length > 0) {
                    var row = rows[0];
                    var passwordHash = require('crypto').createHash('sha1').update(password).digest('hex');

                    if (!passwordHash.localeCompare((row.password))) {
                        return done(null, {username: row.username});
                    }
                }
            }
        });
    }
));

Когда аутентификация пройдет успешно, я хочу передать больше полей, чем просто имя пользователя. Итак, я изменил свой код на:

 if (!passwordHash.localeCompare((row.password))) {
      return done(null, {username: row.username, role: row.accountType});
 }

Тем не менее, когда я звоню user.role поле в моем шаблоне, это будет нулевым.

заранее спасибо

1 ответ

Решение

Вы можете сделать следующее:

var row = rows[0];
var passwordHash = require('crypto').createHash('sha1').update(password).digest('hex');

if (!passwordHash.localeCompare((row.password))) {
       return done(null, row);
 }

Это передаст все поля из строки результатов. Если вы хотите пропустить некоторые поля, вы можете создать объект, назначить необходимые поля и затем передать его в качестве параметра в done() функция.

Пожалуйста, не забудьте также изменить ваши функции сериализации / десериализации:

passport.serializeUser(function (user, done) {
done(null, user);
});

passport.deserializeUser(function (user, done) {
    done(null, user);
});
Другие вопросы по тегам