Как передать больше переменных через функцию обратного вызова паспорта?
У меня есть следующая функция:
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);
});