Имеется такой ендпойнт для получения списка книг, только для авторизированного пользователя.
@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 Strategyimport { 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 };
}
}
JwtGuardimport { Injectable } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
@Injectable()
export class JwtAuthGuard extends AuthGuard('jwt') {}