Django Ninja REST Framework 엔진을 사용하면서 인증처리 - JWT

한글로 된 예제를 찾기 어려웠는데, 가뭄에 단비 같은 한 개의 글이 발견!

Django-ninja로 JWT token 발행 해보기
https://goo-eungs.tistory.com/64

 

로그인 할때, JWT 토큰을 발행해 주고 (아래 코드를 참고하시면 된다)

@router.post('/sign-in/')
def signIn(request):
    payload = {
        'id': 2,
        'exp': datetime.datetime.now() + datetime.timedelta(minutes=60),
        'iat': datetime.datetime.now()
    }

    token = jwt.encode(payload, 'secret', algorithm='HS256')
    return {"token": token}

 

HTTP 헤더의 Bearer token 에 발행된 토큰을 넣어줘서 사용하면 될듯,

메인 아이디어는 원본 페이지로 들어가서 보시길, 정말 잘 적어두심

 

인증이 필요한 함수에는 다음과 같이 정의해 두고 사용하면 된다.

https://django-ninja.rest-framework.com/tutorial/authentication/
from ninja.security import HttpBearer


class AuthBearer(HttpBearer):
    def authenticate(self, request, token):
        #if token == "supersecret":
        #    return token
        # 위의 예제처럼 jwt 로 들어오는 함수로 변경했으므로, 아래처럼 decode해서 맞는지 확인한다.
        a = jwt.decode(token, 'secret', algorithms='HS256')
        user = UserModel.objects.filter(id=a['id']).get()
        return user

@api.get("/bearer", auth=AuthBearer())
def bearer(request):
    return {"token": request.auth}

 

JWT 시간이 초과되었으면 아래와 같은 에러가 발생한다.

이것도 잘 처리해야 한다.

  File "D:\twarelab\testx-site\testxapi\api\v1\apis.py", line 60, in authenticate
    a = jwt.decode(token, SECRET_KEY, algorithms="HS256")
  File "D:\twarelab\testx-site\venv\lib\site-packages\jwt\api_jwt.py", line 119, in decode
    decoded = self.decode_complete(jwt, key, algorithms, options, **kwargs)
  File "D:\twarelab\testx-site\venv\lib\site-packages\jwt\api_jwt.py", line 106, in decode_complete
    self._validate_claims(payload, merged_options, **kwargs)
  File "D:\twarelab\testx-site\venv\lib\site-packages\jwt\api_jwt.py", line 142, in _validate_claims
    self._validate_exp(payload, now, leeway)
  File "D:\twarelab\testx-site\venv\lib\site-packages\jwt\api_jwt.py", line 177, in _validate_exp
    raise ExpiredSignatureError("Signature has expired")
jwt.exceptions.ExpiredSignatureError: Signature has expired

 

참고사이트 (또 검색하지 말고 좀 모아두자)

🛹 https://velog.io/@hwang-eunji/backend-django-JWT-%EB%B0%9C%ED%96%89%ED%95%98%EA%B8%B0

 

backend django JWT 발행하기

이번 포스팅은 백엔드에서 어떻게 JWT를 발행하고 확인하는지 알아보겠다. JWT를 알아보기 앞서 인증 & 인가에 대한 내용을 선행 하도록 하자! JWT(json web token)는 회원 로그인이 완료 되었을때 발행

velog.io

🛹 https://velopert.com/2389

 

[JWT] JSON Web Token 소개 및 구조 | VELOPERT.LOG

지난 포스트에서는 토큰 기반 인증 시스템의 기본적인 개념에 대하여 알아보았습니다. 이 포스트를 읽기 전에, 토큰 기반 인증 시스템에 대해서 잘 모르시는 분들은 지난 포스트를 꼭 읽어주세

velopert.com

 

 

자료찾기 힘들다 책 더미에 깔리겠다

Pixabay 님의 사진, 출처: Pexels