일기 대신 코드 슬쩍

[백엔드][장고][Django] Chapter #15 본문

Backend/Django

[백엔드][장고][Django] Chapter #15

코코자 2023. 7. 25. 12:45

#15.0 Introduction

  • DRF에서 authentication strategy를 구축하는 법을 배울 것임
  • 토큰 베이스의 인증을 생성해보고, 그 다음 JWT(JSON web token)인증을 만들 것임
  • postman 다운받기

#15.1 Custom Authentication

  • 우리만의 인증 로직 만들기
  • config의 settings 에서 drf 인증의 디폴드 방식을 명시할 것임
REST_FRAMEWORK = {
    "DEFAULT_AUTHENTICATION_CLASSES":[
        "rest_framework.authentication.SessionAuthentication"
        
    ]
}
  • config에서 authentication.py라는 새 파일을 생성
from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed
from users.models import User


class TrustMeBroAuthentication(BaseAuthentication):
    def authenticate(self, request):
        username = request.headers.get("Trust-Me")
        if not username:
            return None
        try:
            user = User.objects.get(username=username)
            return (user, None)
        except User.DoesNotExist:
            raise AuthenticationFailed(f"No user {username}")
  • send버튼 누르면?

  • 로그인 되지 않았다고 뜸
  • 이렇게 입력하고 send하면 body에 이렇게 user에 대해 뜸!
  • 근데 이 방식 구리다.

#15.2 Recap

#15.3 Token Authentication

  • body-raw-JSON → {"username":"jiyea","password":"123"}입력 → Post → send
  • token 발급받을 수 있다(난 왜 안돼?)
  • user에게 토큰을 주고, 그 토큰을 디비에 저장, 우리가 토큰인증을 해놔서 가능함
  • 이것이 token authentication을 하는 규칙(저거 Post 말고 get으로 해야함)
  • 이제 제대로 돌아가면 send를 눌렀을때 내 프로필 정보를 볼 수 있음

#15.4 JWT Encode

  • 토큰은 unique함
  • pyJWT 라이브러리를 이용해 JSON web token 사용할 것임
  • 생성된 토큰을 유저에게 주고 나중에 authentication class를 만들어서 토큰을 복호화 하고 유저를 찾는 방식임
  • path("jwt-login",views.JWTLogIn.as_view()), uls.,py에 추가

#15.5 JWT Decode

  • 토큰을 받기 위한 authentication class를 작성할 것임

  • 인증 방법 세가지 배움
  1. DRF에서 기본으로 제공하는 인증
    • 쿠키와 비밀번호를 이용하는 세션 인증
    • 멋진 function(Ex.login,logout)
  1. 나만의 인증
    • Trustmebroauthentication
  1. JWT

#15.6 Environment Files

  • .env 파일을 어떻게 읽는지 배워볼 것임
  • settings의 SECRETkey를 숨기기 위함
  • 설치해준다
  • poetry add django-environ
  • simpleJWT? 쉽고 좋다. JWT 쓸거면 사용해도 ㄱㅊ