0
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 の Cognito モジュール検証

0
Last updated at Posted at 2026-02-23

はじめに

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 が起動していることを確認します。

image.png

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 側で作成したプールを確認するとこんな感じ。

image.png

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

レスポンスから AccessKeyIdSecretAccessKey を控えます。

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

動作確認

ユーザー登録

  1. /user/register にアクセスします。Cognito モジュールによるユーザー登録フォームが表示されます。

image.png

image.png

  1. 実在するメールアドレスとパスワードを入力して送信します。Cognito がメールアドレスに確認コードを送信します。

image.png

image.png

  1. メールに届いた確認コードを入力して認証を完了します。

image.png

image.png

Cognito 側も確認します。"Confirmation status" が "Confirmed" になっていることが確認できます。

image.png

上が登録完了したユーザアカウントです。下は認証コード入力待ちの状態のユーザアカウントです。

ログイン

  1. /user/login にアクセスします。パスワードログインフォームが表示されます。

image.png

  1. 登録済みのメールアドレスとパスワードを入力してログインします。

image.png

パスワードリセット

  1. /user/password にアクセスします。

image.png

  1. 登録済みのメールアドレスを入力して送信すると、Cognito からリセットコードがメールで届きます。

image.png

image.png

管理者ログイン

Cognito モジュールは /user/login を Cognito 認証フォームに置き換えるため、Drupal ローカルの admin アカウントでログインするには drush のワンタイムリンクを使用します。

ddev drush user:login

生成された URL をブラウザで開くと、admin として即座にログインできます。

image.png

Cognito 管理画面

admin でログイン後、/admin/config/people/cognito/settings で設定を変更できます。

基本的に、出力メッセージのカスタマイズのみのようです。

image.png

トラブルシューティング

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.cognitoCOGNITO_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からカスタムモジュールを作るより、このモジュールをベースにカスタマイズする形で実現するとよさそうです。

0
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
0
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?