TIL(Today I Learned)

4월 21일 TIL - 커스터마이징,,,

Hyerin P. 2023. 4. 21. 22:40

▷ 오늘의 일정

09:10 ~ 10:00 코딩테스트 문제풀기 with 페어
10:00 ~ 11:00 토큰, 세션 활용 특강
11:00 ~ 12:00 알고리즘에 대하여... 
12:00 ~ 13:00 점 심 식 사
13:00 ~ 18:00 장고 심화 강의 듣기
18:00 ~ 19:00 저 녁 식 사
19:00 ~ 21:00 알고리즘 문제 풀기 및 TIL

 

▷ 오늘의 배움

  • permission_classes = [permissions.설정] : 사용자가 어디까지 서비스를 이용할 수 있는지에 대한 권한 설정/permissions 임포트해주기!
  • JavaScript Object와 JSON의 차이
    • JavaScript Object는 데이터 구조이고 JSON은 객체의 내용을 기술하기 위한 text파일이다.(JSON은 파일이므로 확장자명이 .json인 파일이 존재한다.) 그러니까 JSON이 우리가 읽을 수 있는 형태로 만들어준다는건가?!
    • HTTP로 통신할 때, JS Object가 아닌 JSON으로 서버와 클라이언트가 데이터를 주고 받는다.
    • 그러기 위해 프론트엔드에서 서로 변환해주는 게 필요하다.
      • JSON.stringify(): JS Objec를 JSON으로 바꿔준다. 예) 백엔드에 JSON 양식으로 데이터를 보낼 때 사용
      • JSON.parse(): JSON 문자열을 분석하여 JS Object를 생성한다. 예) 프론트엔드에서 JSON 데이터를 가공하기 위해 사용
  • JSON 데이터는 꼭 "큰따옴표"

 

▷ 오늘의 시도

 

오늘 강의에서 토큰을 커스터마이징하는 법을 배웠다. jwt 공식문서에 설명된 대로 따라해 보았다. 하지만 강의 내용에 있던 공식문서랑 내용이 달라 1차 당황. 그래도 따라해보자 해서 따라했는데 안되서 2차당황.. 

# 공식문서에서 알려준 코드
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
from rest_framework_simplejwt.views import TokenObtainPairView

class MyTokenObtainPairSerializer(TokenObtainPairSerializer):
    @classmethod
    def get_token(cls, user):
        token = super().get_token(user)

        # Add custom claims
        token['name'] = user.name
        # ...

        return token
        
# settings.py에 추가하라고 알려준 코드
SIMPLE_JWT = {
  # It will work instead of the default serializer(TokenObtainPairSerializer).
  "TOKEN_OBTAIN_SERIALIZER": "rest_framework_simplejwt.serializers.MyTokenObtainPairSerializer",
  # ...
}

처음에 그대로 냅다 views.py에 넣고 sttings.py에 넣었다. 그러고 작동해봤는데 settings에 추가된 코드가 임포트가 안되어있다고 했다. 클래스명을 바꿔서 안되는건가 싶었다. 그래서 클래스명을 바꿔줬다. 역시나 안됐다. 그래서 오잉 urls에서 view이름도 바꿔줘야하는건가 싶었다. 역시나 안됐다. 그래서 원상태로 복구한 후 TokenObtainPairView를 뜯어봤다.

class TokenObtainPairView(TokenViewBase):
    """
    Takes a set of user credentials and returns an access and refresh JSON web
    token pair to prove the authentication of those credentials.
    """

    _serializer_class = api_settings.TOKEN_OBTAIN_SERIALIZER #어라 이것은!


token_obtain_pair = TokenObtainPairView.as_view()

뜯어보니 settings에서 설정한 이름이 있었다. 오호라 그래서 다시금 생각해보니까. 내가 커스텀한 시리얼라이즈가 읽히도록 해야하는데 이름만 바꾸니 안될수밖에... 그래서 시리얼라이즈가 있는 경로대로 users.serializer.CustomTokenObtainPairSerializer를 입력해주었다. 초반에 이렇게 입력했던것 같은데 안됐던것 같은데..   아무튼 경로를 잘 입력하니 정상작동하였다. 공식문서는 친절하다 다만 내가 제대로 따라하지 못했을 뿐...

