#javascript #mongodb #express #authentication
#javascript #mongodb #выражать #аутентификация #выразить
Вопрос:
Я использую Passport.js для аутентификации в API Express 4. В основном все работает нормально, но я обнаружил, что отправка правильных ответов json, т. Е. Сообщений об ошибках или объектов, затруднена с помощью passport. Например, это мое LocalStrategy
для входа в систему:
passport.use (
'login',
new LocalStrategy (
{
usernameField: 'email',
},
(email, password, done) => {
User.findOne ({email: email}, (err, foundUser) => {
if (err) return done (err);
if (!foundUser) {
return done (null, false, {
message: 'Invalid Username.',
});
}
if (!foundUser.comparePassword (password)) {
return done (null, false, {
message: 'Invalid Password.',
});
}
return done (null, foundUser);
});
}
)
);
Я настраиваю пользовательские message
значения для случаев сбоя аутентификации, но эти сообщения никогда не отображаются в моих ответах api. Как мне отправлять подобные сообщения, если что-то пойдет не так во время аутентификации?
app.post (
'/signup',
passport.authenticate ('signup', {
successRedirect: '/user',
failureMessage: true,
successMessage: true,
})
);
Более того, вместо установки перенаправлений типа successRedirect
я хочу отправлять правильные ответы json для каждого случая, и если возникает ошибка, я хочу отправить это как объект json вместо перенаправления на маршрут. Как я могу это сделать?
Ответ №1:
Попробуйте использовать async await
здесь.
passport.use(
'login',
new LocalStrategy(
{
usernameField: 'email',
passwordField: 'password',
},
async (email, password, done) => {
try {
const user = await User.findOne({ email });
// now if user exists it will give the whole document if not then null, now you can test your conditions based on this user flag /
} catch (error) {
done(error);
}
},
),
);
в последнем случае, о котором вы упомянули, вы можете отправить ответ в виде
app.post('/signup', passport.authenticate('login'), (req, res) => {
res.status(200).json({
message: 'Your message here',
user: req.user,
});
});
здесь это должен быть login in passport.authenticate('login')
поскольку вы используете локальную стратегию, используя login в приведенном выше коде.
Комментарии:
1. Это не то, чего я хочу. Я спрашиваю, как мне отправить
message
объекты, которые я передаю в методе done, например: ` if (!foundUser) { return done (null, false, { message: ‘Недопустимое имя пользователя.’, }); }` клиенту в виде ответов json в случае сбоя аутентификации где-либо.