1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Drupal で OIDC サーバーを構築し、別の Drupal サイトから SSO ログインする

1
Posted at

Drupal の Simple OAuth モジュールを使って OIDC (OpenID Connect) サーバーを構築し、別の Drupal サイトをクライアントとして SSO ログインを行う動作確認を行います。

環境

  • macOS (Apple Silicon)
  • DDEV v1.24.10
  • Drupal 11.3.2
  • PHP 8.3

構成概要

役割 サイト名 URL モジュール
OIDC サーバー (IdP) drupal-oidc-server http://drupal-oidc-server.ddev.site:33000 Simple OAuth
OIDC クライアント (RP) drupal-oidc-client http://drupal-oidc-client.ddev.site:33001 OpenID Connect

備考:見分けやすくするため、IdP は青(#1565c0)、RP は緑(#2e7d32)のテーマカラーを設定しています。

インストールプロファイルについて

本記事では、環境構築を簡単に行うためのインストールプロファイルを使用します。プロファイルを使うことで、モジュールの有効化や設定が自動で行われます。

プロファイルは以下のリポジトリで公開しています:

プロファイルのファイル構成

web/profiles/oidc_server_profile/
├── oidc_server_profile.info.yml
├── oidc_server_profile.install
└── config/
    └── install/
        ├── simple_oauth.settings.yml
        └── olivero.settings.yml

web/profiles/oidc_client_profile/
├── oidc_client_profile.info.yml
├── oidc_client_profile.install
└── config/
    └── install/
        ├── openid_connect.settings.yml
        ├── openid_connect.client.drupal_server.yml
        └── olivero.settings.yml

サーバー側の構築

1. DDEV プロジェクトの作成と Drupal のインストール

mkdir drupal-oidc-server
cd drupal-oidc-server
ddev config --project-type=drupal --php-version=8.3 --docroot=web --project-name=drupal-oidc-server
ddev start
ddev composer create drupal/recommended-project:^11
ddev composer require drush/drush 'drupal/simple_oauth:^6.1'

2. プロファイルの配置

drupal-oidc-example リポジトリからプロファイルをコピーします。

git clone https://github.com/tarohida/drupal-oidc-example.git /tmp/drupal-oidc-example
cp -r /tmp/drupal-oidc-example/web/profiles/oidc_server_profile web/profiles/

3. プロファイルを使ってインストール

ddev drush site:install oidc_server_profile --account-name=admin --account-pass=admin -y

プロファイルが自動で以下の設定を行います:

  • Simple OAuth モジュールの有効化
  • テーマカラーを青(#1565c0)に設定
  • デフォルト Consumer(drupal_oidc_client)の作成
  • 管理者メールアドレスの設定

4. RSA 鍵ペアの生成

Simple OAuth はトークンの署名に RSA 鍵を使用します。セキュリティのため、鍵ファイルは Web ルート外に配置します。

ddev exec mkdir -p /var/www/oauth_keys
ddev exec openssl genrsa -out /var/www/oauth_keys/private.key 2048
ddev exec openssl rsa -in /var/www/oauth_keys/private.key -pubout -out /var/www/oauth_keys/public.key
ddev exec chmod 600 /var/www/oauth_keys/private.key
ddev exec chmod 600 /var/www/oauth_keys/public.key

5. 設定の確認

管理画面「Configuration > People > Simple OAuth」(/admin/config/people/simple_oauth)で鍵ファイルのパスが設定されていることを確認します。

image.png

「Configuration > Web services > Consumers」(/admin/config/services/consumer)で Consumer が作成されていることを確認します。

image.png

プロファイルによって作成される Consumer の設定値:

項目
Label Drupal OIDC Client
Client ID drupal_oidc_client
Secret client_secret_test_123
Is Confidential チェック
Is this consumer 3rd party? チェック
Redirect URI http://drupal-oidc-client.ddev.site:33001/openid-connect/drupal_server
Grant types Authorization Code, Refresh Token
Access token expiration 3600

クライアント側の構築

1. DDEV プロジェクトの作成と Drupal のインストール

mkdir drupal-oidc-client && cd drupal-oidc-client
ddev config --project-type=drupal --php-version=8.3 --docroot=web --project-name=drupal-oidc-client
ddev start
ddev composer create drupal/recommended-project:^11
ddev composer require drush/drush 'drupal/openid_connect:^3@alpha'

現時点では OpenID Connect モジュールは alpha 版のみのため、stability フラグを指定してインストールします。

2. プロファイルの配置

drupal-oidc-example リポジトリからプロファイルをコピーします。

cp -r /tmp/drupal-oidc-example/web/profiles/oidc_client_profile web/profiles/

(サーバー側の構築時にリポジトリをクローン済みの場合)

もしくは、リポジトリを再度クローンする場合:

git clone https://github.com/tarohida/drupal-oidc-example.git /tmp/drupal-oidc-example
cp -r /tmp/drupal-oidc-example/web/profiles/oidc_client_profile web/profiles/

3. プロファイルを使ってインストール

ddev drush site:install oidc_client_profile --account-name=admin --account-pass=admin -y

プロファイルが自動で以下の設定を行います:

  • OpenID Connect モジュールの有効化
  • テーマカラーを緑(#2e7d32)に設定
  • デフォルト OpenID Connect クライアント(Drupal OIDC Server)の作成
  • ログインフォームへの OIDC ボタン表示(user_login_display: above)
  • 既存ユーザーとの連携を許可(connect_existing_users: true)
  • 管理者メールアドレスの設定

4. 設定の確認

「Configuration > People > OpenID Connect」(/admin/config/people/openid-connect)でクライアントが作成されていることを確認します。

image.png

プロファイルによって作成される OpenID Connect クライアントの設定値:

項目
Name Drupal OIDC Server
Client ID drupal_oidc_client
Client secret client_secret_test_123
Authorization endpoint http://drupal-oidc-server.ddev.site:33000/oauth/authorize
Token endpoint http://drupal-oidc-server.ddev.site:33000/oauth/token
UserInfo endpoint http://drupal-oidc-server.ddev.site:33000/oauth/userinfo
Scopes openid email profile

動作確認

ログインフロー

  1. クライアント側のログインページ(http://drupal-oidc-client.ddev.site:33001/user/login)にアクセスします。ログインフォームの上に「Drupal OIDC Server」ボタンが表示されています。

image.png

  1. 「Drupal OIDC Server」ボタンをクリックします。

  2. サーバー側の認可画面にリダイレクトされます。未ログインの場合はまずログインフォームが表示されます。

image.png

  1. サーバー側で admin / admin でログイン後、認可確認画面が表示されます。

  2. 「Authorize」をクリックすると、クライアント側にリダイレクトされ、ログインが完了します。

image.png

Simple OAuth のエンドポイント一覧

エンドポイント パス 用途
Authorization /oauth/authorize 認可コード取得
Token /oauth/token アクセストークン取得
UserInfo /oauth/userinfo ユーザー情報取得(OIDC)
JWKS /oauth/jwks 公開鍵取得(JWT 検証用)

トラブルシューティング

"The email address is already taken" エラー

クライアント側で connect_existing_users を有効にするか、テスト用に別のメールアドレスを持つユーザーを作成してください。本記事のプロファイルでは、サーバー側とクライアント側で異なるメールアドレスを設定しているため、このエラーは発生しません。

scopes 関連のエラー

OpenID Connect モジュールの Generic クライアント設定で scopes が未設定だとエラーになります。本記事のプロファイルでは openid email profile を設定済みです。

end_session_endpoint の警告

Generic クライアントでは end_session_endpoint が必須項目として扱われる場合があります。本記事のプロファイルでは空文字列を設定して警告を回避しています。

RSA 鍵が見つからないエラー

サーバー側で RSA 鍵ペアを生成していない場合、トークン発行時にエラーが発生します。「RSA 鍵ペアの生成」の手順を実行してください。

終わりに

Drupal の Simple OAuth モジュールを使って OIDC サーバーを構築し、別の Drupal サイトから SSO ログインできることを確認しました。

インストールプロファイルを使用することで、モジュールの有効化や設定を自動化し、環境構築の手間を大幅に削減できます。

Simple OAuth は League OAuth2 Server をベースにしており、Authorization Code Flow、Client Credentials、Refresh Token などの標準的な OAuth 2.0 / OIDC フローをサポートしています。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?