Open ID Connectで定義されるセッション管理の仕組みについてまとめる。殴り書きメモ記事。
用語
-
OpenID Connect
- OAuth 2.0の認可フローをベースに、追加で、「認証結果」と「属性情報(アイデンティティ情報を提供するエンドポイントへのアクセス認可情報)」をやり取りするためのプロトコル。
-
Relying Party(RP)
- OpenID ProviderにID Tokenとユーザー情報を要求するサーバー、SSO対象のアプリケーション。
-
OpenID Provider(OP)
- ユーザー認証機能を有し、ユーザー認証時にRelying Partyから要求されたアイデンティティ情報を提供できるエンドポイントを有するサーバー。
-
ID トークン
- OPから提供される 認証・認可情報を含むJWT形式のトークン。
セッションの作成・更新(Creating and Updating Sessions)
RP
- RPがエンドユーザーのIDトークンを検証した時点でセッションを開始する。
OP
- OPはセッション管理をサポートするために、以下を実施する。
-
Authentication Response/Error Response
でsession_state
を返却する。
*session_state
* OPでのエンドユーザーのログイン状態(セッション状態)を表現するJSON 文字列。
* セッション状態値の生成方法
* クライアントID、オリジンURL、およびOPユーザーエージェント状態をソルトされた暗号化ハッシュに基づいて計算。
-
セッション状態変更検知(Session Status Change Notification)
-
Authentication Request/Response
でセッションが確立された場合、RP iframeからpostMessage
を使用して、OP iframeをポーリングすることでログイン状態を確認する。
RP iframe
- RP側でセッション状態管理を行うための機構。
- RPアプリに適した間隔で
postMessage
を使用してOP iframeをポーリングする。- RP iframeからOP iframeの
postMessage
データ- クライアントID + " " +セッション状態
- RP iframeからOP iframeの
- OP iframeからの
postMessage
を受信する。-
changed
(セッション状態変更あり)/unchanged
(セッション状態変更なし)を受け取る。 -
changed
を受信した場合は、prompt = none
を使用して再認証を実行する。- 新しいIDトークンとセッション状態を取得し、古いIDトークンを
id_token_hint
として送信する。
- 新しいIDトークンとセッション状態を取得し、古いIDトークンを
- 同じエンドユーザーのIDトークンを受け取った場合
* セッション状態を更新する。 - IDトークンを受信しない場合、または別のエンドユーザーのIDトークンを受信する場合
- 元のエンドユーザーのログアウトとして処理する。
-
OP iframe
-
OP側でセッション状態管理を行うための機構。
-
OP側に、呼び出し元(RP)情報を事前に登録する。
- 登録外オリジンからの
postMessage
リクエストを拒否し、XSS攻撃を防ぐため。
- 登録外オリジンからの
-
OP iframeは、RPによって渡されたOPセッション状態を計算して比較するためにユーザーエージェント状態(CookieまたはHTML5ストレージ内)にアクセスできる。
-
OP iframeは、以前に取得したクライアントID、ソースオリジンURL、および現在のOPユーザーエージェントの状態からセッション状態を再計算する。
-
OP iframeは、RPから受信した
postMessage
に対して、- 構文的に不正、もしくは投稿されたクライアントIDと発信元URLを特定できない場合
* OP iframeはエラーをRPに返す。 - 受信した値と計算した値が一致しない場合
* OP iframeはchanged
をRPにpostMessage
する(一致した場合は、unchanged
をpostMessage
する)。
- 構文的に不正、もしくは投稿されたクライアントIDと発信元URLを特定できない場合
-
OP iframeは、ログイン、ログアウト、認証ステータス変更のようなイベントに応答して、ユーザーエージェント状態を更新する。その後にセッション状態を確認すると、変更された値が返される。
-
Authentication Response
が成功の場合、OPは、次のいずれかのイベントでクライアントに返されるセッション状態の値を更新する。- ユーザーエージェントに対して、認証済みユーザーの組み合わせが変更される場合(ログイン、ログアウト、セッションの追加など)。
- エンドユーザーが使用しているクライアントの認証ステータスが変更される場合。
-
セッション状態を検証するために使用されるユーザーエージェントの状態は、上述のイベントに合わせて変化させる必要がある。
-
セッション状態確認を行うと、上述のイベント後、以前のバージョンのセッション状態に対して
changed
が返却される。
OpenID Provider Discovery Metadata
- RPはセッション管理関連の次のOPメタデータを取得する。
-
check_session_iframe
- RPクライアントとのセッション状態情報のクロスオリジン通信をサポートするOPiframeのURL。
- 関連するRPiframeからのpostMessageリクエストを受け入れ、postMessageを使用してOPでのエンドユーザーのログインステータスをポストバックする。
-