@Helios69

Как использовать сookies в NestJS?

Имеется такой ендпойнт для получения списка книг, только для авторизированного пользователя.
@Get()
  @Roles(Role.Admin, Role.User)
  @UseGuards(JwtAuthGuard, RolesGuard)
  getAllBooks(): Promise<Book[]> {
    return this.bookService.getAllBooks();
  }


С фронтенда делаю Get-запрос, при этом будучи авторизированным. Куки приходят на бэк, но приходит 401 код. Через Postman я просто копировал токен из cookies и втсавлял его поле Bearer token и всё получалось. Вопрос: как достать токен из cookies на бэке и использовать его?

Код Guard-ов, если нужен:
JWTAuthGuard
@Injectable()
export class JwtAuthGuard extends AuthGuard('jwt') {}

RolesGuard
@Injectable()
export class RolesGuard implements CanActivate {
  constructor(
    @Inject(forwardRef(() => UserService))
    private userService: UserService,
    private reflector: Reflector,
  ) {}

  canActivate(context: ExecutionContext): Promise<boolean> | boolean {
    const request = context.switchToHttp().getRequest();
    console.log(request);

    const { userId } = request.user;
    const requiredRoles = this.reflector.getAllAndOverride<Role[]>('roles', [
      context.getHandler(),
      context.getClass(),
    ]);
    const hasRole = async (userId: number, requiredRoles: Role[]) => {
      const { role } = await this.userService.getById(userId);

      return requiredRoles.includes(role) || !requiredRoles;
    };

    return hasRole(userId, requiredRoles);
  }
}


З.Ы. Сookies-Parser стоит, куки приходят через реквест, но по всей видимости не проверяются в guard-ах. С закомментированными Guard-ами вcё работает, на куки приходит нормально.
Как получаю куки
@Get()
  // @Roles(Role.Admin, Role.User)
  // @UseGuards(JwtAuthGuard, RolesGuard)
  getAllBooks(@Cookies() cookies: string): Promise<Book[]> | string {
    return cookies;
  }

З.Ы.Ы. Возможно дело в том, что я использую JWT Strategy. Но я не совсем понимаю как изменить её на Cookie.
JWT Strategy
import { ExtractJwt, Strategy } from 'passport-jwt';
import { PassportStrategy } from '@nestjs/passport';
import { Injectable } from '@nestjs/common';
import { TokenPayload } from '../token-payload.interface';

@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
  constructor() {
    super({
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      ignoreExpiration: false,
      secretOrKey: process.env.JWT_SECRET,
    });
  }

  async validate(payload: TokenPayload) {
    return { userId: payload.userId };
  }
}

JwtGuard
import { Injectable } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';

@Injectable()
export class JwtAuthGuard extends AuthGuard('jwt') {}
  • Вопрос задан
  • 270 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы