概要
プログラミングを経験してきておきながら、実際に自分の力で1からログイン画面を作って認証機能を追加してとかやってきたことがなかったのでこの機会に作ってみたいと思いました
本題
使用する技術領域
- フロントエンド
- React
- バックエンド
- Python
- Django REST Framework
1.1 バックエンドのセットアップ
-
仮想環境の作成とアクティベート
プロジェクトの作業を行うディレクトリを作成して、アクティベート
ここら辺はPythonで開発を行う際には定番のコマンドですね# プロジェクト用のディレクトリを作成 mkdir django_react_auth_project && cd django_react_auth_project # 仮想環境を作成 python3 -m venv venv # 仮想環境をアクティベート source venv/bin/activate
-
パッケージインストール
次に必要なライブラリをインストールします
Djangoと認証のために簡単にJWTを実装できるようにするためのdjangorestframework-simplejwt
をインストールしますpip install django djangorestframework djangorestframework-simplejwt django-cors-headers
-
Djangoプロジェクト作成・アプリ作成
Djangoのプロジェクトとアプリを作成します# Djangoプロジェクトの作成 django-admin startproject mysite . # Djangoアプリの作成 python manage.py startapp app
-
settings.py の設定(ここからの項目はsettings.py関連です)
追加したライブラリをDjangoで使用できるようにするためにsettings.pyを編集しますINSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', # 追加するアプリ 'rest_framework', # DRF本体 'rest_framework_simplejwt', # Simple JWT 'corsheaders', # CORSヘッダー 'app', # 作成したappアプリ ]
MIDDLEWAREの追記も行います(CORSミドルウェアを使えるように)
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'corsheaders.middleware.CorsMiddleware', # これを追加 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ]
Reactと連携した際にReactのアクセスを許可するために、CORSの設定を追記します
(この部分は実際に開発していただいて自身の環境に合わせた値に設定をお願いします)CORS_ALLOWED_ORIGINS = [ "http://localhost:3000", # React開発サーバーのURL "http://127.0.0.1:3000", ]
-
DRFの認証設定 (Simple JWT)
DRFのデフォルト認証クラスとしてSimple JWTを設定REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework_simplejwt.authentication.JWTAuthentication', ), 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated', ) }
また、JWTトークンの有効期限などを設定します
from datetime import timedelta <中略> SIMPLE_JWT = { # アクセストークン(1時間) 'ACCESS_TOKEN_LIFETIME': timedelta(hours=1), # リフレッシュトークン(3日) 'REFRESH_TOKEN_LIFETIME': timedelta(days=1), # 認証タイプ 'AUTH_HEADER_TYPES': ('JWT', ), # 認証トークン 'AUTH_TOKEN_CLASSES': ('rest_framework_simplejwt.tokens.AccessToken', ) }
-
管理者ユーザーの作成
Djangoの管理画面にアクセスするためのスーパーユーザーを作成しておきますpython manage.py makemigrations python manage.py migrate python manage.py createsuperuser
-
開発サーバーの起動
ローカル環境で開発サーバーを起動します
python manage.py runserver
以下のようなことが表示されるので、アクセスすると添付画像のようなページに飛ぶことができます
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
July 05, 2025 - 08:22:53
Django version 5.2.4, using settings 'mysite.settings'
Starting development server at <ここのリンク>
Quit the server with CONTROL-C.
リンクの後ろに/admin
をつけることで管理者用のページに飛ぶこともできます
ログインするには「管理者ユーザーの作成」で作成した認証情報でログインできます
1.2 バックエンドのAPI作成
ここからは実際にやろうとしている認証系のAPIを作成していきます
-
エンドポイントの生成
Djangoでエンドポイントを作成するにはurls.pyをいじります
Djangoアプリのディレクトリ内にurls.pyを作成、エンドポイントを生成しますfrom django.urls import path from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView # 後ほど作成するview from .views import RegisterView, UserDetailView # 後ほど作成するview urlpatterns = [ # JWT認証エンドポイント path('token/', TokenObtainPairView.as_view(), name='token_obtain_pair'), path('token/refresh/', TokenRefreshView.as_view(), name='token_refresh'), # カスタムエンドポイント path('register/', RegisterView.as_view(), name='auth_register'), path('user/', UserDetailView.as_view(), name='user_detail'), ]
また、プロジェクト全体のurls.pyにも修正を加えます
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('api/auth/', include('app.urls')), ]
-
serializersの作成
Django REST Frameworkのserializersというものを作成します
これを使用するとデータとモデルとの間を橋渡してくれます
モデルに合わせたバリデーションを行うように指示できるというイメージですここでは、ユーザーの登録時とレスポンスの返却時のデータの取り扱いについて制限を指定います
RegisterSerializer
ではAPIのレスポンスにパスワードが含まれないように
UserSerializer
では認証されたユーザーの情報をクライアントに返す際のデータを定義していますfrom rest_framework import serializers from django.contrib.auth.models import User class RegisterSerializer(serializers.ModelSerializer): password = serializers.CharField(write_only=True) class Meta: model = User fields = ('username', 'password', 'email') def create(self, validated_data): # ユーザーを作成し、パスワードをハッシュ化して保存する user = User.objects.create_user( username=validated_data['username'], email=validated_data.get('email', ''), password=validated_data['password'] ) return user class UserSerializer(serializers.ModelSerializer): class Meta: model = User fields = ('id', 'username', 'email', 'first_name', 'last_name')
-
viewsの作成
APIの実際の処理を作成します
RegisterView
でユーザーの登録を
UserDetailView
で対象のユーザーの情報を取ってくるようにします
先ほど作成したユーザーについてはそれぞれのクラスでserializer_class
を使用して指定しますfrom rest_framework import generics, status from rest_framework.response import Response from rest_framework.permissions import AllowAny, IsAuthenticated from django.contrib.auth.models import User from .serializers import RegisterSerializer, UserSerializer class RegisterView(generics.CreateAPIView): queryset = User.objects.all() permission_classes = (AllowAny,) serializer_class = RegisterSerializer def post(self, request, *args, **kwargs): serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) user = serializer.save() return Response({ "user": UserSerializer(user, context=self.get_serializer_context()).data, "message": "User Created Successfully. Now perform Login to get your token", }, status=status.HTTP_201_CREATED) class UserDetailView(generics.RetrieveAPIView): queryset = User.objects.all() permission_classes = (IsAuthenticated,) serializer_class = UserSerializer def get_object(self): # リクエストしているユーザーの情報を返す return self.request.user
動作確認
ここまで問題なく完了できれば、再度開発用サーバーを起動してAPIを実行してみましょう
curl -X POST "http://<自身の環境IP>/api/auth/register/" \
-H "Content-Type: application/json" \
-d '{
"username": "testuser",
"email": "test@example.com",
"password": "password"
}'
レスポンスで以下のように返却されると思います
{"user":{"id":2,"username":"testuser","email":"test@example.com","first_name":"","last_name":""},"message":"User Created Successfully. Now perform Login to get your token"}
2.1 フロントエンドセットアップ
つづいてフロントエンドのセットアップに進みます
Djangoのプロジェクトを管理しているディレクトリと同じ階層で以下のコマンドを実行します
npx create-react-app frontend
cd frontend
npm install axios react-router-dom
いろいろとダウンロードの処理が走り完了すると思います
画面の詳細に関してはGeminiやChatGPTに聞いてお好みのデザインを用意してもらいましょう
最終的に簡易的ではありますが、以下のような画面を作りました
あとはこの画面でユーザーを作成してログイン画面に遷移してログインするとダッシュボードからいろいろの情報が見れるようになるという作りたかったものが作れたかなと思います
おわりに
改めてこれまで1から作ったことがなかったものを作ることができました
これから機能を足していって自分のやりたいことに活かしていければと思います