Почему не срабатывает функция verify из библиотеки jsonwebtoken
Я пытаюсь сделать авторизацию в приложении на Next.js с использованием jwt токенов. Имеется простой компонент формы авторизации с двумя полями login, password и кнопкой submit. При нажатии на кнопку запрос с данными улетает на /api/adminpanel: Вот код обработчика /api/adminpanel
export async function POST(request: Request) {
const { login, password } = await request.json();
const authEmployee = await authService.login(login, password)
if (!authEmployee) {
return NextResponse.json(
{ error: 'Неверные данные' },
{ status: 401 }
);
}
// Берём из пришедшего объекта только id
const employeeId: Pick<typeof authEmployee.employee, 'id'> = { id: authEmployee.employee.id };
const res = NextResponse.json(employeeId);
res.cookies.set({
name: 'token',
value: authEmployee.jwt,
path: '/',
httpOnly: true,
maxAge: 60 * 60 * 8,
})
return res
}
import prisma from "../db/prisma"
import {sign} from 'jsonwebtoken';
import { Role } from '@prisma/client';
type Employee = {
id: number;
surname: string;
name: string;
patronymic: string;
position: string;
phone: string;
email: string;
login: string;
password: string;
role: Role;
photo: string | null;
branchId: number;
}
class AuthService{
async login(login: string, password: string) {
let jwt: string = "";
const employee = await prisma.employee.findFirst({
where: {
login,
password // В реальном проекте пароль должен быть хеширован!
}
})
if(employee) {
jwt = this.generateJwt(employee);
return {employee, jwt}
}
else{
return false;
}
}
generateJwt(employee: Employee) {
const { password, ...payload } = employee; // Физически удаляем password
console.log(payload)
return sign(
payload,
process.env.JWT_KEY!,
{ algorithm: 'HS256', expiresIn: "8h" }
);
}
}
Токен, по итогу, нормально формируется, кодируется и добавляется в куку. Проблемы начинаются при его верификации в посреднике middleware.
import {verify, decode} from 'jsonwebtoken';
export function middleware(request: NextRequest) {
const path = request.nextUrl.pathname;
const token = request.cookies.get('token')?.value;
// Если нет токена - редирект на форму авторизации
if (!token) {
return NextResponse.redirect(new URL('/adminpanel', request.url));
}
// Проверяем валидность JWT
try {
const decoded = verify(token, process.env.JWT_KEY!, { algorithms: ['HS256'] });
//const decoded = decode(token)
console.log(token)
}
catch (err) {
// Если токен невалидный - чистим куку и редирект
const response = NextResponse.redirect(new URL('/adminpanel', request.url));
//response.cookies.delete('token');
console.log(err)
return response;
}
return NextResponse.next();
}
// Конфиг для матчинга путей
export const config = {
matcher: [
'/adminpanel/:path+',
],
};
А конкретно, в этой строке <const decoded = verify(token, process.env.JWT_KEY!, { algorithms: ['HS256'] });>, которая находится в блоке try возникает не понятная ошибка, как-будто у меня не проходит верификация, хотя я выводил в консоль и токен, и секретный ключ, и декодировал этот токен, чтобы убедиться, что он имеет payload, но всё без результатно. Меня выкидывает в блок catch и там в консоль выводится такая ошибка
В чём может заключаться проблема? Функция decode отрабатывает нормально, то есть const decoded = decode(token) отдаёт мне декодированный токен, но вот verify выдаёт ошибку и выбрасывает меня в catch, хотя опять же, и секретный ключ, и токен спокойно выводятся в консоль.