External Authentication
外部サイトやサービスを使用してユーザーを認証し、識別情報をauthmapテーブルに保存するためのサービスを提供するヘルパーモジュールです。
externalauth
インストール
composer require 'drupal/externalauth:^2.0'
概要
External Authenticationモジュールは、外部サイトやサービスに対して認証されたユーザーのログインと登録、および認証詳細の保存のための汎用サービスを提供します。Drupal 8以降におけるuser_external_login_register()および関連関数の同等機能として機能し、Drupal 6および7のコアに存在していたauthmapテーブルの役割も担います。
このモジュールは、他の外部認証モジュール(SAML、LDAP、OAuthなど)が構築するための基盤APIとして設計されています。外部認証データの保存と取得、外部IDとDrupalユーザーアカウントのマッピングのための一貫したAPIを提供します。
モジュールは認証マッピングを'authmap'データベーステーブルに保存し、認証プロバイダーが提供する外部認証名(authname)をDrupalユーザーアカウントにリンクします。各マッピングには、認証プロバイダー固有のシリアライズされた追加データも保存できます。
Features
- 外部認証名に基づいてDrupalユーザーの読み込み、ログイン、登録、リンクを行うサービスを提供
- 認証マッピングデータ(authnameからDrupalユーザーIDへ)を専用のauthmapデータベーステーブルに保存
- プロバイダー固有の情報のために、各認証マッピングに追加のシリアライズデータを保存可能
- ログイン、登録、authmap変更時にイベントを発火し、他のモジュールが反応または動作を変更可能
- ユーザーとプロバイダー間の外部認証リンクを管理するViewsベースの管理インターフェースを含む
- Drupalユーザーが削除されると自動的にauthmapエントリをクリーンアップ
- Drupal 6および7インストールからauthmapデータをアップグレードするためのmigrateプラグインを提供
- ユーザーごとに複数の認証プロバイダーをサポートし、異なる外部サービスを通じてログイン可能
Use Cases
SAMLシングルサインオン統合
samlauthなどのモジュールを使用してSAMLベースのSSOを実装する場合、externalauthモジュールはSAML NameID(外部識別子)とDrupalユーザーアカウント間のマッピングを保存します。samlauthモジュールはexternalauth.externalauth->loginRegister()を呼び出してユーザー認証を処理し、初回SAMLユーザーのために新しいDrupalアカウントを自動的に作成します。
LDAP認証
LDAP認証では、externalauthモジュールがLDAP識別名(DN)またはユーザー名をDrupalアカウントにマップします。ユーザーがLDAP経由で認証すると、認証モジュールはexternalauthサービスを使用して対応するDrupalユーザーを検索または作成し、ログインセッションを確立します。
OAuth/OpenID Connectログイン
OAuthまたはOpenID Connectを使用したソーシャルログイン実装では、externalauthを使用して外部ユーザー識別子(GoogleやFacebookのユーザーIDなど)をDrupalアカウントにマップできます。これにより、適切なユーザーアカウントマッピングを維持しながら「Googleでログイン」タイプの機能を実現できます。
マルチプロバイダー認証
複数の外部システム(SAMLとLDAPの両方など)を通じてユーザーが認証できる組織では、externalauthを使用して各プロバイダーのマッピングを管理できます。単一のDrupalユーザーがプロバイダーごとに1つずつ複数のauthmapエントリを持つことができ、柔軟な認証オプションを実現します。
Drupal 6/7からのサイトマイグレーション
外部認証を使用していたDrupal 6または7サイトからマイグレーションする場合、マイグレーションテンプレート(d6_authmapおよびd7_authmap)が既存の認証マッピングを保持し、マイグレーション後もユーザーが外部資格情報でログインし続けられるようにします。
カスタム認証プロバイダー開発
カスタム認証モジュールを作成する開発者は、externalauthを基盤として使用できます。提供されるサービスを呼び出すことで、カスタムモジュールはプロバイダー固有の認証ロジックに集中しながら、ユーザー登録、ログイン完了、マッピング保存はexternalauthに依存できます。
Tips
- ExternalAuthAuthmapAlterEventを使用して、登録時に生成されるDrupalユーザー名をカスタマイズし、必要に応じてデフォルトのprovider_authname形式を変更できます
- /admin/people/authmapのauthmapビューはコンテキストフィルターを受け入れるため、/admin/people/authmap/{provider}でプロバイダー固有のリストにアクセスできます
- register()またはlinkExistingAccount()を呼び出す際にauthmap_dataパラメータにプロバイダー固有のデータを保存できます - このデータはマッピングと共にシリアライズされて保存されます
- externalauth.registerイベントをサブスクライブして、外部登録後に追加のユーザーセットアップ(外部属性に基づくロール割り当てなど)を実行できます
- linkExistingAccount()メソッドは、アカウントが既に同じauthnameでリンクされている場合FALSEを返し、冪等な操作を可能にします
- 複数の外部認証プロバイダーを使用する場合、明確にするためにauthmapビューをカスタマイズしてproviderカラムを表示することを検討してください
Technical Details
Admin Pages 2
/admin/people/authmap
各ユーザーの外部認証メソッドによって登録されたすべての外部認証名マッピングを表示するViewsベースの管理ページです。ページには認証名(外部識別子)、DrupalユーザーID、Drupalユーザー名(ユーザープロファイルへのリンク付き)、削除操作リンクが表示されます。リストは認証名とDrupalユーザーでフィルタリングできます。プロバイダー固有のビューは/admin/people/authmap/{provider}(例:/admin/people/authmap/samlauth)で利用可能です。
/admin/people/authmap/{provider}/{uid}/delete
認証名とDrupalユーザーアカウント間の特定の外部認証リンクを削除するための確認フォームです。フォームにはリンク解除される認証名とDrupalユーザー名が表示され、削除前に確認が必要です。
権限 2
Hooks 1
hook_user_delete
ユーザーアカウントが削除されると、そのユーザーのすべてのauthmapエントリを自動的に削除し、データ整合性を確保します。
Troubleshooting 4
authmapテーブルをチェックして、ユーザーの外部authnameとプロバイダーのマッピングが存在することを確認してください。/admin/people/authmapの管理ビューを使用して認証名を検索します。マッピングが存在しない場合、ユーザーは最初に登録されるか、アカウントがリンクされる必要があるかもしれません。
これは通常、複数の認証プロバイダーがアクティブな場合に発生します。ビュー設定に'provider'フィールドを追加するか、/admin/people/authmap/samlauthのようなプロバイダー固有のURLを使用してプロバイダーでフィルタリングしてください。
この例外は、同じDrupalユーザー名を持つユーザーが既に存在する場合にスローされます。一意のユーザー名が生成されるようにするか(デフォルトはprovider_authname)、例外を処理して既存のアカウントにリンクしてください。
モジュールはhook_user_deleteを実装してauthmapエントリを自動的にクリーンアップします。モジュールが有効で正しく動作していることを確認してください。手動クリーンアップは管理インターフェースまたはデータベースで直接行えます。
Security Notes 5
- 外部認証モジュールは、externalauthサービスに渡す前に外部ソースからのauthnameとユーザーデータを検証する必要があります
- authmapエントリの削除操作には'delete authmap'パーミッションが必要です - 信頼できる管理者にのみ付与してください
- 削除フォームURLにauthnameが公開されないようにすることで、HTTPリファラーログへの外部識別子の漏洩を防いでいます
- authmapテーブルには機密性の高いマッピングデータが保存されます - 適切なデータベースアクセス制御を確保してください
- カスタム認証プロバイダーを実装する場合、login/registerサービスを呼び出す前に外部認証レスポンスが正当であることを検証してください