어제 파이썬을 도입 한 도 아마추어가 장고에서 jwt 토큰 인증을 구현할 수 있는지 시도했습니다.

참고로 한 사이트



장고에서 JWT를 사용한 토큰 인증 구현

이번에 만든 것은 여기에 저장됩니다.



gaku3601/jwt_django

조속히 해라.



djangorestframework-jwt되는 것이 필요한 것 같기 때문에 넣어 둔다.

명령
$ pip install djangorestframework-jwt

프로젝트 만들기

명령
$ django-admin startproject jwtapp .

djangorestframework-jwt를 이용하기 위해서는 설정을 바꾸지 않으면 안되는 것 같기 때문에, 이하를 최하부에 추기한다.
[jwtapp/settings.py]
REST_FRAMEWORK = { 
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),  
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
    ),  
    'NON_FIELD_ERRORS_KEY': 'detail',
    'TEST_REQUEST_DEFAULT_FORMAT': 'json'
}

다음은 라우팅 설정
[jwtapp/urls.py]
from django.contrib import admin
from django.urls import path
from rest_framework_jwt.views import obtain_jwt_token # 追記

urlpatterns = [
    path('admin/', admin.site.urls),
    path('jwt-token/', obtain_jwt_token), # 追記
]

이것으로 움직이는 것 같지만, 매번이면서 "migrate 해라!"라고 화내므로, migrate 해 기동한다.

명령
$ python manage.py migrate
$ python manage.py runserver
Performing system checks...

System check identified no issues (0 silenced).
February 19, 2019 - 23:26:17
Django version 2.1.7, using settings 'jwtapp.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

🎉error없이 움직였다(´・ω・`)b🎉

superuser를 만들어 토큰이 반환되는지 확인해 봅니다.

명령
$ python manage.py createsuperuser
Username (leave blank to use 'gaku'):
Email address: [email protected]
Password:
Password (again):
Superuser created successfully.

시작하고 curl 명령을 치고 token이 반환되는지 확인합니다.

명령
$ python manage.py runserver
...別のターミナルで。。。
$ curl http://localhost:8000/jwt-token/ -d "username=gaku&password=**************"
{"token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VybmFtZSI6Imdha3UiLCJleHAiOjE1NTA2MTk0MzQsImVtYWlsIjoicHJvLmdha3VAZ21haWwuY29tIn0.IBspHS2srFvwRPSBitosjfuIlGfrVFw1gJPXGeO_bEo"}

🎉token이 돌아왔다 yぉ오오오! 🎉
token의 내용을 본다
jwt. 이오

후무(´・ω・`)

치♡나♡미♡에♪

명령
$ curl http://localhost:8000/jwt-token/ -d "username=gaku&password=*******wrong password*******"
{"detail":["Unable to log in with provided credentials."]}

잘못된 password를 보내면 화가납니다.

인증된 API를 작성해 봅니다.



발행한 jwt를 부여하지 않으면 이용할 수 없는 API를 써 보자.

rest_framework를 넣지 않은 경우 다음 명령으로 넣습니다.

명령
$ pip install djangorestframework

views.py를 만들고 다음과 같이 편집
[jwtapp/views.py]
from rest_framework.generics import GenericAPIView
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework import status

class PingViewSet(GenericAPIView):
    permission_classes = (IsAuthenticated,)

    def get(self, request, format=None):
        return Response(data={'username': request.user.username}, status=status.HTTP_200_OK)

만든 views를 라우팅으로 지정할 수 있도록 urls.py 수정
from django.contrib import admin
from django.urls import path
from rest_framework_jwt.views import obtain_jwt_token
from . import views  #追記

urlpatterns = [
    path('admin/', admin.site.urls),
    path('jwt-token/', obtain_jwt_token),
    path('ping', views.PingViewSet.as_view()), # 追記
]

좋아! 시작하고 확인해보기

명령
$ python manage.py runserver
...別ターミナルで...
$ curl http://localhost:8000/ping  -H "Authorization: JWT eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VybmFtZSI6Imdha3UiLCJleHAiOjE1NTA2MjA2MzYsImVtYWlsIjoicHJvLmdha3VAZ21haWwuY29tIn0.xdEPAe9LvzZVuP1DBHeb8pfWOOiPTmX4K76tHNf15bg"
{"username":"gaku"}

🎉 돌아왔다 아(´・ω・`)🎉
그건 그렇고, 토큰없이 액세스하면

명령
$ curl http://localhost:8000/ping
{"detail":"Authentication credentials were not provided."}

그리고 화가납니다.



일단 움직였다.
하지만, AUTHENTICATION AND AUTHORIZATION의 user로 jwt token을 발행하는 형태가 되어 있는데 어디 어떤 것일까?
basic 인증이라면 순살로 jwt token을 발행할 수 있는 것을 알았으므로, 앞으로는 OpenID등의 인증도 찾아가고 싶다(´・ω・`)

좋은 웹페이지 즐겨찾기