OpenID Connect のセッション管理エンドポイントの起動
セッション管理エンドポイントは、OpenID Connect リライング・パーティーが特定の OpenID Connect プロバイダー (OP) でのユーザーのログイン状況をモニターするのを可能にし、 その際のネットワーク・トラフィックを最小化します。セッション管理エンドポイントを利用することによって、 リライング・パーティー (RP) は、OpenID Connect プロバイダーからログアウトしたユーザーをログアウトすることができます。
始める前に
このタスクについて
ユーザーのログイン状況を判別するのを助けるため、RP は、src ターゲットを OP のセッション管理エンドポイントに設定して iframe をロードします。セッション管理エンドポイントには、ユーザーのログイン状況 (つまりブラウザー状況) を保管する Cookie へのアクセス権限があります。このブラウザー状態 Cookie は、ユーザーが OP からログアウトすると更新されます。RP は、 その後、クライアント・サイドのスクリプティングを使用して、OP iframe の Window.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
OpenID Connect プロバイダー (OP) へのアクセスにプロキシーを使用する必要がある場合は、OP 関連の URL プロパティーに入力する値には、外部 OP のホストおよびポートではなく、プロキシーのホストおよびポートが含まれる必要があります。
ほとんどの場合、OP のホストおよびポートを、プロキシーのホストおよびポートに置き換えることができます。入力する URL は、RP およびクライアント (ブラウザーまたはアプリケーション) の両方に可視でなければなりません。使用する正しい URL を決定する方法について詳しくは、プロキシー管理者にお問い合わせください。
この例では、クライアントは SSL ポートが 443 に設定されると予期しています。
手順
タスクの結果
例
以下の HTML 例は、OpenID Connect セッション管理を使用する完全な HTML ページを示します。OP iframe の src 属性は、 OP から取得されたセッション管理エンドポイント URL に設定されています。startChecking() 関数は、 60 秒ごとに自動的に呼び出され、ユーザーのログイン状況をチェックします。このページには message イベント・リスナーがあり、 これは postMessage を受け取ると receiveMessage() を呼び出します。この関数は、postMessage が、 予期する OP ドメインからのものであることを確認し、返されたメッセージの値をチェックして、 ユーザーのログイン状況が changed なのか、それとも unchanged なのかを判別します。
<!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>