Пользователь NestJs анализирует, если аутентифицирован - PullRequest
0 голосов
/ 11 ноября 2018

Я хочу знать, существует ли декоратор, который делает объект req.user доступным в методе контроллера, если пользователь вошел в систему (отправлен заголовок аутентификации), если нет, то просто допустим, что req.user будет нулевым.

Декоратор AuthGuard вернет 401, если пользователь не вошел в систему, поэтому он не подходит для моего случая.

1 Ответ

0 голосов
/ 12 ноября 2018

Нет встроенного декоратора, но вы можете легко создать его самостоятельно. Смотрите пример из документов :

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};
}
...