가드는 CanActivate 인터페이스를 구현하는 @Injectable() 데코레이터로 주석이 달린 클래스입니다. 런타임에 존재하는 특정 조건에 따라 주어진 요청이 경로 핸들러에 의해 처리되는지 여부를 결정합니다.
이것을 흔히 권한 부여라고 하는데, 권한 부여는 일반적으로 express 애플리케이션의 미들웨어에 의해 처리되었습니다. 그러나 미들웨어는 본질적으로 멍청해 next() 함수를 호출한 후 어떤 핸들러가 실행될지 모릅니다.
Guards는 ExecutionContext 인스턴스에 엑세스할 수 있으므로 다음에 실행될 항목을 정확히 알 수 있습니다. 토큰을 추출 및 검증하고 추출된 정보를 사용하여 요청을 진행할 수 있는지 여부를 결정합니다.
파으피 및 예외 필터와 마찬가지로 가드는 컨트롤러 범위, 메서드 범위 또는 전역 범위일 수 있습니다.
GraphQL은 들어오는 요청에서 다른 유형의 데이터를 수신하기 때문에 가드와 인터셉터 모두에서 수신하는 실행 컨텍스트는 GraphQL과 REST에서 다소 다릅니다.
GraphQL resolver에는 root, args, context, and info와 같은 고유한 인수 집합이 있습니다. 따라서 가드와 인터셉터는 일반 ExecutionContext를 GqlExecutionContext로 변환해야 합니다.
authentication: 토큰의 유효성 확인
authorization: 유저가 어떤 일을 하기 전에 그 일을 할 수 있는 권한이 있는지 확인
nest g mo auth
입력해서 auth.module.ts
파일을 만들어줍니다.
auth.guard.ts
파일을 생성한 후 CanActivate를 상속받아 class를 만들어줍니다.
CanActivate는 canActivate라는 함수를 사용해야 하며 이 함수는 context를 받습니다. context에 따라 return 값을 true와 false로 정해야합니다.
canActivate 함수에서 받는 context는 HTTP이기 때문에 graphql로 바꿔 다시 context를 호출합니다.
users.resolver.ts
파일에서 @UseGuard() 데코레이터로 Guards를 사용합니다.
auth-user.decorator.ts
파일을 만들고 createParamDecorator() 함수를 사용해 데코레이터를 만들 수 있습니다.
이 함수는 factory function이 필요하고, factory function에는 항상 unknown value인 data와 context가 있습니다.
Guards에서 한 것과 똑같이 graphqlContext로 바꿔준 뒤 user 값을 return 합니다.
사용하고 싶은 곳에서 데코레이터를 사용할 수 있습니다. authUser 값은 항상 데코레이터의 return 값이 됩니다.
me(@AuthUser() authUser: User) {}