선발대

[원티드] 3주차 수요일 / dj-rest-auth 에러 수정 본문

원티드/활동 내용

[원티드] 3주차 수요일 / dj-rest-auth 에러 수정

신선한 스타트 2022. 7. 14. 01:00

오늘 새벽 2시까지 팀장님과 함께 에러를 수정하며 결국 dj-rest-auth를 알맞게 커스텀하였다.

엄청난 대장정이었다. dj-rest-auth 깃허브에 들어가서 파일 하나씩 다 뜯어보고 하나씩 우리 모델에 맞게 수정해봤다.

결국 로그인 시리얼라이저 커스텀하고 나머지 기능은 그대로 사용하는 방식으로 간단히 끝낼 수 있었다.

결과물이 탄생한 과정은 아래와 같다.

 

이전에 우리 팀 유저 모델에서 유저 pk를 id(uuid 형태)로, 유저 아이디를 user_id로 작명했었다.

그런데 dj-rest-auth에서 로그인을 하면 user라는 변수가 정의되는데

여기에서 계속 user_id와 uuid 형태의 id가 서로 데이터 타입이 맞지 않는다며(당연함) 에러가 발생했다.

 

발생했던 에러 (https://ndb796.tistory.com/283)

 

한참 동안 팀장님과 이것저것 시도해보다가 너무 안 풀려서 라이브러리 사용 포기 직전까지 갔었다.

그러다가 혹시 user 변수명이 서로 비슷해서 그런가 싶어서 user_idaccount로 변경했더니 바로 해결되었다.

와우! 포스트맨에서 결과가 딱 나오자 퇴근할 수 있다는 생각에 갑자기 정신이 맑아졌다.

어쨌든 푸시는 아침에 하기로 하고 자러 갔다.

 


자고 일어나서 다시 아침 9시부터 작업을 이어서 진행했고, 무사히 기능 구현이 끝나서 PR 했다.

회원가입을 담당하신 팀원 분의 코드와 병합 순서를 맞추고 내 브랜치도 잘 병합되었다.

 

develop에서 새롭게 pull 받고 다시 개인 브랜치에 rebase 한 뒤 runserver를 돌렸는데 갑자기 에러가 생겼다.

알고 보니 rebase 과정 중에서 로그인 시리얼라이저에 data['user']=user 이라는 한 줄이 누락되어서 생긴 에러였다.


다시 PR을 보낸 뒤에 테스트 코드를 작성했다. 그러다 오후에 팀장님이 코드 작성 중 로그인 에러가 발생했다는 소식을 들고 오셨다.

(우리 팀은 팀 디스코드를 따로 개설하고 각각의 음성채널에서 작업한다.)

 

request.user로 현재 로그인한 유저를 호출할 때,

각각 다른 계정으로 로그인했음에도 최종 로그인된 유저가 호출되는 에러였다.

 

예를 들어 1번 유저가 로그인 한 뒤 곧바로 2번 유저가 로그인을 했다면

최종 로그인한 유저는 2번이므로 1번 유저 환경에서도 2번 유저가 request.user로 나타난다.

일단 임시로 views.py를 생성해서 request.user를 출력해봤다.

from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.views import APIView


class tokencheck(APIView):

    permission_classes = [IsAuthenticated]

    def get(self, request):
        print(request.user.id)
        return Response({"data": request.user.id})

 

우여곡절 끝에 알고 보니 내가 settings.py에서 인증 방식에 세션JWT 두 개의 옵션 다 넣어뒀던 것이었다.

아마 옵션 설정할 때 기본값도 같이 포함시켰던 모양이다. 작은 설정 옵션에서 나온 에러였다. (그래도 이전까지 한참 고민함)

내 화면공유를 보며 이것저것 해결책을 알려주신 팀장님께도 감사했다.

# 잘 작동하는 코드
REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.AllowAny',
    ],
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_simplejwt.authentication.JWTAuthentication',
        'dj_rest_auth.jwt_auth.JWTCookieAuthentication',
    ),
}

# 아래의 옵션이 위의 DEFAULT_AUTHENTICATION_CLASSES에 들어가 있었다.
# 'rest_framework.authentication.SessionAuthentication',

기능 구현은 끝났고 오후에 로그인, 로그아웃 테스트 코드 작성도 마무리해서 PR 요청했다. 

내일 오전에는 리뷰 대응 끝내고 마무리할 수 있을 것 같다. 이번 프로젝트도 거의 끝나간다.

Comments