티스토리 뷰

File "/back-end/venv/lib/python3.9/site-packages/rest_framework_jwt/serializers.py", line 60, in validate 'token': jwt_encode_handler(payload), File "/back-end/venv/lib/python3.9/site-packages/rest_framework_jwt/utils.py", line 92, in jwt_encode_handler return jwt.encode( AttributeError: 'str' object has no attribute 'decode')

 

에러원인

- simple-jwt 로 인한 기존 jwt 버젼 업그레이드

- 버젼 업그레이드되면서 str 을 또다시 decode(utf-8)로 디코딩하게되어 중복이 발생

 

해결방안

1. 기존 jwt 버젼 1.7.1로 다운그레이드

2. 업데이트된 jwt 버젼 라이브러리 수정

 

2번 방안에 대한 구체적인 해설을 stackoverflow에 팀원이 답변으로 달아두었습니다.

 

 

'str' object has no attribute 'decode' on djangorestframework_simplejwt

I was trying to follow this quick start from djangorestframework-simplejwt documentation with link https://django-rest-framework-simplejwt.readthedocs.io/en/latest/getting_started.html But I have p...

stackoverflow.com

 

2번 방안

# /venv/lib/python3.9/site-packages/rest_framework_jwt/utils.py
def jwt_encode_handler(payload):
    key = api_settings.JWT_PRIVATE_KEY or jwt_get_secret_key(payload)
    return jwt.encode(
        payload,
        key,
        api_settings.JWT_ALGORITHM
    )#.decode('utf-8') ==> delete this

 

추가적인 에러 발생시 이하 코드로 수정합니다.

rest_framework.request.WrappedAttributeError: module 'jwt' has no attribute 'ExpiredSignature'
# /venv/lib/python3.9/site-packages/rest_framework_jwt/authentication.py
        try:
            payload = jwt_decode_handler(jwt_value)
        except jwt.ExpiredSignatureError: # ExpiredSignature => no more exists
            msg = _('Signature has expired.')
            raise exceptions.AuthenticationFailed(msg)
        except jwt.DecodeError:
            msg = _('Error decoding signature.')
            raise exceptions.AuthenticationFailed(msg)
        except jwt.InvalidTokenError:
            raise exceptions.AuthenticationFailed()

 

댓글