はじめに
Drupal の Cognito モジュールでどのようなことができるのかを確認しました。
先に結論
- Cognito の「新規登録 / ログイン / パスワードリセット」の機能が Drupal で利用できる
- 使用感としては、標準の Drupal のローカル認証フローと変わりない
- そのため、使用感の面でこのモジュールを使う理由はあまり見当たらない
- MFA、SSO、OIDC、パスキー等の多様な Cognito の機能は利用できない
- これらの機能を求める場合、OIDC Connect モジュールを使って Cognito を IdP に設定する方がよさげ
- ログインフォームを Drupal 側で提供したい場合に、このモジュールをベースにカスタムモジュールを開発するという用途で採用するのはあり
環境
- macOS (Apple Silicon)
- DDEV v1.24.10
- Drupal 11.3.3
- PHP 8.3
モジュール
- drupal/cognito 2.2.0
Drupal 環境の構築
1. DDEV プロジェクトの作成と Drupal のインストール
mkdir drupal-cognito && cd drupal-cognito
ddev config \
--project-name=drupal-cognito \
--project-type=drupal11 \
--docroot=web \
--php-version=8.3
ddev start
ddev composer create-project drupal/recommended-project:^11 --no-interaction
ddev composer require drush/drush --no-interaction
ddev drush site:install standard \
--site-name="Drupal Cognito" \
--account-name=admin \
--account-pass=admin \
--yes
インストール完了後、ブラウザでサイトにアクセスして Drupal が起動していることを確認します。
2. Cognito モジュールのインストール
ddev composer require drupal/cognito:^2.2 --no-interaction
ddev composer require "phpseclib/phpseclib:^2" --no-interaction
ddev drush en cognito --yes
3. ユーザー登録設定の変更
Drupal のデフォルトでは「管理者のみアカウント作成」になっています。Cognito 経由のセルフ登録を使うため、訪問者による登録を許可します。
ddev drush config:set user.settings register visitors --yes
設定ファイルの構成
1. settings.local.php の作成
Cognito の接続情報は環境変数から読み取り、Git 管理外の settings.local.php に分離します。
web/sites/default/settings.local.php を新規作成:
<?php
/**
* @file
* Local settings for Cognito integration.
*/
$settings['cognito'] = [
'region' => getenv('COGNITO_REGION') ?: '',
'credentials' => [
'key' => getenv('COGNITO_ACCESS_KEY') ?: '',
'secret' => getenv('COGNITO_SECRET_KEY') ?: '',
],
'user_pool_id' => getenv('COGNITO_USER_POOL_ID') ?: '',
'client_id' => getenv('COGNITO_CLIENT_ID') ?: '',
];
各キーは drupal/cognito モジュールが要求する構造に対応しています:
| キー | 用途 |
|---|---|
region |
AWS リージョン(例: ap-northeast-1) |
credentials.key |
IAM アクセスキー ID |
credentials.secret |
IAM シークレットアクセスキー |
user_pool_id |
Cognito User Pool ID(例: ap-northeast-1_XXXXXXX) |
client_id |
Cognito App Client ID |
2. settings.php の変更
web/sites/default/settings.php の末尾にある settings.local.php の読み込みがコメントアウトされているので、解除します。
// 変更前
# if (file_exists($app_root . '/' . $site_path . '/settings.local.php')) {
# include $app_root . '/' . $site_path . '/settings.local.php';
# }
// 変更後
if (file_exists($app_root . '/' . $site_path . '/settings.local.php')) {
include $app_root . '/' . $site_path . '/settings.local.php';
}
3. ddev 環境変数の注入
.ddev/docker-compose.cognito-env.yaml を新規作成:
services:
web:
env_file:
- .env.cognito
.ddev/.env.cognito.example を新規作成(テンプレート / Git 管理対象):
# AWS Cognito Configuration
# Copy this file to .env.cognito and fill in your values.
# DO NOT commit .env.cognito to Git.
COGNITO_REGION=us-east-1
COGNITO_ACCESS_KEY=YOUR_AWS_ACCESS_KEY_ID
COGNITO_SECRET_KEY=YOUR_AWS_SECRET_ACCESS_KEY
COGNITO_USER_POOL_ID=us-east-1_XXXXXXXXX
COGNITO_CLIENT_ID=YOUR_COGNITO_APP_CLIENT_ID
.ddev/.env.cognito を新規作成
COGNITO_REGION=
COGNITO_ACCESS_KEY=
COGNITO_SECRET_KEY=
COGNITO_USER_POOL_ID=
COGNITO_CLIENT_ID=
4. .gitignore
プロジェクトルートに .gitignore を作成し、秘密情報を除外します。
# Secrets - never commit
.ddev/.env.cognito
# Drupal local settings
web/sites/default/settings.local.php
AWS リソースの作成
AWS CLI で Cognito User Pool、App Client、IAM User を作成します。
1. Cognito User Pool の作成
aws cognito-idp create-user-pool \
--pool-name drupal-cognito-pool \
--auto-verified-attributes email \
--username-attributes email \
--schema Name=email,Required=true \
--region ap-northeast-1 \
--output json
レスポンスから UserPool.Id を控えます。
{
"UserPool": {
"Id": "ap-northeast-1_aDIs4kicV",
"Name": "drupal-cognito-pool",
...
}
}
--auto-verified-attributes emailは必須: これを省略すると確認メールが送信されません。
AWS 側で作成したプールを確認するとこんな感じ。
2. App Client の作成
aws cognito-idp create-user-pool-client \
--user-pool-id <UserPoolId> \
--client-name drupal-app \
--no-generate-secret \
--explicit-auth-flows ALLOW_ADMIN_USER_PASSWORD_AUTH ALLOW_REFRESH_TOKEN_AUTH \
--region ap-northeast-1 \
--output json
App Client の設定ポイント:
| 設定 | 値 | 理由 |
|---|---|---|
--no-generate-secret |
シークレットなし | モジュールが SECRET_HASH に非対応 |
ALLOW_ADMIN_USER_PASSWORD_AUTH |
有効 | モジュールが ADMIN_NO_SRP_AUTH フローを使用 |
ALLOW_REFRESH_TOKEN_AUTH |
有効 | トークンリフレッシュに必要 |
レスポンスから ClientId を控えます。
3. IAM User の作成とアクセスキー発行
aws iam create-user --user-name drupal-cognito-service
aws iam create-access-key --user-name drupal-cognito-service --output json
レスポンスから AccessKeyId と SecretAccessKey を控えます。
4. IAM ポリシーの作成・アタッチ
drupal/cognito モジュールのソースコード(src/Aws/Cognito.php)が実際に呼び出す17の API 操作のみを許可する最小権限ポリシーを作成します。
aws iam create-policy \
--policy-name drupal-cognito-policy \
--policy-document '{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"cognito-idp:AdminInitiateAuth",
"cognito-idp:AdminRespondToAuthChallenge",
"cognito-idp:SignUp",
"cognito-idp:ConfirmSignUp",
"cognito-idp:ResendConfirmationCode",
"cognito-idp:ForgotPassword",
"cognito-idp:ConfirmForgotPassword",
"cognito-idp:GetUser",
"cognito-idp:GetUserAttributeVerificationCode",
"cognito-idp:VerifyUserAttribute",
"cognito-idp:UpdateUserAttributes",
"cognito-idp:ChangePassword",
"cognito-idp:AdminGetUser",
"cognito-idp:AdminCreateUser",
"cognito-idp:AdminUpdateUserAttributes",
"cognito-idp:AdminEnableUser",
"cognito-idp:AdminDisableUser"
],
"Resource": "arn:aws:cognito-idp:ap-northeast-1:<ACCOUNT_ID>:userpool/<USER_POOL_ID>"
}
]
}'
aws iam attach-user-policy \
--user-name drupal-cognito-service \
--policy-arn "arn:aws:iam::<ACCOUNT_ID>:policy/drupal-cognito-policy"
5. 環境変数ファイルへの反映と再起動
取得した値で .ddev/.env.cognito を更新します。
COGNITO_REGION=ap-northeast-1
COGNITO_ACCESS_KEY=AKIXXXXXXXXXXXXXXX
COGNITO_SECRET_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
COGNITO_USER_POOL_ID=ap-northeast-1_XXXXXXXXX
COGNITO_CLIENT_ID=XXXXXXXXXXXXXXXXXXXXXXXXXX
ddev restart
設定が反映されたことを確認します。
ddev exec printenv | grep COGNITO
COGNITO_REGION=ap-northeast-1
COGNITO_ACCESS_KEY=AKIXXXXXXHXXXXXXXX
COGNITO_SECRET_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
COGNITO_USER_POOL_ID=ap-northeast-1_XXXXXXXXX
COGNITO_CLIENT_ID=XXXXXXXXXXXXXXXXXXXXXXXXXX
動作確認
ユーザー登録
-
/user/registerにアクセスします。Cognito モジュールによるユーザー登録フォームが表示されます。
- 実在するメールアドレスとパスワードを入力して送信します。Cognito がメールアドレスに確認コードを送信します。
- メールに届いた確認コードを入力して認証を完了します。
Cognito 側も確認します。"Confirmation status" が "Confirmed" になっていることが確認できます。
上が登録完了したユーザアカウントです。下は認証コード入力待ちの状態のユーザアカウントです。
ログイン
-
/user/loginにアクセスします。パスワードログインフォームが表示されます。
- 登録済みのメールアドレスとパスワードを入力してログインします。
パスワードリセット
-
/user/passwordにアクセスします。
- 登録済みのメールアドレスを入力して送信すると、Cognito からリセットコードがメールで届きます。
管理者ログイン
Cognito モジュールは /user/login を Cognito 認証フォームに置き換えるため、Drupal ローカルの admin アカウントでログインするには drush のワンタイムリンクを使用します。
ddev drush user:login
生成された URL をブラウザで開くと、admin として即座にログインできます。
Cognito 管理画面
admin でログイン後、/admin/config/people/cognito/settings で設定を変更できます。
基本的に、出力メッセージのカスタマイズのみのようです。
トラブルシューティング
Class "phpseclib\Crypt\RSA" not found
gree/jose が phpseclib v2 の名前空間を参照しているが、v3 がインストールされている場合に発生します。ddev composer require "phpseclib/phpseclib:^2" で解決します。
SECRET_HASH is required but was not provided
クライアントシークレットありの App Client を設定している場合に発生します。drupal/cognito モジュールは SECRET_HASH の計算・送信に対応していません。--no-generate-secret を付けて新しい App Client を作成し直してください。
aws cognito-idp create-user-pool-client \
--user-pool-id <UserPoolId> \
--client-name drupal-app \
--no-generate-secret \
--explicit-auth-flows ALLOW_ADMIN_USER_PASSWORD_AUTH ALLOW_REFRESH_TOKEN_AUTH \
--region ap-northeast-1
確認メールが届かない / スパムに振り分けられる
Cognito のデフォルトメールサービス(COGNITO_DEFAULT)は no-reply@verificationemail.com から送信します。Gmail など一部のメールサービスでスパムフォルダに振り分けられることがあります。まずスパムフォルダを確認してください。
本番環境では Amazon SES を設定してカスタムドメインから送信することを検討してください。
ユーザーが UNCONFIRMED 状態のまま
User Pool 作成時に --auto-verified-attributes email を指定していない場合、確認メールが送信されずユーザーが UNCONFIRMED 状態になります。
既存の User Pool に設定を追加する:
aws cognito-idp update-user-pool \
--user-pool-id <UserPoolId> \
--auto-verified-attributes email \
--region ap-northeast-1
管理者として手動でユーザーを確認する:
aws cognito-idp admin-confirm-sign-up \
--user-pool-id <UserPoolId> \
--username user@example.com \
--region ap-northeast-1
Missing required client configuration options: region
.ddev/.env.cognito の COGNITO_REGION が空の場合に発生します。AWS リージョン(例: ap-northeast-1)を設定して ddev restart してください。
Your account is blocked
Drupal のユーザー登録設定が「管理者承認制」(visitors_admin_approval)になっている場合、新規ユーザーはブロック状態で作成されます。
# ユーザーのブロック解除
ddev drush user:unblock user@example.com
# 登録設定を「承認不要」に変更
ddev drush config:set user.settings register visitors --yes
ログ確認コマンド
# Drupal watchdog ログ
ddev drush watchdog:show --count=20
# Cognito 設定値の確認
ddev drush php:eval "print_r(\Drupal\Core\Site\Settings::get('cognito'));"
# 環境変数の確認
ddev exec printenv | grep COGNITO
終わりに
Drupal 11 の Cognito モジュールを使うことで、AWS Cognito と Drupal を連携させられることが確認できました。
一方で、このモジュールが対応しているのは「新規登録 / ログイン / パスワード再設定」のみです。
MFA や SSO、パスキーなどの Cognito が提供する多様な認証方法には対応していません。
使用感としては Drupal 標準のログインフローと変わらず、中途半端かなと思いました。
Cognito を使うなら、OIDC Connect モジュールを使って Cognito を IdP に設定し、Cognito 側の認証画面を利用した方が、Cognito の機能を最大限に活用できます。
ログインフォームをどうしても Drupal 側で表示したいユースケースでは、1からカスタムモジュールを作るより、このモジュールをベースにカスタマイズする形で実現するとよさそうです。















