SAMLのSPとなるようなアプリケーションが簡単に作れるかどうか、という技術検証で

onelogin/php-samlを触ったので使い方をメモってみましたー。

今回はSalesforceをIdP、phpのアプリをSP(ローカル環境)として

ソースに付随されているサンプルのアプリを動かしてみます。

1.  インストール

php使いの人にはお馴染みのComposerを使ってインストールします。

Windowsの場合はChocolateyだと何故か上手く行かなかったので、

本家からインストーラでインストールした方が良いかもしれないです。

からの composer.jsonに”onelogin/php-saml”: “master-dev” を追加

からの

でvenderディレクトリ配下にインストールされます。

2. 証明書の設定

SP側の証明書を設定します。

certsフォルダに秘密鍵と証明書を作成します。

3. settings.phpの設定

まずdemo1ディレクトリ配下のsettings_example.phpをコピーしてsettings.phpを作成します。

settings.phpの中身は以下の通り。

$spBaseUrlにはphp-samlへのURLをセット。

spのNameIDFormatはlib\Saml2\Constants.php のNAMEID_****の定数値から選択します。

idpのentityIdにはマイドメインの値を設定します。

singleSignOnServiceにはSP Initiated SSO用のリダイレクト先URL

(SAML Requestのエンドポイント)を入力します。

ちなみにphp-samlではSAML RequestはRedirectのみ対応しており

SAML AssertionはPOSTのみの対応となっています。

 

また、debug=trueでエラー時にエラーの理由等の詳細な情報が出力され

strict=trueではIdP、SPのentityId等が正確に合致していないとエラーになります。

逆に、strict=falseだとentityId不一致でもログイン出来てしまうので

特別なことが無ければstrict=trueにすべきです。

 

authnRequestsSignedはデフォルトfalseになっており

falseだとAuthnRequestでSignatureが発行されません。

4. Salesforceの設定

設定>作成>アプリケーション から接続アプリケーションを以下のように作成します。

connectapp_phpsaml

各項目には3のsettings.phpに設定した値を入力し

開始URLとACS URLにはassertionConsumerServiceの値、エンティティIDにはentityIdの値

名前ID形式にはNameIDFormatの値をそれぞれセットします。

要求署名を確認をチェックして2で作成した証明書をアップロードしてください。

 

保存後にManageボタンを押下し、有効なプロファイルを設定します。

connectapp_phpsaml_manage

また、メタデータのダウンロードから出力されるXMLのX509Certificateのテキスト値

(以下のMIIErD********の部分)をコピーします。

またメタデータの値がsettings.phpの値と整合性が取れているかどうかも確認します。

(entityIdとかsingleSignOnServiceとか)

5. settings.phpにIdPの証明書を設定

settings.phpのidpのx509certに4でコピペした証明書のテキストをセットします。

6. デモアプリを動かす

IdP Initiated SSOの場合は

Salesforceの接続アプリケーションのIdp-init のログイン URLにアクセスすればOKです。

connectapp_phpsaml_idpsso

アプリケーションランチャーを使ってIdP Initiated SSOをする場合は

接続アプリ>manageの開始URLのところに”Idp-init のログイン URL”の値を入れて

対象アプリケーションのリンクやランチャーをクリックすればOK。

 

SP Initiated SSOの場合は

demo1/index.phpでLoginのリンクをクリックすると

SalesforceにSAML Requestが飛ぶので、Salesforceで認証後に

demo1/index.php?acsにSAML Assertionが返って、認証が出来ます。

 

署名がミスっている場合はSFDCから以下のようなSAMLResponseが

URLパラメータ経由(リダイレクト)で返却されます。

7. デモアプリの中身

デモアプリの根幹であるindex.phpの中身は簡潔で

SP Initiated SSOをする場合はOneLogin_Saml2_Auth#login

SAML AssertionのverifyはOneLogin_Saml2_Auth#processResponse

SLOしたい場合はOneLogin_Saml2_Auth#processSLO

を叩くだけで、SAML Assertionのverifyが通ったタイミングで

php側のセッションを発行すればOKです。