OpenID Connect のセッション管理エンドポイントの起動

セッション管理エンドポイントは、OpenID Connect リライング・パーティーが特定の OpenID Connect プロバイダー (OP) でのユーザーのログイン状況をモニターするのを可能にし、 その際のネットワーク・トラフィックを最小化します。セッション管理エンドポイントを利用することによって、 リライング・パーティー (RP) は、OpenID Connect プロバイダーからログアウトしたユーザーをログアウトすることができます。

始める前に

OP セッション管理エンドポイント URL は、OP のディスカバリー・エンドポイントから返されるディスカバリー情報内の check_session_iframe 属性から取得されます。この URL は、 セッション管理機能を必要とする RP アプリケーションで iframe のターゲットとして使用される必要があります。RP アプリケーションは、Window.postMessage() 要求をサブミットするために、 iframeid 属性も認識している必要があります。

このタスクについて

ユーザーのログイン状況を判別するのを助けるため、RP は、src ターゲットを OP のセッション管理エンドポイントに設定して iframe をロードします。セッション管理エンドポイントには、ユーザーのログイン状況 (つまりブラウザー状況) を保管する Cookie へのアクセス権限があります。このブラウザー状態 Cookie は、ユーザーが OP からログアウトすると更新されます。RP は、 その後、クライアント・サイドのスクリプティングを使用して、OP iframeWindow.postMessage() 関数を呼び出し、 クライアント ID および現在分かっているセッション状態をメッセージ・テキストに入れて送信することができます。OP フレームから RP に返される postMessage に値 changed が含まれている場合、 OP でのユーザーのログイン状況に変化があったということであり、RP はユーザーをログアウトするかどうかを判別できます。値 unchanged が返される場合、 ユーザーは OP でログインしたままです。

OpenID Connect が有効になった Liberty サーバーは、以下の URL で OpenID Connect セッション管理エンドポイントにアクセスできます。

https://server.example.com:443/oidc/endpoint/<provider_name>/check_session_iframe
注: この例では、 OP の SSL ポートは 443 であると想定されています。

手順

  1. OP セッション管理エンドポイントをターゲットにする iframe をロードできる適切な RP アプリケーションで Web リソースを作成します。その Web リソースは、 認可応答の session_state パラメーターで返されるセッション状態値にアクセスできる必要もあります。セッション状態値は、 例えば Cookie に保管でき、Web リソース内のクライアント・サイド・スクリプトが値を把握できる方法であれば、他の任意の方法でも保管できます。以下は、そのような iframe の HTML スニペット例です。
    <iframe id="iframeOP" src="https://server.example.com:443/oidc/endpoint/OidcConfigSample/check_session_iframe" frameborder="0" width="0" height="0"></iframe>
  2. ユーザーのログイン状況をチェックするために、OP iframeWindow.postMessage() 関数を呼び出します。 その際、クライアント ID とセッション状態を Client ID + " " + Session State の形式でメッセージ・パラメーターとして渡し、OP のホスト名をターゲット発信元パラメーターとして渡します。以下のサンプル JavaScript 関数では、 スクリプトはセッション状態値が session_state という名前の Cookie に保管され、 session_state Cookie に保管されている値を getCookieValue() 関数が返すことを想定しています。
    	var targetOP = "https://server.example.com:443";
    	function checkStatus() {
               var client = "client01";
               var sessionState = getCookieValue("session_state");
               var text = client + " " + sessionState;
               var iframe = document.getElementById("iframeOP");
               iframe.contentWindow.postMessage(text, targetOP);
    	}
  3. OP からの postMessages を listen するよう Web リソースを構成します。これには、 ユーザーのログイン状況を反映する値 changed または unchanged が含まれています。RP は、 OP から返されたこの値に基づいて、RP からユーザーをログアウトするかどうかを判断できます。関数では、postMessage の発信元が、 予期する OP ホスト名と一致するようにしなければなりません。一致しないメッセージはすべて拒否されます。 以下の JavaScript 例は、 そういたメッセージを listen するために Web リソースにイベント・リスナーを追加する方法を示しています。
    	var targetOP = "https://server.example.com:443";
    	window.addEventListener("message", receiveMessage, false);
    	function receiveMessage(event) {
               if (event.origin !== targetOP) {
                         // Origin did not come from the OP; this message must be rejected.
                         return;
               }
               if (event.data === "unchanged") {
                         // User is still logged in to the OP
               } else {
                         // User has logged out of the OP
               }
    	}

