한글로 된 예제를 찾기 어려웠는데, 가뭄에 단비 같은 한 개의 글이 발견!
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