OpenID Connect / OAuthクライアント
OpenID Connectプロトコルのプラガブルなクライアント実装を提供し、外部アイデンティティプロバイダーを使用したユーザー認証を可能にします。
openid_connect
インストール
composer require 'drupal/openid_connect:8.x-1.4'
概要
OpenID Connectモジュールは、OAuth 2.0上に構築されたシンプルなアイデンティティレイヤーであるOpenID Connectプロトコルの包括的なプラガブルクライアント実装を提供します。Drupalサイトで、Google、Facebook、GitHub、LinkedIn、Oktaなどの外部OpenID Connectプロバイダー、およびGenericクライアントを使用したカスタムプロバイダーによるユーザー認証が可能になります。
ユーザーが初めてOpenID Connectプロバイダーでサインインすると、新しいDrupalユーザーアカウントが自動的に作成されます。このモジュールは、設定可能なクレームマッピングを通じて、アイデンティティプロバイダーからDrupalユーザーフィールドへのユーザープロファイル情報の同期をサポートします。ロールマッピング機能により、アイデンティティプロバイダーが提供するグループまたはクレームに基づいてDrupalロールを自動的に割り当てることができます。
このモジュールは、ログインブロック、標準ユーザーログインフォームへのログインボタンの設定可能な表示、および1つのプロバイダーのみが設定されている場合の自動ログインリダイレクトのサポートなど、柔軟な統合オプションを提供します。また、Drupalからログアウトするとアイデンティティプロバイダーでもセッションを終了できるシングルログアウト(SLO)機能もサポートしています。
Features
- Google、Facebook、GitHub、LinkedIn、Okta用の複数の組み込みOpenID Connectクライアントプラグイン、およびカスタムプロバイダー用のGenericクライアント
- 外部プロバイダーでの初回ログイン時にユーザーアカウントを自動作成
- アイデンティティプロバイダーからDrupalユーザーフィールドへのユーザープロファイル情報を同期するクレームマッピング
- アイデンティティプロバイダーのグループに基づいてDrupalロールを自動的に割り当てる実験的なロールマッピング
- well-known URIを介したエンドポイントの自動設定のためのOpenID Connect Discoveryサポート
- Drupalとアイデンティティプロバイダーの両方でセッションを終了するシングルログアウト(SLO)サポート
- 設定可能なログインボタン表示オプション:非表示、上部、下部、置換、または標準ログインフォームを強制置換
- アイデンティティプロバイダーへの自動リダイレクトのためのログインプロセス自動開始オプション
- ユーザーが外部プロバイダーアカウントのリンク/解除を管理できる連携アカウント管理
- アイデンティティプロバイダー起動のログインフローのためのISSベースSSO開始サポート
- IDトークン、アクセストークン、リフレッシュトークン、および有効期限追跡のためのセッショントークン管理
- 開発者がカスタムクライアントプラグインを作成できる拡張可能なプラグインアーキテクチャ
- OAuthフロー中のCSRF保護のためのステートトークン検証
Use Cases
Google WorkspaceによるエンタープライズSSO
Google Workspaceを使用している組織は、ユーザーが企業のGoogleアカウントを使用してDrupalイントラネットにログインできるようにすることができます。Googleクライアントを有効にし、Google Cloud ConsoleからのOAuth認証情報で構成すると、ユーザーは仕事用メールアドレスで認証できます。
コミュニティサイト向けソーシャルログイン
コミュニティサイトやメンバーシップサイトは、ユーザーが既存のFacebook、GitHub、またはLinkedInアカウントを使用してサインアップできるようにすることで、登録の障壁を下げることができます。これにより、ユーザーがさらに別のパスワードを作成して覚える必要がなくなります。
エンタープライズアイデンティティプロバイダーとの統合
GenericまたはOktaクライアントを使用して、企業はDrupalをAzure AD、Keycloak、Auth0、またはOpenID Connect準拠のプロバイダーなど、既存のアイデンティティ管理システムと統合できます。自動検出機能により、エンドポイントURLを自動的に取得して設定を簡素化します。
集中ユーザー管理
組織はアイデンティティプロバイダーでユーザーアカウントを集中管理し、変更を自動的にDrupalに同期させることができます。クレームマッピングによりユーザープロファイルフィールドが最新の状態に保たれ、ロールマッピングによりグループメンバーシップに基づいて権限を自動的に割り当てることができます。
SSOのみへのログイン制限
高セキュリティ環境では、管理者は標準ログインフォームを完全に置き換えて、すべてのユーザーが企業のアイデンティティプロバイダー経由で認証することを強制するようモジュールを構成できます。必要に応じて、管理者は「showcore」URLパラメータでエスケープハッチにアクセスできます。
GitHubベースチーム向け開発者認証
開発チームは、チームメンバーがGitHubアカウントを使用してログインできるようにGitHub認証を使用できます。これは、コントリビューターが既にGitHubアカウントを持っているオープンソースプロジェクトに特に便利です。
Tips
- OpenID Connect準拠のプロバイダーには自動検出を使用したGenericクライアントを使用して、設定を最小限に抑えることができます
- 本番環境にデプロイする前に、開発環境でOAuth設定をテストしてください
- 「置換」ログインフォームオプションを使用する場合、URLに?showcoreを追加することで標準ログインフォームにアクセスできます
- モジュールはユーザーのセッションにトークンを保存し、openid_connect.sessionサービスを使用してアイデンティティプロバイダーへのAPI呼び出しに取得できます
- カスタムクライアントプラグインは、OpenIDConnectClientBaseを拡張し、@OpenIDConnectClientアノテーションを使用して作成できます
- hook_openid_connect_pre_authorizeを使用して、特定のクレームを持つユーザーへのログイン制限など、カスタム認可ロジックを実装できます
- ロールマッピングは実験的機能です。本番環境で使用する前に十分にテストしてください
- セキュリティのため、「既存ユーザーを自動的に接続」はメールアドレスが検証される信頼できるアイデンティティプロバイダーでのみ有効にしてください
Technical Details
Admin Pages 4
/admin/config/people/openid-connect
設定されたすべてのOpenID Connectクライアントエンティティを一覧表示します。管理者は、このページから新しいクライアントの追加、既存の設定の編集、クライアントの有効化/無効化、クライアントの削除を行えます。
/admin/config/people/openid-connect/add/{plugin_id}
新しいOpenID Connectクライアントを追加するフォームです。使用可能なフィールドは選択したプラグインタイプによって異なります。
/admin/config/people/openid-connect/settings
OpenID Connectログイン動作、ユーザークレームマッピング、およびロールマッピングのグローバル設定です。
/user/{user}/connected-accounts
ユーザーが接続された外部アイデンティティプロバイダーアカウントを表示および管理できます。新しいプロバイダーを接続したり、既存の接続を解除したりできます。
権限 4
Hooks 9
hook_openid_connect_claims_alter
利用可能なOpenID Connectクレームのリストをモジュールが変更できるようにします。
hook_openid_connect_client_info_alter
新しいプラグインの追加やプラグインクラスの変更など、クライアントプラグイン定義をモジュールが変更できるようにします。
hook_openid_connect_user_properties_ignore_alter
クレームマッピングから除外するユーザープロパティをモジュールが変更できるようにします。
hook_openid_connect_userinfo_alter
認可前にアイデンティティプロバイダーから取得したユーザー情報をモジュールが変更できるようにします。
hook_openid_connect_pre_authorize
ユーザー認可前に実行されます。アクセスを拒否したり、ユーザーアカウントを上書きしたり、追加のチェックを実行したりできます。
hook_openid_connect_post_authorize
ユーザー認可成功後に実行されます。トークンの保存や追加処理に便利です。
hook_openid_connect_userinfo_claim_alter
ユーザープロパティにマッピングされる前に、個々のクレーム値をモジュールが変更できるようにします。
hook_openid_connect_userinfo_save
クレームマッピング後、ユーザーアカウント保存前に実行されます。追加の複雑なクレームのマッピングを許可します。
hook_openid_connect_redirect_logout_alter
ログアウト時のリダイレクトレスポンスをモジュールが変更できるようにします。
Troubleshooting 7
/admin/config/people/openid-connectで少なくとも1つのOpenID Connectクライアントが有効になっていることを確認してください。設定タブで「ユーザーログインフォームでのOpenIDボタン表示」設定が「非表示」に設定されていないことを確認してください。または、「OpenID Connectログイン」ブロックを表示可能なリージョンに配置してください。
アイデンティティプロバイダーで設定されたリダイレクトURLは、Drupalでクライアントを編集する際に表示されるURLと正確に一致する必要があります。URLに正しいプロトコル(https)、ドメイン、パスが含まれていることを確認してください。末尾のスラッシュを確認してください。
デフォルトでは、外部プロバイダーに接続されたユーザーはDrupalパスワードを変更できません。ユーザーがローカルパスワードを設定できるようにする場合は、適切なロールに「ローカル認証用のパスワードを設定」権限を付与してください。
自動ログインは、正確に1つのOpenID Connectクライアントが有効な場合にのみ機能します。複数のクライアントが有効な場合、ユーザーは手動でプロバイダーを選択する必要があります。また、「ログインプロセスを自動開始」設定が有効になっていることを確認してください。
「ログインごとにユーザークレームを保存」設定を確認してください。無効の場合、クレームはアカウントが最初に作成されたときのみ保存されます。また、設定ページでクレームマッピング設定を確認してください。
自動検出を使用する場合、Issuer URLが正しく、プロバイダーがOpenID Connect Discovery仕様をサポートしていることを確認してください。自動検出が失敗した場合は、エンドポイントを手動で構成してみてください。
「アイデンティティプロバイダーからログアウト」設定が有効になっていることを確認してください。すべてのプロバイダーがend sessionエンドポイントをサポートしているわけではありません。プロバイダーがこの機能をサポートしているか、クライアント設定でエンドポイントが構成されているか確認してください。
Security Notes 6
- 「既存ユーザーを自動的に接続」設定にはセキュリティ上の懸念があります。メールの一致に基づいてアカウントをリンクするため、メールアドレスを検証するアイデンティティプロバイダーでのみ有効にしてください。
- クライアントシークレットは安全に保管してください。バージョン管理にコミットしないでください。環境変数やシークレット管理システムの使用を検討してください。
- このモジュールのすべての権限は、その機密性により「アクセス制限」としてマークされています。慎重に付与してください。
- モジュールはOAuthフローでステートトークンを使用してCSRF保護を実装しています。
- ISS許可ドメインを設定する際は、SSOリクエストを開始することを信頼するドメインのみをリストしてください。
- 認可動作を変更するhook実装(pre_authorize、post_authorize)がセキュリティ脆弱性を導入しないように、レビューとテストを行ってください。