# 4.1 認証・ログインセッション管理(Django REST Framework + Vue 編)
API ドリブン構成において、認証・ログインセッション管理は最初のハードルになる。
Django は標準で認証機能を持っているが、SPA(Single Page Application)や外部サービスと組み合わせる場合は少し工夫が必要。
この記事では Django REST Framework(DRF) + Vue を前提に、認証とセッション管理の仕組みを整理する。
さらに、EC サイトなどでよく使われる JWT 認証、そして実務で特に苦労した Okta 認証 についても触れる。
あわせて、AI をどう活用できるかも補足する。
1. Django 側の認証
標準の認証機構
Django には以下が標準で備わっている。
- ユーザーモデル(拡張可能)
- セッションベース認証
- ログイン・ログアウト API(
django.contrib.auth
)
業務システムではこれをそのまま活用するケースが多い。
💡 AI活用のヒント
「Django の標準ログイン処理のコード例を出して」と依頼すれば、ほぼそのまま動く雛形が生成される。
ただし、自作ユーザーモデルとの互換や CSRF 対応までは AI が省略しがちなので、自分の環境に合わせて調整が必要。
2. DRF での認証 API
Django REST Framework は以下の認証方式をサポートしている。
- SessionAuthentication: Django のセッションをそのまま利用
- TokenAuthentication / JWT: トークンを使った stateless 認証
プロジェクトで採用した方針
- 業務システム(社内向け) → セッション認証を採用
- EC サイト(外部公開 API) → JWT 認証を採用
💡 AI活用のヒント
「DRF で JWT 認証を実装して」と依頼すると、djangorestframework-simplejwt
を使ったコード例がすぐ出てくる。
ただし、Refresh Token の設計や Vue 側の保管方法までは触れられないことが多いため、そこは設計判断が必須。
3. セッション認証の実装例
ログイン API
# views/custom_login.py
from django.contrib.auth import authenticate, login
from django.http import JsonResponse
def custom_login(request):
if request.method == "POST":
username = request.POST["username"]
password = request.POST["password"]
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
return JsonResponse({"message": "ログイン成功"})
return JsonResponse({"error": "ログイン失敗"}, status=400)
Vue 側でのセッション管理
import axios from "axios";
async function login(username, password) {
const res = await axios.post("/api/login/", { username, password });
return res.data;
}
ログイン後はセッション ID が Cookie に保存される。
💡 AI活用のヒント
セッション認証は比較的シンプルなので「Vue 側でセッション認証を扱う axios コード例」と依頼すれば、ほぼそのまま使える。
ただし、Cookie の送信設定や CSRF トークンの付与は AI が抜けやすいので、人間の確認が必須。
4. JWT 認証の実装例
外部向け API では JWT を使うケースが多い。
DRF では djangorestframework-simplejwt
を利用できる。
インストール
pip install djangorestframework-simplejwt
設定
# settings.py
REST_FRAMEWORK = {
"DEFAULT_AUTHENTICATION_CLASSES": (
"rest_framework_simplejwt.authentication.JWTAuthentication",
)
}
ログイン API
from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView
urlpatterns = [
path("api/token/", TokenObtainPairView.as_view(), name="token_obtain_pair"),
path("api/token/refresh/", TokenRefreshView.as_view(), name="token_refresh"),
]
レスポンス例:
{
"access": "jwt_access_token_string",
"refresh": "jwt_refresh_token_string"
}
Vue 側での利用例:
api.interceptors.request.use(config => {
const token = localStorage.getItem("access_token");
if (token) {
config.headers.Authorization = `Bearer ${token}`;
}
return config;
});
💡 AI活用のヒント
AI は JWT のコードをすぐ出してくれるが、保存場所に localStorage を推奨する例が多い。
実運用では httpOnly Cookie を使う方が安全なので、人間側で判断・修正する必要がある。
5. Okta 認証での注意点(実務で最もハマった部分)
私は実際に Okta 認証を組み込んだ際に、かなり苦労した。
理由は以下の通り。
- Okta 側の設定(アプリ登録・リダイレクト URI 設定)
- Django 側の設定(allauth / socialaccount まわり)
- settings.py の調整(認証バックエンド・コールバック URL)
- 管理サイトとの兼ね合い
これらが相互に絡むため、構造を的確に整理しないと迷子になる。
さらに、Vue を加えた SPA 構成だとややこしさは倍増する。
- ローカル開発で 127.0.0.1 と localhost が別オリジン扱いになる
- CORS / SameSite / Secure 属性などの オリジン関連設定で詰まりやすい
- Django や allauth のバージョン差で挙動やセキュリティ要件が変わる
👉 このあたりは AI に任せるのは難しく、トライ&エラーを繰り返すしかなかった。
ただし AI に「Okta + Django + allauth の統合例を示して」と依頼すると、方向性のヒントは得られる。
そこに 自分の環境(リダイレクト URL、オリジン、CSRF 要件など)を的確に提示する ことで、ようやく使えるコードが出てくる。
💡 実務Tips
- まず AI に「Okta 認証の統合例」を生成させる
- その上で「うちの環境は Vue SPA / ローカルは 127.0.0.1:8000 と localhost:5173」などの具体条件を追加で伝える
- 出力を叩き台にしつつ、実際は何度も試行錯誤が必要
6. セッション認証と JWT 認証の比較
項目 | セッション認証 | JWT 認証 |
---|---|---|
管理方式 | サーバーがセッションを保持 | stateless(トークンのみ) |
CSRF 対策 | 必要 | 不要 |
有効期限 | セッションタイムアウト | トークンの exp による |
スケーラビリティ | セッション共有が必要 | スケールアウトしやすい |
向いているケース | 社内システム、イントラ、閉じた環境 | EC サイト、スマホアプリ、外部連携 API |
💡 AI活用のヒント
比較表の生成は AI が得意。
自分は「セッション認証と JWT 認証のメリット・デメリットを表形式で」と依頼して作り、それに自分の業務要件を追記することで資料を効率化した。
まとめ
認証・ログインセッション管理では以下を押さえる。
- Django 標準の認証はそのまま使える
- DRF はセッション認証・JWT 認証を両方サポート
- 業務システムはセッション認証、EC サイトは JWT 認証と使い分ける
- JWT は stateless でスケーラブルだが、有効期限とセキュリティ管理が必須
- Okta 認証は設定とオリジンの組み合わせでハマりやすく、トライ&エラーが避けられない
💡 AI活用のまとめ
- 雛形コード生成や比較表は AI に任せると効率的
- ただし Okta のような外部認証連携は「環境依存の条件を提示しないと使えるコードは出ない」
- 最終的には試行錯誤と人間の検証が不可欠
次回は、JWT 認証の仕組みと実装 についてまとめる予定。
Discussion