見出し画像

DRF_djoser&JWT認証_JWT認証を使った設定 #178日目

本日もユーザー登録や認証周りのアウトプットです。
JWT認証を活用する方法をまとめたいと思います。


JWT認証とは

JWTとはJSON Web Tokenの略で、ジョットと読みます。JSONとはお馴染みにデータフォーマットのことで、Tokenとはユーザーを識別するための認証情報を指します。つまりJWTとは、JSON形式の認証情報、ということになります。

JWTは以下3つの要素で構成されています。

  • ヘッダー

  • クレーム情報(ペイロード=データ本体)

  • 署名

それぞれ解説します。


ヘッダー
署名暗号の方式を記載するセクションです。署名のアルゴリズムやトークンタイプなどのメタ情報が入ります。

クレーム情報(ペイロード=データ本体)
任意の情報を含ませることができ、ここにユーザー認証情報を記述します。含ませた認証情報から、正当なユーザーかどうかをチェックしています。

任意の情報を含ませられますが、以下のように「登録済みクレーム」と呼ばれ、予め登録されている内容で使用できるキー情報があります。

sub : 認証の対象となるユーザの識別子で 通常 URI 形式で提供されます (subject)
iat : トークンの発行日時を表す timestamp (issued at)
aud : トークンが利用されるべきクライアント(受信者)識別子で 通常 URI 形式で提供されます (audience)
iss : トークンの発行者を表す識別子 (issuer)
exp : トークンの有効期限を表す timestamp (expiration)
nbf : exp とは逆に、トークンが有効となる日時を表す timestamp (not before)
jti : JWT の一意の ID

これらのキーは、しばしば JWT の「登録済みクレーム」と呼ばれます。

繰り返しになりますが ペイロードセクションでの JSON フォーマットに規定はなく、
必須のキー情報などはありませんが、登録済みクレームのキー情報を 登録済みクレームで定められた内容以外で利用するのは避けたほうが良いでしょう。

Zenn:  JWT の仕組み

JSONデータのフォーマットとしては以下のような形で、これをbase64エンコードしてペイロード情報が生成されています。

{
  "sub": "1234567890",
  "name": "YM202110",
  "iat": 1516239022
}


署名
署名セクションは、JWTの正当性を保証するためのものです。ヘッダーで定義されたアルゴリズムを用いて作成された署名情報がここで用いられます。


djoserとは

djoserはDRF上での基本的なユーザー認証や登録など、認証周りをサポートしてくれるライブラリです。Single Page Application (以下、SPA)によりフィットするようなアーキテクチャを目指して作られています。

以下で紹介する設定は、このdjoserでJWTを使って認証機能を実装するコードになります。

djoser単体でも認証周りの設定は可能ですが、それだとあまりセキュアではなく、実運用上はJWT認証のようなより強固なセキュリティを備えて実装するのが望ましいです。


JWT認証の設定方法

次は設定方法を整理していきます。
まずは必要なパッケージをpipでインストールします。

pip install djoser
pip install djangorestframework-simplejwt

設定ファイルには次のような設定を追加します。

[config/settings.py]
 

......

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # 3rd party apps
    'rest_framework',   # add
    'djoser',           # add
    # My applications
    'apiv1',            # add
    'shop',             # add
]

.....

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        # JWT認証の設定
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ],
}

# JWT認証の設定の続き
SIMPLE_JWT = {
    'AUTH_HEADER_TYPES': ('JWT',),
    'ACCESS_TOKEN_LIFETIME': timedelta(minutes=30),  # JWTの有効期限を定義するための変数。デフォルトは5分になっている。
}

.....

urlも設定します。色々試すうちにごちゃついてしまったので、今回の該当箇所のみ記載します。

[config/urls.py]
 
from django.contrib import admin
from django.urls import path, include


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


これで設定としては完了です。
これだけでも色んな機能が使えるらしいので、後日その辺もまとめて見ようと思います。

ここまでお読みいただきありがとうございました!!


参考


この記事が気に入ったらサポートをしてみませんか?