【Django REST Framework】JWTを使った「ユーザー認証機能」を作る。

Django REST Frameworkを使ったAPIを作る中で、ユーザーの新規追加ユーザー権限ごとのアクセス制限設定などをするために必要な「ユーザー認証機能」を作っていきたいと思います。

今回は、「JWT」を使ったユーザー認証機能を作る方法をメモしていきます。

大まかな作業の流れ

  1. 必要なライブラリをインストールする
  2. settings.pyを編集する
  3. serializers.pyに「UserSerializerクラス」を追加する
  4. views.pyに「CreateUserViewクラス」を追加する
  5. urls.pyを編集する
  6. 操作に認証制限をかける

必要なライブラリをインストール

$ pip install django-cors-headers
$ pip install djangorestframework-simplejwt
$ pip install djoser

settingsの編集

from datetime import timedelta


INSTALLED_APPS = [
    ...,
    'corsheaders',  # 追加
    'djoser',  # 追加
]

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',  # 追加
    ...
]

# 追加
CORS_ORIGIN_WHITELIST = [
	"http://localhost:8000",
]

# 追加
SIMPLE_JWT = {
	'AUTH_HEADER_TYPES': ('JWT',),
	'ACCESS_TOKEN_LIFETIME': timedelta(minutes=60),  # アクセストークンの賞味期限
}

# 追加
REST_FRAMEWORK = {
	'DEFAULT_PERMISSION_CLASSES': [
		'rest_framework.permissions.IsAuthenticated',  # デフォルトのアクセス制限
	],
	'DEFAULT_AUTHENTICATION_CLASSES': [
		'rest_framework_simplejwt.authentication.JWTAuthentication',  # 認証に「JWT」を利用する設定
	],
}

serializers.pyに「UserSerializerクラス」

from rest_framework import serializers
from django.contrib.auth.models import User


class UserSerializer(serializers.ModelSerializer):

    Meta:
        model = User
        fields = ('id', 'username', 'password')
        extra_kwargs = {'password': {'write_only': True, 'required': True}}

    def create(self, validated_data):
        user = User.objects.create_user(**validated_data)
        return user

views.pyに「CreateUserViewクラス」

from rest_framework import generics
from .serializers import UserSerializer
from rest_framework.permissions import AllowAny


class CreateUserView(generics.CreateAPIView):
    serializer_class = UserSerializer
    permission_classes = (AllowAny,)

urls.pyを編集する

from api.views import CreateUserView


urlpatterns = [
    ...,
    path('register/', CreateUserView.as_view(), name='register'),  # 追加
    path('auth/', include('djoser.urls.jwt')),  # 追加
]

viewにアクセス制限を設定する

class PostListView(generics.ListAPIView):
    queryset = Post.objects.all()
    serializer_class = PostSerializer
    permission_classes = (AllowAny,)  # 誰でもアクセス可能

アクセス制限のある操作を利用する方法

  1. 登録ユーザーのアクセストークンを発行する
  2. アクセストークンを使ってAPIのリクエストをする

ユーザーのアクセストークンを発行する

/auth/jwt/create」にusernameとpasswordをPOSTすると、アクセストークンリフレッシュトークンが返ってきます。

アクセストークンを使ってAPIのリクエストをする

APIのリクエストヘッダに「Authorization: JWT_[発行したアクセストークン]」を入れてリクエストすると、このアクセストークンで認証をしてくれて通れば利用できる。

コメントを残す

*