.

.

.

다시 확인해보니까 email이 안 들어가 있다. 왜지...왜지? 다른 캠퍼분께 여쭈어보았더니 문제점을 발견해 주셨다.

# 장고 프로젝트 settings.py

SIMPLE_JWT = {
    "TOKEN_OBTAIN_SERIALIZER": "users.serializer.CustomTokenObtainPairSerializer",

}

SIMPLE_JWT = {
    "ACCESS_TOKEN_LIFETIME": timedelta(minutes=720),
    "REFRESH_TOKEN_LIFETIME": timedelta(days=1),
    "ROTATE_REFRESH_TOKENS": False,
    "BLACKLIST_AFTER_ROTATION": False,
    "UPDATE_LAST_LOGIN": False,

    "ALGORITHM": "HS256",
    "SIGNING_KEY": SECRET_KEY,
    "VERIFYING_KEY": "",
    "AUDIENCE": None,
    "ISSUER": None,
    "JSON_ENCODER": None,
    "JWK_URL": None,
    "LEEWAY": 0,

    "AUTH_HEADER_TYPES": ("Bearer",),
    "AUTH_HEADER_NAME": "HTTP_AUTHORIZATION",
    "USER_ID_FIELD": "id",
    "USER_ID_CLAIM": "user_id",
    "USER_AUTHENTICATION_RULE": "rest_framework_simplejwt.authentication.default_user_authentication_rule",

    "AUTH_TOKEN_CLASSES": ("rest_framework_simplejwt.tokens.AccessToken",),
    "TOKEN_TYPE_CLAIM": "token_type",
    "TOKEN_USER_CLASS": "rest_framework_simplejwt.models.TokenUser",

    "JTI_CLAIM": "jti",

    "SLIDING_TOKEN_REFRESH_EXP_CLAIM": "refresh_exp",
    "SLIDING_TOKEN_LIFETIME": timedelta(minutes=5),
    "SLIDING_TOKEN_REFRESH_LIFETIME": timedelta(days=1),

    "TOKEN_OBTAIN_SERIALIZER": "users.serializer.CustomTokenObtainPairSerializer",
    "TOKEN_REFRESH_SERIALIZER": "rest_framework_simplejwt.serializers.TokenRefreshSerializer",
    "TOKEN_VERIFY_SERIALIZER": "rest_framework_simplejwt.serializers.TokenVerifySerializer",
    "TOKEN_BLACKLIST_SERIALIZER": "rest_framework_simplejwt.serializers.TokenBlacklistSerializer",
    "SLIDING_TOKEN_OBTAIN_SERIALIZER": "rest_framework_simplejwt.serializers.TokenObtainSlidingSerializer",
    "SLIDING_TOKEN_REFRESH_SERIALIZER": "rest_framework_simplejwt.serializers.TokenRefreshSlidingSerializer",
}

settings.py에 가면 자 설정값이 똑같은게 두개가 있다. 두개가! 나는 그것도 발견 못하고 다른데만 주구장창 엄한데만 뜯어보고 있었다. 위에서 먼저 선언을 해줬는데 바로 밑에서 또 다른 선언을 하니 덮어씌여진것이었다. 그래서 위에걸 지우고 밑에서 수정을 해주니 아주 잘 돌아갔다~~ 바보같았따~~ 제발 넓게 보자 넓게 등잔밑이 어둡다고 잘 보자 제발...😭

 

 

▷ 오늘의 한줄

⭐️새로운 목표⭐️

하루에 한강씩 알고리즘 수업듣기! 째끔째금이라도 듣자

하루에 적어도 4~5문제 풀고 최대한 한단계씩 격파하자!

 

!공부하는법!

문제를 일단 봐. 생각하다 보면 검색해봐. 그리고 푸는 방법을 쓱 본다음 한번 해봐. 그리고 된다면 정리해보자! 문제를 보고 푼 경우, 푸는 방법만 보고 푼 경우, 코드를 보고 푼 경우(주석을 해놓는다.) 어쨌든 블로그에 정리를 한번 해보면 이해를 할 수 밖에 없다.