현제의 현재이야기

[OSOD] 비밀번호 변경 및 리셋 관련 본문

DRF/OSOD

[OSOD] 비밀번호 변경 및 리셋 관련

현재의 현제 2023. 2. 16. 12:05
    def __init__(self, *args, **kwargs):
        self.old_password_field_enabled = getattr(
            settings, 'OLD_PASSWORD_FIELD_ENABLED', True,
        )
        self.logout_on_password_change = getattr(
            settings, 'LOGOUT_ON_PASSWORD_CHANGE', True,
        )
        super().__init__(*args, **kwargs)

        if not self.old_password_field_enabled:
            self.fields.pop('old_password')
            
        self.request = self.context.get('request')
        self.user = getattr(self.request, 'user', None)
  • 왜 인지 모르게 dj-rest-auth의 비밀번호 변경은 new_password1, new_password2 밖에 있지 않았고, old_password를 확인하는 것이 있지 않았다.
  • 그래서 CustomPasswordChangeSerializer를 오버라이딩 하였다.
  • 저기 OLD_PASSWORD_FILED 있는 곳을 True로 바꿔주었더니 정상적으로 나왔다.
  • 이제 어느정도 파일 뜯어가면서 오버라이딩 하는데에 익숙해지기 시작했다.
class CustomPasswordResetView(PasswordResetView):
    serializer_class = CustomPasswordResetSerializer

    def post(self, request, *args, **kwargs):
        data = request.data.copy()
        data["email"] = request.user.email
        #return JsonResponse({"dd": f"{data}"})
        serializer = self.get_serializer(data=data)
        serializer.is_valid(raise_exception=True)
        serializer.save()
        
        # Return the success message with OK HTTP status
        return Response(
            {'detail': ('Password reset e-mail has been sent.')},
            status=status.HTTP_200_OK,
        )
    
class CustomPasswordResetConfirmView(PasswordResetConfirmView):

    def post(self, request, *args, **kwargs):
        data = request.data.copy()
        data["uid"] = self.kwargs.get("uid")
        data["token"] = self.kwargs.get("token")
        serializer = self.get_serializer(data=data)
        serializer.is_valid(raise_exception=True)
        serializer.save()
        return Response(
            {'detail': ('Password has been reset with the new password.')},
        )
  • 다음은 비밀번호 reset관련하여 오버리이딩을 하였다. 비밀번호 리셋을 할 때, 새로운 이메일을 받으면 처음에 이메일 인증 받은게 무슨 의미가 있겠는가. + 보안상의 이슈도 있을 것 같아서 비밀번호 초기화 클릭시 지금 로그인 되어있는 user의 이메일로 전송되도록 오버라이딩 하였다.
  • serializer를 수정하는 것은 더욱 어려웠기에 request.data에서 email 부분만 현재 user email로 변경해주고 싶었다. request.data는 immutable하다는 오류가 발생해서 복사를 하였는데, 이것조차 오류가 나서 확실한 복사은 .copy()를 사용하여서 email 부분만 변경한 뒤, 저장하였다.
  • 이메일 전송후 url을 클릭하여도 url에 있던 uid와 token이 제대로 들어가지 않았다. 따라서 이것도 url에 있던 uid 와 token을 복사한 request.data에 넣은 뒤, serialzier에 보내주었다.

기록하는 습관을 가지자! 

'DRF > OSOD' 카테고리의 다른 글

[OSOD] Timezone과 연속 학습  (0) 2023.02.19
[OSOD] 구독 이메일 관련  (0) 2023.02.19
[OSOD] SerializerMethodField()에 대하여  (0) 2023.02.13
[OSOD] Nested Serializer 및 views.py 작성  (0) 2023.02.04
[OSOD] 회원가입 인증 이메일  (0) 2023.01.29
Comments