Я использую PassportJS для реализации стратегии авторизации JWT в приложении NodeJS / Express.
Во всех руководствах токен JWT просто отсылается обратно по маршруту POST / login и вручную вставляется в заголовки запроса для демонстрации (см. Узнайте, как использовать JWT с аутентификацией по паспорту , Узнайте, как для обработки аутентификации с помощью Node с использованием Passport.js ), которая прекрасно работает в контексте API, но не веб-приложения, доступного из браузера.
Мой вопрос: как сохранить токен авторизации на стороне клиента, чтобы браузер отправлял его каждый раз в заголовках своих запросов?
Вот обзор моего кода (я удалил ненужные строки):
# users.js
router.post('/login', auth.optional, (req, res, next) => {
return passport.authenticate('local', { session: false }, (err, passportUser, info) => {
if (err) {
res.render('/users/login');
}
if (passportUser) {
const user = passportUser;
user.token = passportUser.generateJWT();
return res.json({ user: user.toAuthJSON() });
// I want to set the auth header here
}
return res.status(400).info;
})(req, res, next);
});
router.get('/me', auth.required, (req, res, next) => {
res.render('me'); // Throws a 401 - No authorization token was found
});
При попытке доступа к / me выдается 401 - токен авторизации не найден ошибка, что имеет смысл, поскольку токен никогда не устанавливается. Но как это реализовать?
# промежуточного / auth.js
const getTokenFromHeaders = (req) => {
...
};
const auth = {
required: jwt({
secret: 'secret',
userProperty: 'payload',
getToken: getTokenFromHeaders
}),
optional: jwt({
secret: 'secret',
userProperty: 'payload',
getToken: getTokenFromHeaders,
credentialsRequired: false
})
};
конфиг / passport.js
passport.use(new LocalStrategy({
usernameField: 'email',
passwordField: 'password'
}, (email, password, done) => {
User.findOne({ email })
.then((user) => {
if (!user || !user.validatePassword(password)) {
return done(null, false, { errors: { 'email or password': 'is invalid' } });
}
return done(null, user);
}).catch(err => done(err));
}));
Большое спасибо за вашу помощь.