シンプルなSAML認証用SPの構築:第三回 PerlとNet::SAML2で作るACSスクリプト
作成日:2025.06.10
連載第3回となる本稿では、PerlとNet::SAML2を用いて、ACS (Assertion Consumer Service) スクリプトの作成方法に焦点を当てます。IdPからのSAMLレスポンスを受信し、アサーションの検証やユーザー属性の取得といった重要な処理を実装する手順を、実際のコード例を交えてわかりやすく紹介。SAML認証の全体像とその実現に必要な知識を身につけるための内容です。
error この記事は最終更新日から1年以上が経過しています。
ローカル環境で動く、SAML認証によるSSO用の SP(Service Provider) を、シンプルな構成で Perl で実装してみる連載第3回です。
前回は、IdP(Identity Provider) に対して認証要求を送信するためのスクリプトを作成しました。
- シンプルなSAML認証用SPの構築:第一回 PerlとNet::SAML2で作るメタデータ生成スクリプト
- シンプルなSAML認証用SPの構築:第二回 PerlとNet::SAML2で作る認証要求送信スクリプト
今回は、IdPからのアサーションを受け取り、ユーザー情報を取得するためのスクリプトを作成します。
アサーション受信スクリプト
IdPからのアサーションを受け取り、ユーザー情報を取得するための Perl スクリプトを acs.cgi という名前で作成します。このスクリプトは、SAML 2.0 の仕様に基づいてアサーションを処理し、ユーザー情報を取得します。
#!/usr/bin/perl
use strict;
use warnings;
use Net::SAML2;
use CGI;
use MIME::Base64;
use Encode;
my $cgi = CGI->new;
# 設定
my $sp_key_file = '/path/to/your/sp/key.pem'; # SPの秘密鍵ファイルのパス
# Assertion Consumer Service (ACS) - SAMLレスポンス処理
my $saml_response = $cgi->param('SAMLResponse');
die "Missing SAMLResponse" unless $saml_response;
# レスポンスをデコード
my $decoded_response = decode_base64($saml_response);
my $response = Net::SAML2::Object::Response->new_from_xml(
xml => $decoded_response
);
# レスポンスの検証
# $response->statusの値をチェックなど
# ここでは検証処理は省略していますが、実際のアプリケーションでは必要です。
# アサーションの取得
my $assertion = $response->to_assertion(
key_file => $sp_key_file,
);
# in_response_toのチェック
# $assertion->in_response_toをチェックして、期待する値と一致するか確認します。
# 前回のコードの認証リクエストのIDと一致するかどうかを確認することが重要です。
# その他、$assertion->attributes, $assertion->nameid, $assertion->sessionなどを確認。
# ここではチェックを省略。
# レスポンスの内容を表示
use Data::Dumper;
print "Content-type: text/html; charset=utf-8\n\n";
print "<h2>SSO Success.</h2>\n";
print Dumper ($response->status);
print "<hr>";
print Dumper ($assertion);
print "<hr>";
print Dumper $assertion->in_response_to;
print "<br>\n";
print Dumper $assertion->nameid;
print "<br>\n";
print Dumper $assertion->session;
print "<hr>\n";
print Dumper ($assertion->attributes);
print "<hr>\n";
exit;
このスクリプトは、IdPから送信されたSAMLレスポンスを受け取り、アサーションを処理します。アサーションの検証やユーザー情報の取得を行い、結果を表示します。
前回作成した認証要求送信スクリプトで生成された認証要求のIDと一致するかどうかを確認するために、アサーションの in_response_to をチェックすることが重要です。また、アサーションからユーザー情報を取得するために、attributes や nameid などのメソッドを使用します。
スクリプトの実行
ブラウザで前回の認証要求送信スクリプト authn_request.cgi を実行し、IdPのログイン画面で認証を行います。認証が成功すると、IdPはSPのACS URLである acs.cgi にリダイレクトし、アサーションを送信します。
IdPが正しく設定されていれば、acs.cgi スクリプトが実行され、アサーションの内容が表示されます。表示された内容には、認証のステータスやユーザー情報が含まれています。
これで、SAML認証によるSSOの基本的な流れが完成しました。細かい例外処理やセキュリティ対策は必要ですが、基本的な構成はこれで整いました。
まとめ
今回の連載では、Perlを使用してSAML認証によるSSO用のSPを構築する方法を紹介しました。メタデータの生成、認証要求の送信、アサーションの受信と処理まで、一連の流れを実装しました。
実際のアプリケーションでは、セキュリティやエラーハンドリング、セッション管理など、さらに多くの要素を考慮する必要がありますが、基本的な流れはこのようになります。
SAML認証によるSSO対応のWebアプリ開発にご興味はありませんか?
本記事で解説したSP(Service Provider)側でのアサーション受信やユーザー情報取得の処理は、SSO実装に欠かせない重要なステップです。
例えば、ローカル開発環境でのSSO検証、複数IdP対応、アサーション検証やセッション連携の強化など、SAML認証をWebアプリへ組み込むための設計・実装支援が可能です。お気軽にご相談ください。
奈良市を拠点に、27年以上の経験を持つフリーランスWebエンジニア、阿部辰也です。
これまで、ECサイトのバックエンド開発や業務効率化システム、公共施設の予約システムなど、多彩なプロジェクトを手がけ、企業様や制作会社様のパートナーとして信頼を築いてまいりました。
【制作会社・企業様向けサポート】
Webシステムの開発やサイト改善でお困りの際は、どうぞお気軽にご相談ください。小さな疑問から大規模プロジェクトまで、最適なご提案を心を込めてさせていただきます。
ぜひ、プロフィールやWeb制作会社様向け業務案内、一般企業様向け業務案内もご覧くださいね。
シンプルなSAML認証用SPの構築:第一回 PerlとNet::SAML2で作るメタデータ生成スクリプト
2025.06.06
PerlとNet::SAML2を利用して、シンプルな構成のSAML認証用SPの構築方法をご紹介します。CPANによるモジュール導入、テスト用の自己署名証明書と秘密鍵の準備方法に触れ、SPのエンティティIDやACS URL、エラーURLといった必要情報を含むメタデータをXML形式で生成するスクリプトの実装例を解説します。
シンプルなSAML認証用SPの構築:第二回 PerlとNet::SAML2で作る認証要求送信スクリプト
2025.06.09
本記事は連載第2回として、前回構築したSPメタデータ生成スクリプトに引き続き、IdP(Identity Provider)への認証要求送信処理の実装方法を解説します。PerlとNet::SAML2モジュールを活用し、SAML 2.0仕様に基づいた認証要求の生成、リダイレクト処理、そしてセッションに認証要求IDを保存する基本的な手法をご紹介します。
Microsoft Entra IDの属性とクレームをPHPで取得する:SAMLResponseとonelogin/php-samlの対応方法
2026.08.29
Microsoft Entra IDの「属性とクレーム」で設定したユーザー属性を、SAMLResponseのNameIDやAttributeStatementで確認し、onelogin/php-samlのgetNameId()・getAttributes()でPHPから取得する方法を解説します。クレーム名とPHP側の配列キーが一致しない場合の確認ポイントも整理します。
PHPのSAML認証でログインできないときの切り分け:Microsoft Entra IDとonelogin/php-samlを確認する
2026.08.23
PHPのonelogin/php-samlとMicrosoft Entra IDを組み合わせたSAML認証で、ログインできない原因を切り分ける方法を解説します。Microsoft Entra IDのエラー情報とSAML Chrome Panelで確認したSAMLRequest・SAMLResponseをもとに、Entity ID、ACS URL、Audience、Recipient、Destination、署名証明書、時刻条件、NameID・クレームなどを確認します。