2026年9月27日
2026年9月27日
WordPressのOpenID Connect(OIDC)連携:OpenID Connect Generic Clientの設定手順
WordPress を OpenID Connect(OIDC)で社内の ID プロバイダー(IdP)とつなぐと、利用者は IdP のアカウントで WordPress にログインでき、パスワードや多要素認証は IdP 側でまとめて管理できます。この記事では、WordPress.org で公開されている OpenID Connect Generic Client(2026年11月時点のバージョン 3.11.3)を例に、IdP への登録から設定項目の選び方、wp-config.php での設定、うまくいかないときの確認までを説明します。OIDC の仕組みや SSO 導入の全体の考え方は、関連記事の「OpenID Connect(OIDC)を使ったSSOを設定する手順」で扱っています。
始める前に
- バックアップとステージング:サイトのファイルとデータベースのバックアップを取り、まずステージング環境で試します。
- 非常口:通常のパスワード(と2要素認証)でログインできる管理者アカウントを1つ残し、FTP / SFTP か WP-CLI でプラグインを無効化できることを確かめます。
- HTTPS:IdP とのやり取りやログイン用 Cookie を守るため、サイトは HTTPS で公開します。
- 対応バージョン:2026年11月時点で、このプラグインの検証済みバージョンは WordPress 6.9 です。新しい WordPress で使う場合は、ステージングで動作を確かめてください。
手順1:IdP にアプリを登録する
IdP(Microsoft Entra ID、Google Workspace、Okta、Keycloak など)の管理画面で、WordPress を「Web アプリケーション」として登録します。画面の名前は IdP ごとに違いますが、決める内容は共通です。
リダイレクト URI には、プラグインが使う次の URL を登録します。example.com は自分のサイトのドメインと WordPress のパスに置き換えます。
https://example.com/wp-admin/admin-ajax.php?action=openid-connect-authorize
IdP がリダイレクト URI にクエリ文字列を許さない場合は、プラグインの「Alternate Redirect URI」を有効にして、次の URL を登録します。この設定を変えたあとは、「設定」→「パーマリンク」で「変更を保存」を押してリライトルールを更新する必要があります。
https://example.com/openid-connect-authorize
ほかに次を決めます。
- スコープ:
openid email profileが一般的です。 - クライアント ID とクライアントシークレット:登録後に IdP が発行します。シークレットはパスワードと同じ扱いで、チャットやチケットに貼らないでください。
- ログアウト後の戻り先:IdP のログアウトも連動させる場合、WordPress のログアウト後の URL(通常は
https://example.com/wp-login.php?loggedout=true)を IdP の許可リストに登録します。
手順2:プラグインを入れて、エンドポイントを読み込む
「プラグイン」→「新規追加」で「OpenID Connect Generic Client」を検索してインストールし、有効化します。設定画面は「設定」→「OpenID Connect Generic」です。
設定画面の上部にある「Quick Setup: Import from Discovery Document」に、IdP のディスカバリー文書の URL を入れると、各エンドポイントの欄が自動で埋まります。ディスカバリー文書の URL は IdP の資料で確認してください。多くの場合、発行者(issuer)の URL の末尾に /.well-known/openid-configuration を付けた形です。
# 例: Google のディスカバリー文書の中身を確認する
curl -s https://accounts.google.com/.well-known/openid-configuration | python3 -m json.tool
読み込んだら、埋まった値を目で確認してから「変更を保存」を押します。
手順3:主な設定項目を決める
設定画面の項目は英語で表示されます。主なものと、最初に勧める値は次のとおりです。
| 設定項目 | 意味 | 最初に勧める値 |
|---|---|---|
| Login Type | ログイン画面にボタンを出すか、自動で IdP へ転送するか | 「OpenID Connect button on login form」(ボタン) |
| Client ID / Client Secret Key | IdP が発行した値 | IdP の値をそのまま |
| OpenID Scope | 要求するスコープ(空白区切り) | openid email profile |
| Login / Userinfo / Token Validation / End Session Endpoint URL、JWKS URI | IdP の各エンドポイント | ディスカバリー文書から読み込んだ値 |
| Identity Key | ユーザーを識別する値を、クレームのどこから取るか | sub |
| Nickname Key | ニックネームに使うクレーム | preferred_username など |
| Email Formatting | メールアドレスの組み立て方 | {email} |
| Link Existing Users | 同じメールアドレス(または同じユーザー名)の既存ユーザーがいれば、そのユーザーとしてログインさせる | 既存ユーザーを使うなら有効 |
| Create user if does not exist | 紐付くユーザーがいなければ新規作成する | 既存ユーザーだけに限るなら無効 |
| Enforce Privacy | ログインしないとサイトを見られないようにする | 社内向けサイトだけ有効 |
| Enable Logging | 簡単なログを記録する | 調査するときだけ有効 |
いくつかの項目は注意が必要です。
Login Type は最初「ボタン」にする:自動転送(Auto Login - SSO)にすると、設定に誤りがあったときに通常のログイン画面に戻りにくくなります。ボタンで動作を確かめてから切り替えます。
Identity Key は sub を選ぶ:初期値は preferred_username ですが、ユーザー名は IdP 側で変更されることがあります。sub は IdP がユーザーごとに発行する変わらない値で、設定画面の説明でも、迷ったら sub を使うよう書かれています。プラグインは、この値をユーザーごとの情報として保存し、次回以降のログインで同じ WordPress ユーザーを見つけるのに使います。
Link Existing Users はメールアドレスで照合する:「Identify with User Name」を有効にしない限り、既存ユーザーとの照合はメールアドレスで行われます。メールアドレスの所有確認をしていない IdP と組み合わせると、他人のメールアドレスで既存の管理者に成り代われる危険があります。自社で管理している IdP に限って使ってください。
Create user if does not exist は初期状態で有効:IdP にアカウントがある人なら誰でも WordPress のユーザーが作られます。作られたユーザーの権限は、「設定」→「一般」の「新規ユーザーのデフォルト権限グループ」になるので、「購読者」になっているか確認します。既存のユーザーだけにログインを許すなら、この項目を無効にし、IdP 側でもアプリを使える人を割り当てで絞ります。
Disable SSL Verify と Allow Internal IDP は本番で使わない:前者はローカル開発環境(WP_DEBUG が true で、環境の種類が local)でしか効かない設計です。後者は社内ネットワーク内の IdP に接続するための設定で、有効にするとサーバーから内部ネットワークへのリクエストを許すことになるため、必要な場合に限ります。
手順4:秘密情報を wp-config.php で渡す
このプラグインは、主な設定を wp-config.php の定数で指定できます。定数で指定した項目は設定画面で編集できなくなり、データベースのバックアップにシークレットが残りません。wp-config.php の「編集が必要なのはここまでです」の行より前に書きます。
<?php
// wp-config.php の「編集が必要なのはここまでです」より前に書く
define( 'OIDC_LOGIN_TYPE', 'button' );
define( 'OIDC_CLIENT_ID', 'wordpress-example' );
define( 'OIDC_CLIENT_SECRET', getenv( 'OIDC_CLIENT_SECRET' ) );
define( 'OIDC_CLIENT_SCOPE', 'openid email profile' );
define( 'OIDC_ENDPOINT_LOGIN_URL', 'https://idp.example.com/oauth2/v1/authorize' );
define( 'OIDC_ENDPOINT_TOKEN_URL', 'https://idp.example.com/oauth2/v1/token' );
define( 'OIDC_ENDPOINT_USERINFO_URL', 'https://idp.example.com/oauth2/v1/userinfo' );
define( 'OIDC_ENDPOINT_LOGOUT_URL', 'https://idp.example.com/oauth2/v1/logout' );
define( 'OIDC_ENDPOINT_JWKS_URL', 'https://idp.example.com/oauth2/v1/keys' );
define( 'OIDC_LINK_EXISTING_USERS', 1 );
define( 'OIDC_CREATE_IF_DOES_NOT_EXIST', 0 );
エンドポイントの URL は例です。実際の値は、IdP のディスカバリー文書に書かれているものを使ってください。シークレットは、サーバーの環境変数に入れて getenv() で読むと、wp-config.php 自体にも書かずに済みます。ほかに OIDC_ISSUER、OIDC_ACR_VALUES、OIDC_ENFORCE_PRIVACY、OIDC_REDIRECT_USER_BACK、OIDC_REDIRECT_ON_LOGOUT、OIDC_ENABLE_LOGGING、OIDC_LOG_LIMIT も使えます。Identity Key のように定数が用意されていない項目は、設定画面で指定します。
手順5:ログインボタンを置く場所
Login Type をボタンにすると、wp-login.php のログインフォームに「Login with OpenID Connect」ボタンが表示されます。文言は「Login Button Text」で変えられます。
ログイン画面以外(会員ページなど)にボタンを置きたい場合は、プラグインが用意するショートコードを、ブロックエディターのショートコードブロックに入れます。
[openid_connect_generic_login_button]
ログイン後に元のページへ戻したい場合は「Redirect Back to Origin Page」を有効にします。
手順6:テストする
ステージングで、少なくとも次を確かめます。
- 既存ユーザーが SSO でログインし、別のユーザーが重複して作られないか
- 新しく作られたユーザーの権限が想定どおり(購読者など)か
- IdP 側で割り当てを外した人や、無効にしたアカウントがログインできなくなるか
- WordPress からログアウトしたとき、IdP のセッションも終わるか
ロールを IdP のグループに合わせて変えたい場合、このプラグイン自体にはその設定がありません。ログインのたびに呼ばれる openid-connect-generic-update-user-using-current-claim アクションを使って、受け取ったクレームからロールを設定するコードを追加します。例は Okta 連携の関連記事で紹介しています。
うまくいかないとき
- IdP の画面で redirect_uri が一致しないと表示される:IdP に登録した URL と、プラグインが送る URL を見比べます。
httpとhttps、wwwの有無、末尾のスラッシュ、Alternate Redirect URI の設定が食い違っていないかを確認します。 - Alternate Redirect URI にしたら 404 になる:「設定」→「パーマリンク」で「変更を保存」を押して、リライトルールを更新します。
- ログインはできるが、別のユーザーが作られる:Identity Key が
sub以外になっていないか、Link Existing Users が有効か、IdP から届くメールアドレスが WordPress のユーザーと同じかを確認します。 - トークンの検証に失敗する:サーバーの時刻がずれていると ID トークンの有効期限の確認に失敗します。NTP による時刻同期が有効か確認します。発行者が合わない場合は、ディスカバリー文書の
issuerの値を「Issuer」に入れます。 - キャッシュの影響:ページキャッシュや CDN がコールバックの URL をキャッシュしていると失敗するので、該当する URL をキャッシュの対象から外します。
「Enable Logging」を有効にすると、設定画面の下にログが表示されます。ログはデータベースのオプションとして保存され、ユーザー情報が含まれることがあるため、調査が終わったら無効にします。
締め出された場合は、FTP / SFTP でプラグインのフォルダー名を変えるか、WP-CLI で無効化すると通常のログインに戻れます。
wp plugin deactivate daggerhart-openid-connect-generic
まとめ
- リダイレクト URI は
admin-ajax.php?action=openid-connect-authorize、クエリを使えない IdP では Alternate Redirect URI を使う - エンドポイントはディスカバリー文書から読み込み、Identity Key は
subにする - 新規ユーザーの自動作成は初期状態で有効なので、必要かどうかを決め、デフォルト権限グループを確認する
- シークレットは
wp-config.phpの定数と環境変数で渡す - 最初はボタン方式で試し、非常用の管理者とプラグインの無効化手段を残しておく