くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

Django+REST+JWTでWebAPIを簡単認証

Django REST Frameworkを使って、WebAPIの認証をJWTにしたとき備忘録。

インストール

$ pip install django djangorestframework djangorestframework-jwt

全体の設定

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'
}

トークンの払い出しの設定

urls.pyにobtain_jwt_tokenのパスを追加

from rest_framework_jwt.views import obtain_jwt_token

urlpatterns = [
  path('jwt-token', obtain_jwt_token),
]
$ curl -i -s "http://localhost:8000/jwt-token"

トークンを使った認証の設定

viewにpermission_classesを設定すればOK

from rest_framework.generics import GenericAPIView
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework import status

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

    def get(self, request, format=None):
        return Response(data={'username': request.user.username}, status=status.HTTP_200_OK)
from rest_framework_jwt.views import obtain_jwt_token
from .views import AuthViewSet

urlpatterns = [
  path('jwt-token', obtain_jwt_token),
  path('auth', AuthViewSet.as_view()),
]
$ curl -i -s -H "Authorization: JWT <Token>" "http://localhost:8000/auth"

手動でトークンを生成する

from rest_framework_jwt.settings import api_settings

jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER

payload = jwt_payload_handler(user)
token = jwt_encode_handler(payload)

Apacheへのデプロイ時の注意

Authorizationヘッダを利用する場合、WSGIに追加の設定が必要!

#jwt_auth_enable
WSGIPassAuthorization On #←ここの一行を加える!

参考にしたサイト様