SAML / WordPress & Keycloak

SAML認証をWordPressとKeycloakを使ってやってみました。

参考)「KeycloakでSAMLを使ってみる(WordPress編)」
https://qiita.com/katakura__pro/items/1e65e0bde7fda75332a1

環境)

php v8.1
apache 2.4.52
mysql 8.0.32
WordPress 6.1.1
OneLogin SAML SSO v3.4.0

Keycloak-15.0.2
OpenJDK 11.10.18

Webブラウザ: 192.168.1.228 / Chrome / windows
Keycloak(n07): 192.168.1.148 / Ubuntu 20.04
WordPress(n01): 192.168.1.217(decode2.red:hostsに記述) / Ubuntu 22.04

※Keycloakは前回と同じ。WordPressのセットアップはここでは割愛。

WordPressはブログエンジンとして有名で、このブログでも利用させていただいております。
ここでは、WordPressを利用するユーザをKeycloakに登録されたユーザで認証するテストです。WordPressのログイン画面を使わないだけですので、ユーザは両方に登録する必要があります。(ユーザIDとメールアドレス)

WordPressのSAML関連のプラグイン

最初は、現在のWPバージョンと互換性があるということと、インストール数が多いのでminiOrangeのプラグインを使いましたが、すべての機能を使うのには有料ということに途中で気づき、参考記事あるOneLOginにしました。(未検証ということでいろいろと修正が必要でした)
プラグインはローカルのWordPressということもあり、プラグイン画面からのインストールではなくwp-content/pluginsフォルダにダウンロードしたファイルを置きました。

設定に関しては項目が多いのと、注意事項があることから、最初に動作させた画面とSAML認証のフローを確認します。

ブログ画面http://decode2.red/wp/にアクセス
※本来ブログの閲覧は、認証は不要ですが、保護領域としてここに設定しました。/wp/wp-admin/という管理者用ログインにも対応します。(ブログ画面だけでなく、それぞれのダッシュボードにアクセスできることも確認)
※user22というユーザは、WordPressで管理者権限も持つようにしておきます。(管理者をわけるとWordPressの設定用のadminをKeycloakに登録する必要があるため)

一瞬下記画面が現れリダイレクト


※「こんにちは」の後にある姓名は、WordPressの設定によるもの

WordPressのログイン画面(wp-login.php)がスキップされているのを確認できました。

KeyCloak設定

参考サイトでは、”Client Signature Required”をONにしますが、下記エラーのためOFFにしました。

ERROR [org.keycloak.protocol.saml.SamlService] (default task-16) request validation failed: org.keycloak.common.VerificationException: SigAlg was null
….
WARN [org.keycloak.events] (default task-16) type=LOGIN_ERROR, realmId=wp, clientId=null, userId=null, ipAddress=192.168.1.228, error=invalid_signature

参考) 「テスト用keycloak&saml構築」
https://dev.growi.org/5e4cfa39a2bdcf0048d69eb9

ONの場合、”Keys”タブがあわられ、PrivateKey, CertificateをWordPress側に記述します。

あとはusernameとemailをマッピングします。


WordPress設定

項目が多いため空欄以外をのせました。
entityID、X509Certificateは下記から取得します。
http://192.168.1.148:800/auth/realms/wp/protocol/saml/descriptor

未検証のプラグインのため下記を参考にコード修正が必要でした。
「Support duplicated Attribute Names?」
https://github.com/SAML-Toolkits/php-saml/issues/223
「How to Solve “Fatal Error: Call to Undefined Function is_plugin_active()” Problem on WordPress」
https://www.aurodigo.com/how-to-solve-fatal-error-call-to-undefined-function-is-plugin-active-problem-on-wordpress

最後にWordPressでログアウトしたときの挙動ですが、まだセッションが有効になっていますので、再びページにアクセスするとログインした状態になります。
実際に動かしてみないとわからないことがいろいろとありました。