Django REST Framework(DRF)には、デフォルトで3つの認証機能が搭載されています。
認証機能は認証クラス(authentication classes
)で設定し、リクエストが誰からのものかを識別します。
本記事では基本の、Basic認証、Token認証、Session認証の特徴と使いどころを比較しながら解説します。

現代のAPI開発では、Token認証が一般的です。
1. Basic認証(BasicAuthentication)
いちばんシンプルな認証で、ユーザー名とパスワードをAuthorizationヘッダに含める方法です。
パスワードは暗号化されずに平文で送られるので、HTTPSは必須。開発・テスト用途向けの認証になります。
設定方法
以下の設定により、BASIC認証がデフォルトの認証方式になります。
REST_FRAMEWORK = {
"DEFAULT_AUTHENTICATION_CLASSES": [
"rest_framework.authentication.BasicAuthentication",
]
}
BASIC認証をかけたいビューに、次のようなをpermission_classes
追加します。
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.views import APIView
class PrivateView(APIView):
permission_classes = [IsAuthenticated]
def get(self, request):
return Response({"message": f"Hello, {request.user.username}!"})
これにより、PrivateViewはBASIC認証が求められるようになります。
動作確認方法
PrivateViewのエンドポイントに向かって、テストしてみましょう。
curl -u username:password http://localhost:8000/api/secure-endpoint/
前述のようにBASIC認証は暗号化せずにパスワードのやり取りを行います。
HTTPS化しないとパスワードが傍受される危険性があることは、十分認識しておきましょう。
2. Session認証(SessionAuthentication)
Djangoのログインセッションと連動する認証です。
CSRFトークンが必要でクッキー認証なので、ブラウザとの連携なら相性が良いです。
一方で、ブラウザを使わないAPI単独としての用途には向きません。
設定方法
以下の設定により、Session認証がデフォルトの認証方式になります。
REST_FRAMEWORK = {
"DEFAULT_AUTHENTICATION_CLASSES": [
"rest_framework.authentication.SessionAuthentication",
]
}
動作確認方法
/admin/
などでログインを済ませ、同じブラウザで以下のようなビューにアクセスできれば動作確認はOKです。
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.views import APIView
class SessionAuthCheckView(APIView):
permission_classes = [IsAuthenticated]
def get(self, request):
return Response({"message": f"Session認証OK: {request.user.username}"})
ログイン時にsessionid
クッキーがブラウザにセットされ、それを使って認証が行われることになります。
3. トークン認証(TokenAuthentication)
ユーザーごとに発行した固定トークンで、認証する方法です。
HTTPヘッダに送るので、HTTPS通信が必須であることに注意しましょう。
設定方法
以下の設定により、トークン認証がデフォルトの認証方式になります。
REST_FRAMEWORK = {
"DEFAULT_AUTHENTICATION_CLASSES": [
"rest_framework.authentication.TokenAuthentication",
]
}
これまでの認証方式と違って、トークン認証は追加の設定が必要です。
※ 仕組み自体は実装されているが、準備しないと使えない
まずは必要なライブラリをインストールしましょう。
pip install djangorestframework
pip install djangorestframework.authtoken
INSTALLED_APPS
にauthtoken
を追加します。
INSTALLED_APPS = [
"rest_framework.authtoken",
]
マイグレーションを実施。
python manage.py migrate
あらかじめ、特定のユーザーにトークンを与えておきます。
このトークンを持っているユーザーは、認証に通過することができるようになります。
python manage.py drf_create_token <username>
動作確認
認証が必要なビューを用意しておきましょう。
class MyView(APIView):
permission_classes = [IsAuthenticated]
def get(self, request):
return Response({"user": request.user.username})
上記で作ったエンドポイントに向かってリクエストを飛ばしてみましょう。
curl -H "Authorization: Token <your_token>" http://localhost:8000/api/secure-endpoint/
外部アプリやモバイルアプリとの連携、セッション不要でステートレスにしたいAPIなら便利な認証方式です。
まとめ
それぞれの認証方式をまとめると、次のとおり。
認証方式 | 特徴 | 利点 | 注意点 |
---|---|---|---|
Basic認証 | ユーザー名・パスワードを毎回送信 | 実装が簡単 | HTTPS必須 セキュリティに弱い |
Session認証 | Djangoログインと連動 | Webアプリと親和性◎ | CSRFトークンが必要 |
Token認証 | トークンを使って認証 | モバイル・API向け | トークン管理の仕組みが必要 |
用途や運用形態に応じて、適切な認証方式を選びましょう!
コメント