onelogin/php-samlで実現するPHP SAML認証:基本設定から動作確認まで
作成日:2025.09.25
軽量ライブラリである onelogin/php-saml を利用して、PHPでSAML認証を実装する方法を詳しく解説します。Composerによるインストールから、証明書・秘密鍵の準備、設定ファイルの作成、そしてSPのメタデータ生成やSSO・ACSの各スクリプトまで、SAML認証の基本設定と動作確認の一連の流れをサンプルコードを交えて紹介。
目次
PHP で SAML認証処理を実装する手段として、過去に SimpleSAMLphp を利用した例を紹介しました。
しかし、SimpleSAMLphp は機能が豊富である反面、設定や運用が複雑になることがあります。そこで、今回はより軽量でシンプルなライブラリである onelogin/php-saml を利用した SAML認証の実装方法を紹介します。
ローカル環境で動作するシンプルな SP(Service Provider) を構築し、SAML認証の基本的な流れを理解することを目的とします。
導入方法
まず、Composer を使用して onelogin/php-saml ライブラリをインストールします。以下のコマンドを実行してください。
composer require onelogin/php-saml
証明書と秘密鍵の準備
SAML認証には、SP(Service Provider) と IdP(Identity Provider) 間の通信を保護するための証明書と秘密鍵が必要です。
今回はSP用として、ローカル環境でのテストのために、自己署名証明書を生成します。OpenSSLで作る自己署名証明書 ― コマンドラインで実践するオレオレ証明書作成手順 などを参照。
また、IdP側の証明書も必要です。IdPから提供される証明書をダウンロードし、保存しておきます。
設定ファイルの準備
vendor/onelogin/php-samlディレクトリ内に settings_example.php というサンプル設定ファイルがあります。これをコピーして config/settings.php として保存し、必要な設定を行います。
まずは、テスト用にデバッグモードを有効にします。
//'debug' => false,
'debug' => true,
続いて、SP(Service Provider) の設定を行います。以下は基本的な設定例です。
'sp' => array(
//'entityId' => '',
'entityId' => 'https://localhost/onelogin_test/metadata.php',
'assertionConsumerService' => array(
//'url' => '',
'url' => 'https://localhost/onelogin_test/acs.php',
'binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST',
),
// 中略
'singleLogoutService' => array(
//'url' => '',
'url' => 'https://localhost/onelogin_test/logout.php',
'binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect',
),
// 中略
//'x509cert' => '',
'x509cert' => file_get_contents('/path/to/your/sp/cert.pem'), // SP側証明書ファイル
//'privateKey' => '',
'privateKey' => file_get_contents('/path/to/your/sp/key.pem'), // SP側鍵ファイル
),
次に、IdP(Identity Provider) の設定を行います。以下は基本的な設定例です。
'idp' => array(
//'entityId' => '',
'entityId' => 'https://idp.abe-tatsuya.com/saml/metadata',
'singleSignOnService' => array(
//'url' => '',
'url' => 'https://idp.abe-tatsuya.com/saml/sso',
'binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect',
),
'singleLogoutService' => array(
//'url' => '',
'url' => 'https://idp.abe-tatsuya.com/saml/slo',
'responseUrl' => '',
'binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect',
),
//'x509cert' => '',
'x509cert' => file_get_contents('/path/to/your/idp/cert.cer'), // IdP側証明書ファイル
),
上記の設定では、SPのエンティティID、アサーションコンシューマサービス(ACS)のURL、シングルログアウトサービス(SLO)のURL、SPの証明書と秘密鍵、IdPのエンティティID、シングルサインオンサービス(SSO)のURL、シングルログアウトサービス(SLO)のURL、IdPの証明書を指定しています。各項目は実際の環境に合わせて適宜変更してください。
最後に、config/settings.phpの末尾に以下のコードを追加します。
return $settings;
これで設定ファイルの準備は完了です。
SPのメタデータ生成
SPのメタデータを生成するために、metadata.php というファイルを作成します。以下はその例です。
<?php
require __DIR__ . '/vendor/autoload.php';
// 設定ファイルを読み込む
$settingsInfo = require __DIR__ . '/config/settings.php';
$strict = true;
$settings = new OneLogin\Saml2\Settings($settingsInfo, $strict);
// メタデータ XML を取得
$metadata = $settings->getSPMetadata();
// メタデータの検証
$errors = $settings->validateMetadata($metadata);
if (!empty($errors)) {
header('Content-Type: text/plain');
echo "メタデータにエラーがあります:\n";
echo implode("\n", $errors);
exit;
}
header('Content-Type: text/xml');
echo $metadata;
このスクリプトを実行すると、SPのメタデータがXML形式で出力されます。ブラウザで https://localhost/onelogin_test/metadata.php にアクセスして確認してください。
SSOの認証要求送信スクリプトの作成
次に、SSOの認証要求を送信するためのスクリプトを作成します。index.php というファイルを作成し、以下のコードを記述します。
<?php
require __DIR__ . '/vendor/autoload.php';
session_start();
// 設定ファイルを読み込む
$settingsInfo = require __DIR__ . '/config/settings.php';
$auth = new OneLogin\Saml2\Auth($settingsInfo);
// セッションがない場合は、SAML認証要求の送信
if (empty($_SESSION['samlUserdata'])) {
$auth->login();
exit;
}
// 認証後、セッションの中身と phpinfo を出力
var_dump($_SESSION['samlUserdata']);
phpinfo();
このスクリプトを実行すると、ユーザーが認証されていない場合、IdPにリダイレクトされて認証が行われます。認証が成功している場合、セッションに保存されたユーザー情報が出力され、さらに phpinfo() が表示されます。
ACSのレスポンス処理スクリプトの作成
次に、ACSのレスポンスを処理するためのスクリプトを作成します。acs.php というファイルを作成し、以下のコードを記述します。
<?php
require __DIR__ . '/vendor/autoload.php';
session_start();
// 設定ファイルを読み込む
$settingsInfo = require __DIR__ . '/config/settings.php';
$auth = new OneLogin\Saml2\Auth($settingsInfo);
// SAML認証のレスポンスを検証
$auth->processResponse();
$errors = $auth->getErrors();
if (!empty($errors)) {
echo 'SAML Response エラー: ' . implode(', ', $errors);
exit;
}
if (!$auth->isAuthenticated()) {
echo '認証されていません';
exit;
}
// 認証成功時にセッションにユーザー属性をセット
$attributes = $auth->getAttributes();
$_SESSION['samlUserdata'] = $attributes;
// 認証後に飛ばしたいページへリダイレクト。ここでは index.php に戻す例
header('Location: index.php');
exit;
このスクリプトは、IdPからのSAMLレスポンスを受け取り、検証します。検証に成功すると、ユーザー属性をセッションに保存し、元のページ(ここでは index.php)にリダイレクトします。
動作確認
すべてのスクリプトが準備できたら、ブラウザで https://localhost/onelogin_test/index.php にアクセスして動作を確認します。認証が成功すると、セッションに保存されたユーザー情報が表示され、phpinfo() の内容も確認できます。
以上で、onelogin/php-saml ライブラリを使用した基本的な SAML認証の実装が完了です。実際の運用環境では、セキュリティ設定やエラーハンドリングなど、さらに詳細な設定が必要になる場合があります。
まとめ
今回は、onelogin/php-saml ライブラリを使用して、PHPでSAML認証を実装する方法を紹介しました。SimpleSAMLphpに比べて設定がシンプルであり、軽量なため、小規模なアプリケーションやテスト環境に適しています。今後のプロジェクトでSAML認証を検討する際の参考になれば幸いです。
PHPアプリにSAML認証を導入したい方へ
本記事では onelogin/php-saml を使ったシンプルな実装例をご紹介しましたが、実際の運用では証明書の管理やユーザー属性の取り扱い、既存システムとの統合など、さらに多くの検討事項が発生します。
以下のような課題をお持ちの方は、ぜひご相談ください。
- Microsoft Entra IDや他IdPとのSAML連携を導入したい
- 既存のPHPアプリケーションにSSOを追加したい
- 認証後の権限管理やユーザー属性の利用をカスタマイズしたい
- セキュリティを考慮した本番環境向けの設定に悩んでいる
奈良市を拠点に、26年以上の経験を持つフリーランスWebエンジニア、阿部辰也です。
これまで、ECサイトのバックエンド開発や業務効率化システム、公共施設の予約システムなど、多彩なプロジェクトを手がけ、企業様や制作会社様のパートナーとして信頼を築いてまいりました。
【制作会社・企業様向けサポート】
Webシステムの開発やサイト改善でお困りの際は、どうぞお気軽にご相談ください。小さな疑問から大規模プロジェクトまで、最適なご提案を心を込めてさせていただきます。
ぜひ、プロフィールやWeb制作会社様向け業務案内、一般企業様向け業務案内もご覧くださいね。
SimpleSAMLphpを使ったPHPアプリケーションのSSO対応ガイド
2025.02.11
SimpleSAMLphpを使ってPHPアプリケーションにSSO機能を追加する方法を紹介します。Microsoft Entra IDとの連携方法や、認証情報の取得方法について詳しく解説します。
Microsoft Entra IDとSimpleSAMLphpを利用したSAML認証SSO構築ガイド
2025.01.26
ローカル環境でMicrosoft Entra IDと連携したSAML認証のシングルサインオンを実現するための手順を紹介します。SimpleSAMLphpを利用した設定方法や、Microsoft側の構成変更について詳しく解説しています。
Google OAuth 2.0で実装するPHP SSO入門:Google Cloud 設定と実装コード例
2025.11.24
Google OAuth 2.0 を利用した Google アカウントによる SSO を PHP で実装する手順を解説します。Google Cloud Console での OAuth 同意画面とクライアント作成、必要なスコープ設定から、Composer の導入、GSI(Google Sign‑In)ボタンの設置、ログインスクリプトの実装例までを一貫して扱います。
漏洩パスワードとの照合:Pwned Passwords APIの仕組みと実運用での注意点
2025.11.06
Pwned Passwords API(Have I Been Pwned)が採用する k‑Anonymity の仕組みを分かりやすく解説し、PHPによる実装例を通して漏洩パスワードチェックの具体手順を示します。さらに、ユーザー通知文面の注意点など、実運用で押さえるべきセキュリティと運用上の留意点をまとめています。