ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Django] 인증 Authentication
    파이썬/Django 2023. 1. 23. 15:32
    728x90
    반응형

    django 에서 사용자 인증하는 방법은 크게 네가지가 있다.

    "rest_framework.authentication.SessionAuthentication", # 현재 로그인 한 유저가 누구인지 알려주는 코드(쿠키랑 비밀번호를 이용하는 세선 인증)
    "config.authentication.TrustMeBroAuthentication",
    "rest_framework.authentication.TokenAuthentication", # 토큰을 이용해 user가 누군지 찾음
    "config.authentication.JWTAuthentication",

     

    1. BasicAuthentication - 권장하지 않음

     header를 이용한 그냥 모달창임 

    2. Auth Token - TokenAuthentication

    토큰을 디비에 저장함

    3. JWT - JSON Web Token

    얘는 디비 공간 차지 안함

     

     

    2. Auth Token - TokenAuthentication

    config/settings.py 파일의 서드파티앱에 "rest_framework.authtoken" 을 추가해준다

    THIRD_PARTY_APPS = [
        "rest_framework",
        "rest_framework.authtoken",
    ]

     

    그리고 동일 파일 내 rest_framework의 default_authentication_classes 리스트에 TfokenAuthentication을 추가한다.

    REST_FRAMEWORK = {
        
        # rest framwork가 user를 찾는 방법이 들어있는 list
        "DEFAULT_AUTHENTICATION_CLASSES": [
            "rest_framework.authentication.SessionAuthentication", # 현재 로그인 한 유저가 누구인지 알려주는 코드
            "config.authentication.TrustMeBroAuthentication",
            "rest_framework.authentication.TokenAuthentication", # 토큰을 이용해 user가 누군지 찾음
        ]
    }

     

    obtain_auth_token을 import하고 사용해준다.

    📁 users/urls.py

    from django.urls import path
    from rest_framework.authtoken.views import obtain_auth_token
    from . import views
    
    urlpatterns = [
        path("", views.Users.as_view()),
        path("me", views.Me.as_view()),
        path("change-password", views.ChangePassword.as_view()),
        path("log-in", views.LogIn.as_view()),
        path("log-out", views.LogOut.as_view()),
        path("token-login", obtain_auth_token), # username과 password를 보내면 토큰을 반환해주는 view
        path("@<str:username>", views.PublicUser.as_view()),
    ]

     

    토큰 받아오기

    postman

    postman을 통해 확인해보기

    username과 password를 넘기면 토큰을 받아올 수 있다.

    url은 api/v1/users/token-login, body raw로 설정하고(form-data도 가능) JSON으로 정해준 뒤 POST request를 보내면 token값을 받을 수 있다.

     

     

    토큰으로 유저 정보 받아오기

    url : api/v1/users/me

    Headers에 KEY Authorization VALUE Token [토큰값] 입력하기

     

     

    3. JWT

    jwt encoding - 암호화

    class JWTLogIn(APIView):
        def post(self, request):
            username = request.data.get("username")
            password = request.data.get("password")
            # username과 password 확인 후 올바른 정보면 토큰을 발행한다 
            if not username or not password:
                raise ParseError
            user = authenticate( # username과 password가 올바르면 그에 해당하는 user를 줌
                request,
                username=username,
                password=password,
            )
            if user:
                token = jwt.encode(
                    {"pk": user.pk},
                    settings.SECRET_KEY,
                    algorithm="HS256",
                )
                return Response({"token": token})
            else:
                return Response({"error": "wrong password"})

     

    jwt decode - 복호화

     

    📁 config/authentication.py

    class JWTAuthentication(BaseAuthentication):
        def authenticate(self, request):
            token = request.headers.get("Jwt")
            if not token:
                return None
            decoded = jwt.decode(
                token,
                settings.SECRET_KEY,
                algorithms=["HS256"],
            )
            pk = decoded.get("pk")
            if not pk:
                raise AuthenticationFailed("Invalid Token")
            try:
                user = User.objects.get(pk=pk)
                return (user, None)
            except User.DoesNotExist:
                raise AuthenticationFailed("User Not Found")
    LIST
Designed by Tistory.