Djoser を触ってみる

2023年8月2日

JWT を使ったアカウントの CRUD が出来るみたいなので触ってみます。

参考

エンドポイント

エンドポイントは以下の種類があるようです。

/users/
/users/me/
/users/confirm/
/users/resend_activation/
/users/set_password/
/users/reset_password/
/users/reset_password_confirm/
/users/set_username/
/users/reset_username/
/users/reset_username_confirm/
/token/login/ (Token Based Authentication)
/token/logout/ (Token Based Authentication)
/jwt/create/ (JSON Web Token Authentication)
/jwt/refresh/ (JSON Web Token Authentication)
/jwt/verify/ (JSON Web Token Authentication)

djoser を設定する

以下二つのライブラリをインストールする。

pip install -U djoser
pip install -U djangorestframework_simplejwt

以下を settings.py に追加する。

from datetime import timedelta

...

INSTALLED_APPS = [
    ...
    'djoser',
    'rest_framework',
    ...
]

SIMPLE_JWT = {
    #トークンをJWTに設定する。
    'AUTH_HEADER_TYPES':('JWT'),
    #トークンの持続時間の設定をする。
    'ACCESS_TOKEN_LIFETIME': timedelta(minutes=60)
}

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ),
}

urls.py にルーティングを追加する。

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

app_name = "app"
urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/auth/',include('djoser.urls')),
    path('api/auth/',include('djoser.urls.jwt')),
]

ユーザーアプリとモデルを作成する

カスタムユーザーを作成します。
ここは djoser と関係ないので適当に。。。

アプリを作成する。

django-admin startapp users

アプリを登録し認証のモデルに指定する。

INSTALLED_APPS = [
    ...
    'users',
    ...
]

# アプリ名.モデル名
AUTH_USER_MODEL = 'users.User'

モデル models.py を定義する。

from django.db import models
from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    class Meta:
        verbose_name_plural = 'User'

管理画面で見れるように admin.py に登録する。

from django.contrib import admin
from users.models import User

admin.site.register(User)

マイグレートする。

python manage.py makemigrations
python manage.py migrate

djoser を試してみる

ユーザーを適当につくる。

python manage.py createsuperuser

以下の URL にアクセスすると djoser の画面が表示される。
(ポートはサーバーが起動しているのに適宜変えて。)

http://localhost:8888/api/auth/

今度は、ユーザー情報を取得する為、以下の URL にアクセスしてみる。

http://localhost:8888/api/auth/users/

以下のように怒られる。

{
    "detail": "認証情報が含まれていません。"
}

トークンを取得するために以下の URL にアクセスする。

http://localhost:8888/api/auth/jwt/create
  1. Username に先ほど作成した Admin のユーザー名を入力する。
  2. Password に先ほど作成した Admin のパスワードを入力する。
  3. POST を押す。
  4. 以下のようなトークンが取れたのを確認する。
{
  "refresh": "aaabbbccc",
  "access": "xxxyyyzzz"
}

ターミナルから以下のリクエストを送ると今度は、ユーザー情報が取得出来るのを確認する。

curl -LX GET http://127.0.0.1:8888/api/auth/users/ -H 'Authorization: JWT xxxyyyzzz'

2023年8月2日