コンテンツにスキップ

申込時パスワード登録パターン

例:イベント申込・資料請求システム

一般ユーザーがWebサイトからイベントに申し込む、または資料を請求する。

適用する原則: 登録はその場で行う状態と操作を分離する

  • 初めて利用するユーザーが多い
  • 申込後にマイページで履歴を確認したい
  • 次回以降もログインして利用できるようにしたい

典型パターン:申込フォームにパスワード欄 別タブで開く ↗

典型の画面遷移

GET /events/:id/apply メールアドレス入力
POST /events/:id/apply/send-link 認証リンク送信
GET /events/:id/apply?token=xxx 申込フォーム(パスワード欄含む)
POST /events/:id/apply 申込実行(アカウント作成 + 申込登録)
GET /events/:id/apply/complete 完了画面

典型のテーブル構造

  • 設計上の矛盾: メールリンクで認証済みなのに、さらにパスワードを求める
  • 関心事が混在: 「申し込み」と「アカウント作成」が1つのフォームに
  • バリデーションエラーが増える: 文字数・確認入力・強度チェックなど失敗しやすい
  • パスワード疲れ: 利用頻度が低いのに、また1つパスワードが増える

再設計パターン:パスワード不要で申込 別タブで開く ↗

再設計の画面遷移

GET /events/:id/apply メールアドレス入力
POST /events/:id/apply/send-link 認証リンク送信
GET /events/:id/apply?token=xxx 申込フォーム(トークン検証後)
POST /events/:id/apply 申込実行
GET /events/:id/apply/complete 完了画面
POST /account/set-password パスワード設定(任意・別導線)

再設計のテーブル構造

  • 認証はメールリンク: 典型と同じ方式(ここまでは共通)
  • パスワードを申込から分離: 認証済みなのにパスワードを求めない
  • パスワードは任意: password_hash が NULL でも利用可能
  • 申込フォームがシンプルに: 本当に必要な項目だけ

画面遷移の比較

観点典型再設計
認証方法メールリンク(共通)メールリンク(共通)
フォーム項目申込 + パスワード申込のみ
パスワード必須任意(後から設定可)
バリデーションエラー起きやすい減る
次回ログインパスワード入力メールリンク or パスワード

方式特徴
メールリンクログインリンクを送信
SMS認証認証コードを送信
OAuthGoogle等の既存アカウント
Passkey生体認証・デバイス認証

利用頻度が低いサービスほど、パスワードレスが有効。