Почему не срабатывает функция verify из библиотеки jsonwebtoken

Рейтинг: 0Ответов: 0Опубликовано: 15.08.2025

Я пытаюсь сделать авторизацию в приложении на 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
}
Данный обработчик использует сервис авторизации authService, в котором выполняется поиск введённых пользователем данных в бд и формирование jwt токена

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, хотя опять же, и секретный ключ, и токен спокойно выводятся в консоль.

Ответы

Ответов пока нет.