Email Registration
ユーザーがユーザー名の代わりにメールアドレスで登録・ログインできるようにするモジュール
email_registration
インストール
composer require 'drupal/email_registration:8.x-1.4'
概要
Email Registrationは、ユーザーがメールアドレスのみで登録・ログインできるようにするDrupalモジュールです。従来のDrupalでは、ユーザー登録時にユーザー名とメールアドレスの両方が必要でしたが、このモジュールを使用するとメールアドレスのみで登録が可能になります。
ユーザー名はメールアドレスから自動生成されます(デフォルトでは@より前の部分)。この自動生成ロジックはフックを使用してカスタマイズできます。ログイン時もメールアドレスで認証できるため、ユーザーは覚えやすいメールアドレスのみを使用してサイトにアクセスできます。
Drupal Commerceとの連携機能も提供しており、チェックアウトフロー用の代替ログインペインが用意されています。また、既存ユーザーのユーザー名を一括更新するアクションや、Drupal 7からの移行機能、Behat(自動テスト)のサポートなど、実運用に必要な機能が揃っています。
Features
- メールアドレスのみでのユーザー登録(ユーザー名フィールドは自動生成)
- メールアドレスでのログイン認証(REST API含む)
- ユーザー名とメールアドレスの両方でログインを許可するオプション
- メールアドレスからユーザー名を自動生成(@より前の部分を使用、重複時は_1, _2等のサフィックスを追加)
- フックによるユーザー名生成ロジックのカスタマイズ(hook_email_registration_name_alter)
- 複数ユーザーのユーザー名を一括更新するバルクアクション
- Drupal Commerceチェックアウトペインとの統合(ゲストチェックアウト対応)
- REST API(user.login.http)でのメールアドレスによるログインサポート
- Drupal 7からの設定移行機能
- Behat(自動テストフレームワーク)との統合サポート
- サブモジュール「Email Registration Username」によるメールアドレスをそのままユーザー名として使用する機能
Use Cases
シンプルな会員サイト
ユーザーにとってメールアドレスは覚えやすく、ユーザー名を別途設定する必要がないため、登録のハードルを下げられます。ニュースレターサイトやメンバーシップサイトで、ユーザーがメールアドレスのみで簡単に登録・ログインできるようになります。
ECサイトのゲストチェックアウト
Drupal Commerceと組み合わせて、ゲストとして購入したユーザーが後からアカウントを作成できます。チェックアウト時にはメールアドレスのみでログインでき、ユーザー名を覚える必要がありません。
既存ユーザーの移行
従来のユーザー名ベースのサイトをメールアドレスベースに移行する場合、「Update username (from email_registration)」アクションで既存ユーザーのユーザー名を一括更新できます。また、Drupal 7からの移行時にはemail_registration_user_nameプロセスプラグインを使用できます。
REST APIを使用したモバイルアプリ認証
REST APIエンドポイント(user.login.http)がメールアドレスでのログインに対応しているため、モバイルアプリやSPAからメールアドレスとパスワードでユーザー認証を行えます。リクエストボディにmailとpassを送信します。
自動テスト(Behat)でのユーザーシナリオ
Behatを使用した自動テストで、ユーザーログインシナリオをメールアドレスベースで実行できます。behat.services.ymlの設定をインポートするだけで、テストシナリオでメールアドレスによるログインが使用されます。
Tips
- ウェルカムメールやパスワードリセットメールのテンプレートで[user:display-name]トークンを[user:mail]に置き換えると、ユーザーに送信されるメールでメールアドレスが表示されます
- ユーザー名の自動生成ロジックをカスタマイズしたい場合は、hook_email_registration_name_alter()を実装したカスタムモジュールを作成してください。email_registration_cleanup_username()とemail_registration_unique_username()関数を使用すると、クリーンアップとユニーク性の保証を簡単に行えます
- Commerce連携を使用する場合、チェックアウトフロー設定(/admin/commerce/config/checkout-flows)で「Login」ペインを「Login with email registration or continue as guest」に置き換えてください
- email_registration_usernameサブモジュールを使用すると、メールアドレスがそのままユーザー名になりますが、セキュリティ上のリスク(メールアドレスの露出)があることに注意してください。表示名の上書きオプションを活用してリスクを軽減できます
- 大量の既存ユーザーのユーザー名を更新する場合、管理 > ユーザー画面(/admin/people)でユーザーを選択し、「Update username (from email_registration)」アクションを使用できます
Technical Details
Admin Pages 1
/admin/config/people/accounts
Email Registrationモジュールの設定はDrupal CoreのアカウントSCRIPT設定ページに統合されています。このページでは、メールアドレスとユーザー名の両方でログインを許可するかどうかを設定できます。
権限 2
Hooks 2
hook_email_registration_name_alter
ユーザー名の自動生成ロジックをカスタマイズするためのフック。ユーザー保存時(presave)に呼び出され、生成されるユーザー名を変更できます。
hook_email_registration_name
【非推奨】ユーザー名を生成するためのレガシーフック。2.0.0で非推奨となり、3.0.0で削除予定。代わりにhook_email_registration_name_alter()を使用してください。
Troubleshooting 5
LoginTobogganの「Allow users to login using their email address」オプションを無効にしてください。両方のモジュールが同じ機能を提供しようとするため競合が発生します。
hook_email_registration_name_alter()を実装するカスタムモジュールがある場合、フックの実行順序を確認してください。email_registrationモジュール自身も同フックを実装しており、モジュールの重み(weight)によって実行順序が決まります。
「change own username」パーミッションを適切なロールに付与してください。このパーミッションがないユーザーには、ユーザー編集フォームでユーザー名フィールドが表示されません。
「login_with_username」設定がtrueになっています。メールアドレスのみでログインさせたい場合は、管理 > 環境設定 > ユーザー > アカウント設定でこのオプションを無効にしてください。
モジュールは「The account with email address %name has not been activated or is blocked.」というメッセージを表示します。これは意図された動作です。
Security Notes 3
- email_registration_usernameサブモジュールを使用すると、ユーザー名としてメールアドレスが使用されるため、コメントやコンテンツの投稿者名としてメールアドレスが表示される可能性があります。「Override user display name」オプションを使用してこのリスクを軽減してください
- 「login_with_username」オプションを有効にすると、ユーザー名でもログインできるようになります。ユーザー名がメールアドレスから自動生成される場合、攻撃者がメールアドレスの一部を推測してログインを試みる可能性があります
- REST APIでのログイン(user.login.http)もメールアドレスベースになるため、ブルートフォース攻撃対策として、Drupal Coreのフラッドコントロール機能が適用されます