Проблема с jwt refresh token

Вот код с контроллера

const { validationResult } = require('express-validator');
const db = require('../db')
const bcrypt = require('bcrypt')
const jwt = require('jsonwebtoken')
env = require('dotenv').config()


const JWT_ACCESS_SECRET = process.env.JWT_ACCESS_SECRET
const JWT_REFRESH_SECRET = process.env.JWT_REFRESH_SECRET


const generateAccessAndRefreshToken = (id, nickname, email, role) => {
    const payload = {
        id,
        nickname,
        email,
        role
    }

    const accessToken = jwt.sign(payload, JWT_ACCESS_SECRET, { expiresIn: '15s' })
    const refreshToken = jwt.sign(payload, JWT_REFRESH_SECRET, { expiresIn: '7d' })


    return { accessToken, refreshToken }

}

class UserController {
    async createUser(req, res) {
        try {
            const errors = validationResult(req)
            if (!errors.isEmpty()) {
                return res.status(400).json({
                    message: 'Ошибка при создании пользователя',
                    errors: errors.array()[0].msg
                })
            }
            const { nickname, pass, email } = req.body
            const candidateNickname = await db.query(`SELECT * FROM "users" WHERE nickname = $1`, [nickname])
            const candidateEmail = await db.query(`SELECT * FROM "users" WHERE email = $1`, [email])
            if (candidateNickname.rows.length > 0) {
                return res.status(400).json({ message: 'Пользователь с таким никнеймом уже существует' })
            }

            if (candidateEmail.rows.length > 0) {
                return res.status(400).json({ message: 'Пользователь с такой почтой уже существует' })
            }

            const saltRound = 7
            const salt = await bcrypt.genSalt(saltRound)
            const hashPass = await bcrypt.hash(pass, salt)
            const newUser = await db.query(`INSERT INTO "users" (nickname, pass, email) VALUES ($1, $2, $3) RETURNING *`, [nickname, hashPass, email])
            res.json('Пользователь создан с ником: ' + nickname)


        } catch (error) {
            console.log(error)
            res.status(500).json({ message: 'Что-то пошло не так, попробуйте снова' })

        }
    }
    async loginUser(req, res) {
        try {
            const { nickname, pass } = req.body
            const user = await db.query(`SELECT * FROM "users" WHERE nickname = $1`, [nickname])


            if (user.rows.length === 0) {
                return res.status(400).json({ message: 'Пользователь не найден' })
            }

            const matchPass = await bcrypt.compare(pass, user.rows[0].pass)
            console.log('matchPass', matchPass);

            if (!matchPass) {
                return res.status(400).json({ message: 'Неверный пароль' });
            }

            const { accessToken, refreshToken } = generateAccessAndRefreshToken(
                user.rows[0].id,
                user.rows[0].nickname,
                user.rows[0].email,
                user.rows[0].role
            )

            res.cookie('refreshToken', refreshToken, {
                httpOnly: true
                // secure: process.env.NODE_ENV === 'production', // Использовать secure в production(true)
                // sameSite: 'strict',
            });
            res.json({ accessToken })

        } catch (error) {
            console.log(error)
        }
    }

    refreshToken(req, res) {
        const refreshToken = req.cookies.refreshToken
        if (!refreshToken) {
            return res.status(401).json({ message: 'Нет рефреш токена' })
        }

        try {
            console.log('refreshToken', refreshToken);

            const decoded = jwt.verify(refreshToken, JWT_REFRESH_SECRET)
            console.log('decoded', decoded);

            const newAccessToken = jwt.sign(
                { id: decoded.id, nickname: decoded.nickname, email: decoded.email, role: decoded.role },
                JWT_ACCESS_SECRET,
                { expiresIn: '2m' }
            );
            console.log('newAccessToken', newAccessToken);

            res.json({ accessToken: newAccessToken })
        } catch (error) {
            console.log('error', error);

            res.status(401).json({ message: 'Невалидный рефреш токен' })
        }
    }

я сначала вхожу с postmana, мне выдается access toket в json и refresh token закидывается в куки. потом я пытаюсь сделать get запрос на эндпоинт с refresh функцией, в куках содержится refresh, в headers authorization передаю access вместе с bearer. мне выдает ошибку на клиенте(постман) { "message": "Невалидный рефреш токен" } а сервер падает с ошибкой "error JsonWebTokenError: invalid signature", все сикрет ключи правильные, токены тоже передаются правильные(рефреш не просроченный), не понимаю в чем проблема... Может я чего-то не вижу? или ошибка глобальнее?


Ответы (0 шт):