Проблема с 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", все сикрет ключи правильные, токены тоже передаются правильные(рефреш не просроченный), не понимаю в чем проблема... Может я чего-то не вижу? или ошибка глобальнее?