-
[Django] 인증 Authentication파이썬/Django 2023. 1. 23. 15:32728x90반응형
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을 통해 확인해보기
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'파이썬 > Django' 카테고리의 다른 글
[Django] Swagger를 통한 API 문서 작성하기 with. Django (1) 2023.01.29 [Django] API test | API 잘 작동하는지 테스트하기 (0) 2023.01.23 [Django] user api (get, put) 만들기 (0) 2023.01.17 [Django] Permission_classes 사용하여 인증하기 (feat.DRF) (0) 2023.01.16 [Django] APIView로 api 만들기 (0) 2023.01.13