Django Rest API + JWT

15999 단어 장고JWT
Django Rest API에서 JWT를 사용하여 인증을 구현하는 방법을 살펴 보았습니다.

Django Rest API의 JWT 정보



JWT 인증은 다음과 같습니다. 클라이언트 측이 로그인 요구 (username, password)를 발행했을 때, 그 (username, password)가 올바른 것을 판정해 토큰 (JWT)을 돌려준다. 클라이언트는 수신 한 토큰 (JWT)을 localstorage에 저장하고 새로운 요청을 보낼 때 헤더에 해당 토크 (JWT)를 붙여 보냅니다. 서버는 토큰 (JWT)에서 사용자 정보를 검색하고 요청을 처리합니다. JWT 특유의 처리는 오로지 서버측(Django)에서 행해집니다. ==> 과거 기사 참고 : Phoenix1.3+Guardian1.0에서 JWT -Qiita

다음 장고 패키지를 사용합니다.
  • django-rest-auth : API ENDPOINT
  • django-rest-framework-jwt : JWT
  • django-allauth : user 등록

  • djangorestframework_simplejwt라고 하는 것도 있지만, django-rest-auth가 서포트하고 있는 것은 django-rest-framework-jwt 뿐이므로, 이쪽을 선택한다. ==> django-rest-auth

    덧붙여서, 클라이언트로부터 요구시에 설정하는 헤더는, 양자로 조금 다르기 때문에 주의가 필요합니다.

    django-rest-framework-jwt 헤더
    $ curl -H "Authorization: JWT <your_token>" http://localhost:8000/protected-url/
    

    djangorestframework_simplejwt의 헤더
    $ curl -H "Authorization: Bearer <your_token>" http://localhost:8000/protected-url/
    

    데모 설치



    django-rest-auth 공식 사이트의 Demo를 지침에 따라 설치합니다.

    데모 프로젝트 - django-rest-auth

    이 데모는 django-rest-framework가 표준으로 가지고 있는 토큰 인증을 사용하고 있으며 JWT를 지원하지 않습니다. 우선 Demo가 정상적으로 동작하는 것을 확인하고 나서 JWT에 대응합니다.
    cd /tmp
    git clone https://github.com/Tivix/django-rest-auth.git
    cd django-rest-auth/demo/
    pip install -r requirements.pip
    python manage.py migrate --settings=demo.settings --noinput
    

    내 환경은 장고가 원격 서버에 구축되어 있기 때문에 서버의 도메인 이름을 입력하여 액세스를 허용합니다.

    blog_project/settings.py
    ---
    ALLOWED_HOSTS = ["www.mypress.jp"]
    ---
    

    여기까지 Demo 환경이 갖추어졌으므로, 기동해 확인해 봅니다.
    python manage.py runserver 0:8080 --settings=demo.settings
    

    이제 정상적으로 작동하는 것을 확인할 수있었습니다.

    이하, JWT에 대응해 갑니다.

    먼저 JWT 패키지를 설치합니다.
    pip install djangorestframework-jwt
    

    그런 다음 설정을 JWT용으로 변경합니다.
    다음 두 곳(#new)을 추가합니다. 이것으로 JWT 대응이 되어 있을 것입니다.

    demo/settings.py
    ALLOWED_HOSTS = ["www.mypress.jp"]
    
    # Application definition
    
    INSTALLED_APPS = (
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'django.contrib.sites',
    
        'rest_framework',
        'rest_framework.authtoken',
        'rest_auth',
    
        'allauth',
        'allauth.account',
        'rest_auth.registration',
    #    'allauth.socialaccount',
    #    'allauth.socialaccount.providers.facebook',
    #    'rest_framework_swagger',
    )
    
    
    REST_USE_JWT = True # new
    
    REST_SESSION_LOGIN = True
    EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
    SITE_ID = 1
    ACCOUNT_EMAIL_REQUIRED = False
    ACCOUNT_AUTHENTICATION_METHOD = 'username'
    ACCOUNT_EMAIL_VERIFICATION = 'optional'
    
    REST_FRAMEWORK = {
        'DEFAULT_AUTHENTICATION_CLASSES': (
            'rest_framework.authentication.SessionAuthentication',
    #        'rest_framework.authentication.TokenAuthentication',
            'rest_framework_jwt.authentication.JSONWebTokenAuthentication', # new
        )
    }
    

    서버를 시작합니다.
    python manage.py runserver 0:8080 --settings=demo.settings
    

    실행 결과



    계정 주변 메뉴


    사용자 등록, 응답으로 JWT가 반환됩니다.


    로그인, 성공시 응답으로 JWT가 반환됩니다.


    비밀번호 변경, 로그인 시 JWT를 입력합니다.


    세세한 곳의 조정이 필요할까 생각합니다만, 큰 프레임은 일단, 올바르게 동작하고 있는 것 같습니다.

    urls. py



    urls.py는 수정하지 않았지만 일단 게시합니다.

    demo/urls.py
    from django.conf.urls import include, url
    from django.contrib import admin
    from django.views.generic import TemplateView, RedirectView
    
    from rest_framework_swagger.views import get_swagger_view
    
    urlpatterns = [
        url(r'^$', TemplateView.as_view(template_name="home.html"), name='home'),
        url(r'^signup/$', TemplateView.as_view(template_name="signup.html"),
            name='signup'),
        url(r'^email-verification/$',
            TemplateView.as_view(template_name="email_verification.html"),
            name='email-verification'),
        url(r'^login/$', TemplateView.as_view(template_name="login.html"),
            name='login'),
        url(r'^logout/$', TemplateView.as_view(template_name="logout.html"),
            name='logout'),
        url(r'^password-reset/$',
            TemplateView.as_view(template_name="password_reset.html"),
            name='password-reset'),
        url(r'^password-reset/confirm/$',
            TemplateView.as_view(template_name="password_reset_confirm.html"),
            name='password-reset-confirm'),
    
        url(r'^user-details/$',
            TemplateView.as_view(template_name="user_details.html"),
            name='user-details'),
        url(r'^password-change/$',
            TemplateView.as_view(template_name="password_change.html"),
            name='password-change'),
    
    
        # this url is used to generate email content
        url(r'^password-reset/confirm/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$',
            TemplateView.as_view(template_name="password_reset_confirm.html"),
            name='password_reset_confirm'),
    
        url(r'^rest-auth/', include('rest_auth.urls')),
        url(r'^rest-auth/registration/', include('rest_auth.registration.urls')),
        url(r'^account/', include('allauth.urls')),
        url(r'^admin/', admin.site.urls),
        url(r'^accounts/profile/$', RedirectView.as_view(url='/', permanent=True), name='profile-redirect'),
        url(r'^docs/$', get_swagger_view(title='API Docs'), name='api_docs')
    ]
    

    이번은 이상입니다.

    참고 사이트

    Welcome to django-rest-auth’s documentation!

    폭속으로 만들 수 있는 Django 유저 인증 기능【django-allauth】

    How to Use JWT Authentication with Django REST Framework

    Simple JWT - A JSON Web Token authentication plugin for the Django REST Framework.

    좋은 웹페이지 즐겨찾기