サービスにシングルログアウトを実装する
ここでは、CloudGearのシングルログアウトの実装例に関して説明します。
概要
アプリケーションからのログアウトは、アプリケーションに格納されているユーザーのセッション情報を削除することで完了しますが、OpenID ConnectのRPとして稼働している場合、その限りではありません。
アプリケーション側にユーザーのセッション情報が存在しない場合、アプリケーションはOPに対してセッションの有無を確認することになります。
仮にOPにセッションが存在した場合、RPには認証されたユーザーであると通知されログイン状態になります。
これは、1つのOPを主軸として関連したRP全体でセッション情報を共有するための仕組みであり、OPにセッションがある限り全てのRPにおいて一元的にセッションを管理することを可能としています。
そのため複数のアプリケーションにおいて、(リクエストが発生することで)非同期的にセッションが存在してしまうため、特定のアプリケーションのみのセッションを削除したとしてもシステムからのログアウトが完了したことにはなりません。
これを解決するためにOPと全てのRPとして登録されているアプリケーションにおいてログアウトを実現するための仕組みとしてシングルログアウト(シングルサインアウト)を実装する必要があります。
以下より、具体的な実装例を示します。
実装例
Spring Bootを利用する場合
ここで示す実装例は、本ドキュメントにおける「Relying Party実装」を前提とします。
また、テンプレートエンジンとしてThymeleafを利用しています。
logout.html(with thymeleaf)
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>シングルサインアウト</title>
<script src="https://code.jquery.com/jquery-1.12.4.min.js"></script>
<script type="text/javascript" th:inline="javascript">
//<![CDATA[
function logout() {
var sessionScope = /*[[${session["scopedTarget.oauth2ClientContext"]}]]*/;
var logoutUrl = "https://www.cloudgear.services/logout"
+ '?id_token_hint=' + sessionScope["accessToken"]["additionalInformation"]["id_token"]
+ '&post_logout_redirect_uri=' + "https://yourdomain/index";
// logout
location.href = logoutUrl;
}
//]]>
</script>
</head>
<body>
<button onclick="logout();">シングルログアウト</button>
</body>
</html>シングルログアウトURLのパラメータ
パラメータ | 説明 | 設定例 |
|---|---|---|
ログアウトURL | OPのログアウトURLです。 | (本番) https://accounts.cloudgear.services/logout |
id_token_hint | ログアウトするユーザーを示すIDトークンを指定します。 | eyJraWQiTYifQ.eyJzdWmYPl8Q.DPsDRLEHCOTwriPH0tA |
post_logout_redirect_uri | ログアウト後の遷移先を指定します。(指定時にURIエンコードが必要になります) | https%3A%2F%2Fwww.cloudgear.services%2F |