本記事は、Django の標準認証を使わない顧客データモデルに対して、
- Gmail をメールサーバとして使い
- ユーザーに **リンク付き確認メール** を送り
- リンクを踏ませることで **本人確認(操作許可)** を行う
という一連の処理を、django-passwordless を使って最小構成で実装するための備忘録です。
対象ユースケース:
- 退会手続き
- アカウント情報更新
- 重要操作前の本人確認
ログイン状態や Django の User 認証とは完全に無関係な前提です。
全体像
ポイント:
- **パスワード入力なし**
- **セッション常駐なし**
- **操作単位の一時認証**
前提条件
- Django プロジェクトが作成済み
- 顧客モデルは Django 認証とは無関係
1. Gmail 側の準備(重要)
1-1. Gmail に 2FA を有効化
- Google アカウントのセキュリティ設定から
- **2 段階認証を必ず ON** にする
1-2. アプリパスワードを発行
- Google アカウント → セキュリティ
- 「アプリ パスワード」
- 種類:メール
- デバイス:任意
→ 16 桁のパスワードが発行される
⚠️ 通常の Gmail パスワードは使えない
2. Django のメール設定(Gmail SMTP)
3. django-passwordless の導入
3-1. インストール
3-2. settings.py 設定
4. URL 設定
※ 今回はログイン用途ではなく「本人確認トークン生成」に使う
5. 確認メールを送る処理
5-1. トークン付きリンクを送信
- トークンは **ワンタイム & 期限付き**
- UUID を直接晒さない
6. リンク先(本人確認ビュー)
ここで初めて:
- 「この操作をしているのは本人である」
とみなす
7. セキュリティ上の注意点
必ずやること
- トークンに有効期限を設定(passwordless のデフォルトで対応)
- 操作完了後は **再利用不可** にする
- 重要操作は **POST のみ許可**
やらない方がいいこと
- 永続ログイン
- パスワード入力要求
- トークンを URL パラメータ以外に保存
8. この方式が向いている理由
- Django 認証に依存しない
- 顧客がログイン状態を持たない
- 退会・更新など **単発操作** に強い
- UX がシンプル
まとめ
- **django-passwordless はログイン専用ではない**
- Gmail + アプリパスワードで十分実用
- 顧客データモデルが User でなくても問題なし
- 「操作単位の本人確認」には最適