タスクの結果

これで、Liberty サーバー OP 上の OpenID Connect のセッション管理機能を利用できる Web リソースが RP 上に置かれました。OP iframe で保守されるブラウザー状態は、 ユーザーが OP へのログインまたは OP からのログアウトを行うと更新されます。OP でのログインが正常に実行されると、 新しいセッション状態値が RP への認可応答内に提供されます。次に、RP は、クライアント・サイドのスクリプティングを使用してユーザーのセッション状態を検証することによって、 OP でのユーザーのログイン状況が変化したかどうかを、余分なネットワーク・トラフィックなしで判別できます。

以下の HTML 例は、OpenID Connect セッション管理を使用する完全な HTML ページを示します。OP iframesrc 属性は、 OP から取得されたセッション管理エンドポイント URL に設定されています。startChecking() 関数は、 60 秒ごとに自動的に呼び出され、ユーザーのログイン状況をチェックします。このページには message イベント・リスナーがあり、 これは postMessage を受け取ると receiveMessage() を呼び出します。この関数は、postMessage が、 予期する OP ドメインからのものであることを確認し、返されたメッセージの値をチェックして、 ユーザーのログイン状況が changed なのか、それとも unchanged なのかを判別します。

この HTML ページ自体を、 RP 内の別の Web リソースにおいて、不可視 iframe としてロードできます。これにより、この iframe をロードする任意の Web リソースがクライアント・サイドでユーザーのログイン状況をモニターできます。
	<!DOCTYPE html>
	<html>
	<head>
	<meta charset="ISO-8859-1">
	<title>iFrame RP Page</title>
	</head>
	<body onload="javascript:startChecking()">
            <iframe id="iframeOP" src="https://localhost:8999/oidc/endpoint/OidcConfigSample/check_session_iframe" frameborder="0" width="0" height="0"></iframe>
	</body>
	<script>
            var targetOP = "https://server.example.com:443";
		
            window.addEventListener("message", receiveMessage, false);
		
            function startChecking() {
                      checkStatus();
                      // Check status every 60 seconds
                      setInterval("checkStatus()", 1000*60);
            }
		
            function getCookieValue(cookieName) {
                      var name = cookieName + "=";
                      var cookies = document.cookie.split(';');
                      if (!cookies) {
                                return null;
                      }
                      for (var i = 0; i < cookies.length; i++) {
                                var cookie = cookies[i].trim();
                                if (cookie.indexOf(name) == 0) {
                                          return cookie.substring(name.length, cookie.length);
                                }
                      }
                      return null;
            }
		
            function checkStatus() {
                      var client = "client01";
                      var sessionState = getCookieValue("session_state");
                      var text = client + " " + sessionState;
                      var iframe = document.getElementById("iframeOP");
                      iframe.contentWindow.postMessage(text, targetOP);
            }
		
            function receiveMessage(event) {
                      if (event.origin !== targetOP) {
                                // Origin did not come from the OP; this message must be rejected
                                return;
                      }
                      if (event.data === "unchanged") {
                                // User is still logged in to the OP
                      } else {
                                // User has logged out of the OP
                      }
            }
	</script>
	</html>

トピックのタイプを示すアイコン タスク・トピック



タイム・スタンプ・アイコン 最終更新: Tuesday, 6 December 2016
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-dist&topic=twlp_oidc_session_mgmt_endpoint
ファイル名: twlp_oidc_session_mgmt_endpoint.html