Всё достаточно легко. Сам он не создаеться. Мы, когда строим запрос на клиенте, так же его не создаем. Сейчас обьясню.
В основном:
Перед твоим декоратором, скорее всего, над методом будет стоять Guard, который создаст этого user. Легко, он сам примит request, потом сделает request.user = user
. Т.е. гуард его туда запихнет.
Откуда guard возьмёт обьект user? Ты, передашь токен, который мы переведем в юзера. Это может быть сессия, может быть JWT токен. Передадим с помощью header'ов, а точнее, с помощью Bearer Token.
Bearer токен - это поле header'а, которое выглядит как-то так:
"Authorization": "Bearer q2wemn213asdniqw52eoi892jhawhsndmahsj"
,
Где непонятная строка - это токен. Потом, мы каким-то образом, превратим этот токен в юзера. Покажу пример guard'а:
async canActivate(context: ExecutionContext): Promise<boolean> {
const request = context.switchToHttp().getRequest();
const token = this.extractTokenFromHeader(request);
if(!token) {
throw new UnauthorizedException();
}
try {
request['user'] = await this.jwtService.verifyAsync(
token,
{
secret: this.config.get('JWT_SECRET')
}
);
} catch {
throw new UnauthorizedException();
}
return true;
}
private extractTokenFromHeader(request: Request): string | undefined {
const [type, token] = request.headers.authorization?.split(' ') ?? [];
return type === 'Bearer' ? token : undefined;
}