Нет встроенного декоратора, но вы можете легко создать его самостоятельно. Смотрите пример из документов :
import { createParamDecorator } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
export const User = createParamDecorator((data, req) => {
return req.user;
});
Поскольку встроенный AuthGuard
вызывает исключение, вы можете создать свою собственную версию и перезаписать обработчик запроса:
@Injectable()
export class MyAuthGuard extends AuthGuard('jwt') {
handleRequest(err, user, info) {
// no error is thrown if no user is found
// You can use info for logging (e.g. token is expired etc.)
// e.g.: if (info instanceof TokenExpiredError) ...
return user;
}
}
Убедитесь, что вы не выдаваете ошибки в вашем JwtStrategy
:
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
constructor(private readonly authService: AuthService) {
super({
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
secretOrKey: 'secretKey',
});
}
async validate(payload) {
const user = await this.authService.validateUser(payload);
// in the docs an error is thrown if no user is found
return user;
}
}
Тогда вы можете использовать его в вашем Controller
так:
@Get()
@UseGuards(MyAuthGuard)
getUser(@User() user) {
return {user};
}