지금 nest에 graphql 이랑 jwt 적용해서 특정 쿼리에는 인증 필요한거 만들고있음

알아 보니까 resolver 레벨에서 guard 적용하면 된다길레

https://docs.nestjs.com/security/authentication#implementing-the-authentication-guard


이 부분 참조했는데 필요한 작업이 req에서 쿠키 가져와서 jwt 검증하는 거였음

근데 저 코드에 나와있는

const request = context.switchToHttp().getRequest();

이 부분 아무리 실행해도 getRequest() 이게 undefined 반환함

그러다 슨택오버플로우에서 getContext() 이거 써서 그냥 req 객체 자체를 가져와서 쓰는건 또 가능함

대체 getRequest() 저건 웨 동작을 안하는거고 차이가 먼가요???


아 글고 nest 쓰면 쓸수록 느끼는건데 그냥좀 씨발

자유롭게 쓸수 있었으면 좋겠음 ㅠㅠㅠㅠ express나 koa는 그냥 context 가지고 뭘하든 마음대로 할수있는데

여기선 존나 이래라 저래라 이거 때문에 안됀다 저거 먼저 적용해야한다

이지랄하는거 너무 좆같아 ㅠㅠㅠㅠ




여기 authGuard 코드 입니다..



import { JwtService } from '@nestjs/jwt';

import {
  CanActivate,
  ExecutionContext,
  Injectable,
  UnauthorizedException,
} from '@nestjs/common';
import { Request } from 'express';
import { GqlExecutionContext } from '@nestjs/graphql';

@Injectable()
export class AuthGuard implements CanActivate {
  constructor(private jwt: JwtService) {}

  async canActivate(context: ExecutionContext): Promise<boolean> {
    const ctx = GqlExecutionContext.create(context);
    //원본 코드:
    //const req=context.switchToHttp().getRequest()
    //req가 undefined 임
    const req = ctx.getContext().req;
    const { access, refresh } = getAccessAndRefresh(req);

    //TODO: rtr 구현 필요
    if (!access && !refresh) {
      throw new UnauthorizedException();
    }

    try {
      const payload = await this.jwt.verifyAsync(access, {
        secret: process.env.JWT_SECRET,
      });
      req.user = payload;
    } catch {
      throw new UnauthorizedException();
    }
    return true;
  }
}

const getAccessAndRefresh = (
  req: Request,
): { access: string; refresh: string } => {
  const { access_token, refresh_token } = req.cookies;
  return { access: access_token, refresh: refresh_token };
};





아직 공부하는중이라 테스트용도로만 써봤는데 guard는 이렇게 했고

이걸 graphql resolver 에서 필요한 부분위에 @UseGuard(AuthGuard) 이렇게 썻읍니다...