Декоратор @IsJWT используется в библиотеке
class-validator для проверки того, что строковое значение
соответствует формату JSON Web Token (JWT). Он применяется в DTO-классах
и обеспечивает валидацию структуры токена без необходимости вручную
писать регулярные выражения или разбирать строку.
JWT представляет собой компактный токен, состоящий из трёх частей: заголовка, полезной нагрузки и подписи, закодированных в Base64URL и разделённых точками. Типичный формат выглядит так:
xxxxx.yyyyy.zzzzz
Каждая часть обязана присутствовать, иначе строка не считается валидным JWT.
JWT всегда состоит из трёх сегментов:
Формат:
base64url(header).base64url(payload).base64url(signature)
Ключевое правило: наличие ровно двух точек-разделителей.
Декоратор проверяет:
Пример внутренней логики проверки можно представить как эквивалент регулярного выражения:
/^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$/
Однако реальная реализация более строгая и учитывает особенности формата Base64URL.
Применение в DTO-классе:
import { IsJWT } from 'class-validator';
export class AuthDto {
@IsJWT()
token: string;
}
В этом случае любое значение token, не соответствующее
структуре JWT, будет отклонено валидатором.
В типичном серверном приложении на NestJS @IsJWT
используется внутри DTO, который затем проверяется через
ValidationPipe.
import { Body, Controller, Post } from '@nestjs/common';
import { IsJWT } from 'class-validator';
class LoginDto {
@IsJWT()
accessToken: string;
}
@Controller('auth')
export class AuthController {
@Post('verify')
verify(@Body() dto: LoginDto) {
return { valid: true };
}
}
При передаче некорректного токена NestJS автоматически вернёт ошибку валидации.
Без @IsJWT часто используют:
import { Matches } from 'class-validator';
@Matches(/^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$/)
token: string;
Проблемы такого подхода:
@IsJWT решает эти проблемы, предоставляя
специализированную проверку.
Важно понимать, что @IsJWT проверяет только формат
строки, но не её содержимое:
exp)То есть валидатор подтверждает лишь структурную корректность, а не подлинность токена.
@IsJWT()
token: object;
Такое значение всегда будет невалидным, так как ожидается строка.
const decoded = jwt.decode(token);
dto.token = decoded;
После декодирования структура перестаёт быть строкой JWT, что делает
проверку @IsJWT неприменимой.
Authorization: Bearer xxxxx.yyyyy.zzzzz
Если передать всю строку целиком, проверка провалится.
@IsJWT не поддерживает префиксы и должен применяться только
к чистому токену.
На практике @IsJWT часто используется вместе с
ограничением типа:
import { IsJWT, IsString } from 'class-validator';
class TokenDto {
@IsString()
@IsJWT()
token: string;
}
Порядок декораторов не влияет на результат, но помогает явно задать ожидания к данным.
@IsJWT не допускает:
""nullundefinedЕсли требуется разрешить отсутствие значения, используется:
import { IsOptional, IsJWT } from 'class-validator';
class TokenDto {
@IsOptional()
@IsJWT()
token?: string;
}
При работе с массивами токенов:
import { IsArray, IsJWT } from 'class-validator';
class BatchDto {
@IsArray()
@IsJWT({ each: true })
tokens: string[];
}
Параметр each: true заставляет валидатор проверять
каждый элемент массива отдельно.
class-validator использует функцию-проверку,
которая:
typeofСложность проверки остаётся линейной относительно длины строки.
| Метод | Уровень абстракции | Поддерживаемость | Семантика |
|---|---|---|---|
@IsJWT |
высокий | высокая | явная |
@Matches(regex) |
средний | средняя | неочевидная |
| ручная функция | низкий | зависит от реализации | произвольная |
В DTO, связанных с авторизацией, @IsJWT часто
применяется для:
Типичный сценарий:
class RefreshDto {
@IsJWT()
refreshToken: string;
}
JWT всегда использует Base64URL и ASCII-совместимые символы, поэтому:
Использование @IsJWT позволяет стандартизировать входные
данные на уровне DTO и разгрузить бизнес-логику от предварительных
проверок структуры токена. Это особенно важно в распределённых системах,
где токены передаются между сервисами и точность формата критична для
дальнейшей обработки.