第3回まで無料

認証と会員機能入門コース

パスワードの保存・セッションと Cookie・CSRF から、メール認証・SNS ログイン(OAuth 2.0)・プランとロール・レート制限と二要素認証・監査ログと退会まで。全30レッスンで、会員制サイトのログインを最初から最後まで自分で組み立てられるところまで進みます。コードとテスト結果は、すべて Django 6.1 で実際に動かしたものです。

カリキュラム

全30レッスンを6つの章に分けています。第1章から順に進めるのがおすすめですが、 気になるところだけ拾い読みしてもかまいません。 ※ Django はブラウザ内で実行できないため、Django・pytest-django・pyotp を入れた仮想環境で試してください。OAuth の state やレート制限など、標準ライブラリだけで完結する例はブラウザ上でそのまま実行できます。前提は Django コースです。

Chapter 1 — 認証の基礎(第1〜5回)

パスワードをハッシュで保存し、ログイン状態をセッションと Cookie で保ち、CSRF トークンでなりすまし POST を弾く——認証の土台を Django の標準機能で確かめます。最後は、ログインとログアウトの正体が「セッションにユーザー ID を記録して消すこと」だと見えるところまで進みます。

Chapter 2 — メール認証とログイン(第6〜11回)

サインアップで確認メールを送り、トークン付きリンクでアドレスを確かめ、パスワードなしのログインコードとリセットまで作ります。最後は弱いパスワードを登録前に弾き、認証メールを迷惑メールに入れないための SMTP と SPF・DKIM・DMARC を押さえます。

6

サインアップでユーザーを作る

create_user でユーザーを作り、パスワードは自動でハッシュ保存。会員情報の Profile と確認メールまでを 1 つのビューにまとめ、登録からログインまでを通しで確かめる回。

🔒 ベーシック
7

確認メールのトークンでアドレスを確かめる

default_token_generator で本人だけの時限トークンを作り、確認メールのリンクに入れる。リンクを踏むと email_verified が False から True に変わる流れの実測。

🔒 ベーシック
8

時限つきのログインコード(マジックリンク)

パスワードの代わりに、メールで送る時限リンクでログインする。django.core.signing で期限つき・改ざん検知のトークンを作り、正常・期限切れ・改ざんの 3 通りを確かめる回。

🔒 ベーシック
9

パスワードリセットと時限トークン

リセットの核は、本人だけが踏める時限トークン。set_password で新パスワードに変え、変更後は古いリンクが無効になることの確認。実運用で乗る組み込みの PasswordResetView。

🔒 ベーシック
10

登録前にパスワードの強度を検証する

validate_password を create_user の前に通し、弱いパスワードのユーザーを作らせない。4 つの標準バリデータと、複雑さのルールより長さがいちばん効くという考え方。

🔒 ベーシック
11

メール送信と SMTP の設定

send_mail の基本と、開発はメモリ(locmem)・本番は SMTP というバックエンドの切り替え。認証メールを迷惑メールに入れないための SPF・DKIM・DMARC。

🔒 ベーシック

Chapter 3 — SNS ログイン(第12〜18回)

「Google でログイン」の裏側にある OAuth 2.0 の認可コードフローを、認可 URL・state・コールバック・トークン交換の順に分解して確かめます。各プロバイダの鍵の扱いとアカウント連携を押さえたうえで、最後は本番で django-allauth に任せる理由まで進みます。

12

OAuth 2.0 の認可コードフロー

「Google でログイン」の裏側にある OAuth 2.0。パスワードをアプリに渡さず、認可 URL → 許可 → コード → トークン交換とつなぐ流れと、認可 URL に乗るパラメータ。

🔒 ベーシック
13

state でログインの乗っ取りを防ぐ

OAuth でいちばん忘れやすく、いちばん危ないパラメータ state。推測できないランダム値を作ってセッションに保存し、コールバックで定数時間比較する流れ。

🔒 ベーシック
14

コールバックで code と state を受け取る

プロバイダは登録済みの redirect_uri に code と state を付けて戻す。state を照合してから code を使う順番と、最頻出エラー redirect_uri mismatch の原因である完全一致のルール。

🔒 ベーシック
15

認可コードをトークンに交換する

コールバックで受け取った認可コードを、サーバ間でアクセストークンと id_token に交換する。HTTP を外から注入してテストする書き方と、client_secret をブラウザに出さない理由。

🔒 ベーシック
16

Google・GitHub・LINE・X の鍵と設定

プロバイダごとに違う認可エンドポイントとスコープを 1 つの表にまとめ、同じ関数で 4 種類の認可 URL を組む。開発者コンソールでの登録の要点と、鍵をコードに書かない管理。

🔒 ベーシック
17

SNS アカウントをユーザーに紐づける

SNS ログインで得られるのはプロバイダ側の uid。(provider, uid) を一意にしてこちらのユーザーに紐づけ、二重連携を防ぐ。コールバックでの 3 通りの分岐と、メールで自動連携しない理由。

🔒 ベーシック
18

SNS ログインは django-allauth に任せる

state 検証・コールバック・トークン交換・アカウント連携を丸ごと肩代わりする django-allauth。自前で全部を漏れなく作り続ける難しさと、ライブラリを入れても自分の責任で残る設定。

🔒 ベーシック

Chapter 4 — 会員の状態を持つ(第19〜23回)

User に Profile を 1 対 1 で足してプランとロールを持たせ、「誰が何をしてよいか」を分けます。有料だけに本編を見せる出し分けと無料公開範囲の制御を作り、最後はログイン必須ページの保護漏れを防ぐところまで進みます。

Chapter 5 — 攻撃から守る(第24〜27回)

レート制限で乱用を抑え、連続失敗のロックで総当たりを止め、TOTP の二要素認証でパスワードが漏れたときに備えます。最後は、ログインのたびにセッション ID を付け替える仕組みと、SECRET_KEY などの鍵を環境変数に置く管理まで進みます。

Chapter 6 — 運用(第28〜30回)

「ログインできない」という問い合わせを原因別に切り分け、その土台になる監査ログで誰が・いつ・何をしたかを残します。最後は退会で何を消し、何を匿名化して残すかを設計して、全30回を締めくくります。

全30レッスンを終えたら、次は作ったログインの器に課金をつなぐ Stripe 決済とサブスクリプション へ。メンバーシップで全コースが解放されます。