シンプルなSAML認証用SPの構築:第三回 PerlとNet::SAML2で作るACSスクリプト
作成日:2025.06.10
連載第3回となる本稿では、PerlとNet::SAML2を用いて、ACS (Assertion Consumer Service) スクリプトの作成方法に焦点を当てます。IdPからのSAMLレスポンスを受信し、アサーションの検証やユーザー属性の取得といった重要な処理を実装する手順を、実際のコード例を交えてわかりやすく紹介。SAML認証の全体像とその実現に必要な知識を身につけるための内容です。
ローカル環境で動く、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アプリへ組み込むための設計・実装支援が可能です。お気軽にご相談ください。

奈良市を拠点に、26年以上の経験を持つフリーランス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を保存する基本的な手法をご紹介します。
Movable Type システムログ出力ガイド ― MT::App の log メソッドでエラーメッセージを記録する方法
2025.06.03
Movable Type のシステムログにエラーメッセージや各種情報を出力する方法について、MT::App の log メソッドを利用した具体的な実装例を解説します。ログレベル、クラス、カテゴリを指定することにより、出力内容を柔軟に分類・管理できる仕組みを詳述し、管理画面でのログ確認方法やデータベーステーブルでの確認方法も合わせて説明します。
Movable Type プラグインで実現するエラー画面・ログイン画面の出力方法
2025.04.10
Movable Typeプラグイン開発において、エラー画面やログイン画面をどのように出力すべきか、その基本手法を具体的なコード例を交えて解説します。MT::App の show_error および show_login メソッドの利用方法や各オプションの効果を理解することで、プラグインにおけるユーザーインターフェースのカスタマイズが容易になります。