Codes

django graphene_jwt 상속을 통한 로그인 로깅

2022. 1. 6. 11:13

주말 오후, 숭례문

 

개요

 

 최근 진행했던 회사 프로젝트 중에 Django와 GraphQL을 사용한 프로젝트가 있었다. 사용자의 이용 기록을 저장해야 할 필요가 있던 프로젝트라 사용자가 로그인하는 것을 포함해서 행위를 기록하는 기능을 추가해야했다. 근데 누군가 만들어 둔 패키지에는 로깅 기능을 별도로 추가할 수 있는 기능은 없었고 이것을 어떻게 해결했는지 기록하는 글이다.

 

본문

 

 Django에서 GraphQL을 구현한 패키지인 django-graphene을 사용했고 로그인하는 것을 django-graphene-jwt 를 통해 구현했다. JWT 토큰을 생성하는 뮤테이션은 django-graphene-jwt를 통해 아래와 같이 등록한다.

 

Django JWT 등록 코드

 

 JWT 인증 패키지의 미들웨어가 있었으면 좋겠다고 생각했는데 아무리 찾아봐도 그런 기능이 없는 것 같았다. 그래서 생각한 방법이 두가지가 있었다.

 

  1. Django 자체의 미들웨어 기능을 사용하여 로그인하는 뮤테이션을 실행하려고 하는 것을 확인하고 로깅한다.
  2. graphql_jwt.ObtainJSONWebToken 클래스를 상속받아서 로그인하는 코드를 실행한 뒤 별도의 로깅 코드를 실행한다.

 

 첫번째 방법은 코드가 로그인할 때만 실행되는 것이 아니기 때문에 비효율적이라고 생각했다. 그래서 두번째 방법을 택했다.

 

 그래서 해당 클래스가 정의되어 있는 graphql_jwt의 mutations.py 파일을 보기로 했다.

 

mutations.py 코드 일부

 

JSONWebTokenMutaion 클래스 내부에서 mutate() 라는 메소드를 실행시키는 것을 볼 수 있었다.

 

 

 다시 GraphQL 선언부로 돌아가서 graphql_jwt.ObtainJSONWebToken 클래스를 상속받아 위와 같은 클래스를 만들었다. mutate()를 Override 해서 super().mutate() 로 실제 뮤테이션 코드를 실행시키고 그 다음에 로깅 로직을 실행시킨다.

 

 그리고 다시 graphene의 선언부를 아래와 같이 수정하면 된다.

 

 

 별거 아니지만 그동안 이 생각을 못했기 때문에 기록해두려고 블로그에 글을 쓰게 됐다.