1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Django REST FrameworkのBasic認証

Last updated at Posted at 2022-12-31

概要

Django REST FrameworkでBasic認証を行う方法を紹介します。

Basic認証とは?

ベーシック認証(Basic認証)とは、Webサイトの特定の領域、つまりページやファイルにアクセス制限をかけることができる認証方法の一つです。
ベーシック認証をかけると、認証をかけたWebサイトにアクセスしようとしたとき、認証ダイアログが立ち上がり、ユーザー名とパスワードの入力が求められます。

DRFのBasic認証のドキュメント

GitHubリンク

サンプルのソースをGitHubで公開しています。

環境

各種バージョン

  • macOS Monterey 12.4
  • Apple M1 Max
  • Python v3.10.9
  • Django v4.1.4
  • djangorestframework v3.14.0

ディレクトリ構成

drf-authentication-demo/
 ├build/
 │ └Dockerfile
 ├projects/
 ├venv/
 ├docker-compose.yml 
 └requirements.txt

環境構築

仮想環境構築

仮想環境を構築し、アクティベートします。

drf-authentication-demo % python -m venv venv
drf-authentication-demo % source venv/bin/activate

requirements.txtを作成し、必要なパッケージを記載します。

Django==4.1.4
djangorestframework==3.14.0

パッケージをインストールします。

(venv) drf-authentication-demo % pip install -r requirements.txt

Basic Authentication

Djangoプロジェクト作成

projectsディレクトリにbasic_authディレクトリを生成し、basic_authディレクトリ以下でDjango プロジェクトを作成します。

(venv) drf-authentication-demo % cd projects/basic_auth
(venv) basic_auth % django-admin startproject project .

一度、開発サーバーを起動し、デフォルト画面が表示できるかを確認します。

(venv) basic_auth % python manage.py runserver

ブラウザでhttp://127.0.0.1:8000/にアクセスし、以下の画面が表示されればOKです。
Screen Shot 2022-12-28 at 4.49.44.png

アプリ作成

ユーザー情報を取得するアプリを作成します。

(venv) basic_auth % python manage.py startapp account

basic_auth/account/models.pyにカスタムユーザーを定義します。

from django.db import models
from django.contrib.auth.models import BaseUserManager, AbstractBaseUser
from django.utils.translation import gettext_lazy as _

class User(AbstractBaseUser):

    username = models.CharField(
        verbose_name=_("username"),
        unique=True,
        max_length=150
    )
    email = models.EmailField(
        verbose_name=_("Email Address"),
        unique=True
    )
    age = models.IntegerField(
        verbose_name=_("age"),

    )

    objects = BaseUserManager()

    def __str__(self):
        return self.username

basic_auth/project/settings.pyを一部編集します。

...

ALLOWED_HOSTS = ["*"] # ワイルドカードを追加

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework', # djangorestframeworkを追加

    'account' # 作成したaccountアプリを追加
]

...

AUTH_USER_MODEL = "account.User" # accountアプリのUserモデルをデフォルトで使用する認証ユーザーモデルとして設定する

ここまで出来ましたら、マイグレートします。

(venv) basic_auth % python manage.py makemigrations
(venv) basic_auth % python manage.py migrate

ここでスーパーユーザーを作成し、管理画面にログインできるか確認します。

任意のユーザー情報で作成してください。

(venv) basic_auth % python manage.py createsuperuser
Username (leave blank to use 'testuser'): testuser
Email address: test@example.com
Password: 
Password (again):
Superuser created successfully.

管理画面にログインできるか確認します。

開発サーバーを起動します。

(venv) basic_auth % python manage.py runserver

ブラウザでhttp://127.0.0.1:8000/admin/にアクセスし、ログインフォームから作成したスーパーユーザー情報を用いてログインできればOKです。

ログイン画面
Screen Shot 2022-12-28 at 5.15.58.png

ログイン後の画面
Screen Shot 2022-12-28 at 5.16.19.png

確認できましたら、ログアウトしておきます。

basic_auth/account/serializers.pyを作成します。

from rest_framework import serializers
from .models import User

class UserSerializer(serializers.ModelSerializer):

    class Meta:
        model = User
        fields = "__all__"

シリアライザーによって、クエリセットやモデルインスタンスなどの複雑なデータをネイティブの

Pythonデータ型に変換できます。

basic_auth/account/views.pyを編集します。

from rest_framework import viewsets
from rest_framework.authentication import BasicAuthentication
from rest_framework.permissions import IsAuthenticated

from .models import User
from .serializers import UserSerializer

class TaskViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    # authenticationとpermissonの以下の2つを設定するとBasic認証が設定できます。
    authentication_classes = (BasicAuthentication,) 
    permission_classes = (IsAuthenticated,)

accountアプリをurls.pyを作成し、以下の内容を書きます。

basic_auth/account/urls.py

from django.urls import include, path
from rest_framework.routers import DefaultRouter
from .views import TaskViewSet

router = DefaultRouter()
router.register(r'account', TaskViewSet)

urlpatterns = [
    path('', include(router.urls))
]

basic_auth/project/urls.pyにaccountアプリのパスを追加します。

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/v1/', include('account.urls'))
]

ここまでできましたら、ブラウザでhttp://127.0.0.1:8000/api/v1/にアクセスします。
Screen Shot 2022-12-31 at 14.35.55.png

http://127.0.0.1:8000/api/v1/account/を選択しますと、Basic認証が要求されることが確認できました。
Screen Shot 2022-12-31 at 14.37.08.png

ここで事前に作成した、スーパーユーザーのユーザー名とパスワードを入力するとサインインできます。

Dockerによる起動

この環境をdockerで起動するようにします。

build/Dockerfileを作成し、以下を記載します。

FROM python:3.10-buster

ENV PYTHONUNBUFFERED 1

WORKDIR /app
ADD requirements.txt /app/
RUN pip install --upgrade pip \
  && pip install -r requirements.txt

ADD ./projects /app/

docker-compose.ymlファイルを作成し、以下を記載します。

version: '3'

services:
  basic:
    container_name: basic-auth-app
    restart: always
    build:
      context: .
      dockerfile: ./build/Dockerfile
    command: python3 basic_auth/manage.py runserver 0.0.0.0:8000
    volumes:
      - ./projects:/app
    ports:
      - "8001:8000"

以下のコマンドを実行して、起動します。

drf-authentication-demo % docker-compose up --build

ブラウザで、http://127.0.0.1:8001/api/v1/にアクセスし、Dajngo REST Frameworkの画面が表示できましたら、OKです。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?