Kamiya_Nya
@Kamiya_Nya
Начинающий программист

Как правильно делать JWT авторизация NodeJs?

Пытаюсь сделать авторизацию через passport-jwt. Я проверяю данные пользователя отправленные на сервер, его username и password и генерирую токен.
const username = req.body.username
        const password = req.body.password
        const user = await User.findOne({
            email: username
        })
        if (!user) {
            res.status(404).send(`Пользователь ${username} не существует`)
        }
        const validPassword = await bcrypt.compareSync(password, user.password)
        if (!validPassword) {
            res.status(401).send("Пароль не верный")
        }
        const token = jwt.sign({
            userId: user._id,
            username: user.email
        }, jwtKey, {
            expiresIn: '1h'
        })

Passport проверяет на наличие в Authorization поля 'Bearer token'
const JWTStrategy = require('passport-jwt').Strategy
const ExstractJWT = require('passport-jwt').ExtractJwt

const JWTkey = require('../config.json').secretJWTKey
const User = require('../models/User')

const options = {
    jwtFromRequest: ExstractJWT.fromAuthHeaderAsBearerToken(),
    secretOrKey: JWTkey
}

module.exports = passport => {
    passport.use(new JWTStrategy(options, async (payload, done) => {
        const user = await User.findById(payload.userId).select('email id')
        if (!user) {
            done(null, false)
        }
        if (user) {
            done(null, user)
        }
    }))
}

На нужном маршруте у меня стоит защита.
api.get('/create_article', passport.authenticate('jwt', {session: false}), mainController.createArticlePage)

При тестирование через Postman все работает как надо.

Однако, я не знаю как передать этот токен клиенту, чтобы потом он отправлял на сервер для проверки. Как мне его запихнуть в Authorization перед тем, как он откроет нужную мне страницу
  • Вопрос задан
  • 384 просмотра
Пригласить эксперта
Ответы на вопрос 1
@PAVLIK_GYRA
const token = jwt.sign({
            userId: user._id,
            username: user.email
        }, jwtKey, {
            expiresIn: '1h'
        })
res.json({ token })


на фронте получаешь данные, берёшь засовываешь localStorage.setItem('auth', token). При запросе нужной странице отправляешь в опциях к fetch или axios в header {Authorization: token}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы