django graphene_jwt 상속을 통한 로그인 로깅
개요
최근 진행했던 회사 프로젝트 중에 Django와 GraphQL을 사용한 프로젝트가 있었다. 사용자의 이용 기록을 저장해야 할 필요가 있던 프로젝트라 사용자가 로그인하는 것을 포함해서 행위를 기록하는 기능을 추가해야했다. 근데 누군가 만들어 둔 패키지에는 로깅 기능을 별도로 추가할 수 있는 기능은 없었고 이것을 어떻게 해결했는지 기록하는 글이다.
본문
Django에서 GraphQL을 구현한 패키지인 django-graphene을 사용했고 로그인하는 것을 django-graphene-jwt 를 통해 구현했다. JWT 토큰을 생성하는 뮤테이션은 django-graphene-jwt를 통해 아래와 같이 등록한다.
JWT 인증 패키지의 미들웨어가 있었으면 좋겠다고 생각했는데 아무리 찾아봐도 그런 기능이 없는 것 같았다. 그래서 생각한 방법이 두가지가 있었다.
- Django 자체의 미들웨어 기능을 사용하여 로그인하는 뮤테이션을 실행하려고 하는 것을 확인하고 로깅한다.
- graphql_jwt.ObtainJSONWebToken 클래스를 상속받아서 로그인하는 코드를 실행한 뒤 별도의 로깅 코드를 실행한다.
첫번째 방법은 코드가 로그인할 때만 실행되는 것이 아니기 때문에 비효율적이라고 생각했다. 그래서 두번째 방법을 택했다.
그래서 해당 클래스가 정의되어 있는 graphql_jwt의 mutations.py 파일을 보기로 했다.
JSONWebTokenMutaion 클래스 내부에서 mutate() 라는 메소드를 실행시키는 것을 볼 수 있었다.
다시 GraphQL 선언부로 돌아가서 graphql_jwt.ObtainJSONWebToken 클래스를 상속받아 위와 같은 클래스를 만들었다. mutate()를 Override 해서 super().mutate() 로 실제 뮤테이션 코드를 실행시키고 그 다음에 로깅 로직을 실행시킨다.
그리고 다시 graphene의 선언부를 아래와 같이 수정하면 된다.
별거 아니지만 그동안 이 생각을 못했기 때문에 기록해두려고 블로그에 글을 쓰게 됐다.
'Codes' 카테고리의 다른 글
How to connect to MySQL running in Docker (0) | 2021.02.19 |
---|---|
웹페이지 로딩 느릴때 팁 (0) | 2018.08.30 |
블록체인 기술에서 궁금한 것 (0) | 2018.05.11 |
HTML form tag enctype (0) | 2018.04.03 |
20180329 응용 프로그래밍시간 은행 클래스 제작 (0) | 2018.03.29 |