サービスにシングルログアウトを実装する
ここでは、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です。 このURLに対してリクエストすることになります。 | (本番) https://accounts.cloudgear.services/logout (ベータ) https://accounts.beta.cloudgear.services/logout |
id_token_hint | ログアウトするユーザーを示すIDトークンを指定します。 IDトークンはログイン時に返却されます。Spring Boot + Thymeleafの場合、実装例のようにセッションスコープから取得することができます。 他のフレームワークないしプログラミング言語を利用する場合であっても、ログイン時にIDトークンをユーザーに紐づけて格納しておく必要があります。 | eyJraWQiTYifQ.eyJzdWmYPl8Q.DPsDRLEHCOTwriPH0tA |
post_logout_redirect_uri | ログアウト後の遷移先を指定します。(指定時にURIエンコードが必要になります) ここで指定する値は、CloudGear ServiceManagerで設定した値になります。設定方法はこちらをご参照ください。 | https%3A%2F%2Fwww.cloudgear.services%2F |