Now that I am trying to write down the session management spec, I am looking at the whiteboards photo of the session management f2f back in May. <div><br></div><div>Here is what I understand right now for session change notification. Correct me if I am wrong: </div>
<div><br></div><div>

<span class="Apple-style-span" style="font-family:Arial"><b>Step 0. RP constructs session_state via any authn response from IdP </b></span><div style="font-family:Arial"><br></div><div><font class="Apple-style-span" face="'courier new', monospace">session_state = sha256(client_id + origin + idp_session_state + salt) + "." + salt.</font><span class="Apple-style-span" style="font-family:Arial"> </span></div>
<div style="font-family:Arial"><br></div><div><font class="Apple-style-span" face="'courier new', monospace">idp_session_state</font><span class="Apple-style-span" style="font-family:Arial"> is either "</span><font class="Apple-style-span" face="'courier new', monospace">no_user</font><span class="Apple-style-span" style="font-family:Arial">", "</span><font class="Apple-style-span" face="'courier new', monospace">not_authenticated</font><span class="Apple-style-span" style="font-family:Arial">", "</span><font class="Apple-style-span" face="'courier new', monospace">authenticated_user</font><span class="Apple-style-span" style="font-family:Arial">". </span></div>
<div style="font-family:Arial"><br></div><div style="font-family:Arial"><b>Step 1. RP loads RP frame  </b></div><div style="font-family:Arial"><br></div><div style="font-family:Arial">After the frame loads, following function is available</div>
<div style="font-family:Arial"><br></div><div><font class="Apple-style-span" face="'courier new', monospace">boolean hasChanged(client_id, session_state)</font></div><div style="font-family:Arial"><br></div><div style="font-family:Arial">
This function postMessage to the IdP frame </div><div><span class="Apple-style-span" style="font-family:Arial">  </span><font class="Apple-style-span" face="'courier new', monospace">win = window.parent.document.getElementById("idp").contentWindow. </font></div>
<div style="font-family:Arial"><br></div><div><span class="Apple-style-span" style="font-family:Arial">Thus, </span><font class="Apple-style-span" face="'courier new', monospace">win.postMessage(string, targetOrigin);</font><font class="Apple-style-span" face="Arial"> </font></div>
<div style="font-family:Arial"><br></div><div><span class="Apple-style-span" style="font-family:Arial">  where </span><font class="Apple-style-span" face="'courier new', monospace">string = client_id + "." + session_state; </font><span class="Apple-style-span" style="font-family:'courier new',monospace"> </span></div>
<div><span class="Apple-style-span" style="font-family:'courier new',monospace">      targetOrigin = scheme + "://" + domain name of the IdP + (":" + port number)</span></div><div style="font-family:Arial">
<br></div><div style="font-family:Arial">Also, it needs to add Event Listener to receive message from the IdP frame for the type "message".</div><div style="font-family:Arial"><br></div><div style="font-family:Arial">
window.addEventListner("message", receiveMessage, false); </div><div style="font-family:Arial"><br></div><div><span class="Apple-style-span" style="font-family:Arial">Function </span><font class="Apple-style-span" face="'courier new', monospace">receiveMessage(event) </font><font class="Apple-style-span" face="Arial">checks if </font><font class="Apple-style-span" face="'courier new', monospace">event.origin === targetOrigin</font><font class="Apple-style-span" face="Arial">. </font></div>
<div style="font-family:Arial">If not, it MUST return error. </div><div style="font-family:Arial"><br></div><div><font class="Apple-style-span" face="'courier new', monospace">event.data</font><span class="Apple-style-span" style="font-family:Arial"> contains either "</span><font class="Apple-style-span" face="'courier new', monospace">unchanged</font><span class="Apple-style-span" style="font-family:Arial">" or "</span><font class="Apple-style-span" face="'courier new', monospace">changed</font><span class="Apple-style-span" style="font-family:Arial">". </span></div>
<div style="font-family:Arial">If "unchanged", return false. </div><div style="font-family:Arial">Else, return true. </div><div style="font-family:Arial"><br></div><div style="font-family:Arial"><b>Step 2. RP loads IdP frame</b></div>
<div style="font-family:Arial"><br></div><div style="font-family:Arial">The IdP frame receives postMessage from the RP frame. </div><div><span class="Apple-style-span" style="font-family:Arial">The event listener function MUST check if </span><font class="Apple-style-span" face="'courier new', monospace">event.origin === RP URL.</font><font class="Apple-style-span" face="Arial"> </font></div>
<div><font class="Apple-style-span" face="'courier new', monospace">event.data</font><span class="Apple-style-span" style="font-family:Arial"> contains </span><font class="Apple-style-span" face="'courier new', monospace">client_id</font><span class="Apple-style-span" style="font-family:Arial"> and </span><font class="Apple-style-span" face="'courier new', monospace">session_state</font><span class="Apple-style-span" style="font-family:Arial">. </span></div>
<div><span class="Apple-style-span" style="font-family:Arial">Cookie has </span><font class="Apple-style-span" face="'courier new', monospace">idp_session_state</font><font class="Apple-style-span" face="Arial">. Origin is </font><font class="Apple-style-span" face="'courier new', monospace">event.origin</font><font class="Apple-style-span" face="Arial">. </font></div>
<div style="font-family:Arial">Thus session_state can be re-calculated. </div><div><span class="Apple-style-span" style="font-family:Arial">If received </span><font class="Apple-style-span" face="'courier new', monospace">session_state</font><font class="Apple-style-span" face="Arial"> and the calculated </font><font class="Apple-style-span" face="'courier new', monospace">session_state</font><font class="Apple-style-span" face="Arial"> is equal, </font></div>
<div style="font-family:Arial">it should do: </div><div><span class="Apple-style-span" style="font-family:Arial">   </span><font class="Apple-style-span" face="'courier new', monospace">event.source.postMessage('unchanged', event.origin); </font></div>
<div style="font-family:Arial">Otherwise: </div><div><span class="Apple-style-span" style="font-family:Arial">   </span><font class="Apple-style-span" face="'courier new', monospace">event.source.postMessage('changed', event.origin); </font></div>
<div style="font-family:Arial"><br></div><div style="font-family:Arial"><b>Step 3. RP polls the IdP Frame.</b> </div><div style="font-family:Arial"><br></div><div><font class="Apple-style-span" face="'courier new', monospace">window.settimeout(checkState, 30000);</font></div>
<div><font class="Apple-style-span" face="'courier new', monospace"><br></font></div><div><font class="Apple-style-span" face="'courier new', monospace">function checkState </font></div><div><font class="Apple-style-span" face="'courier new', monospace">{</font></div>
<div><font class="Apple-style-span" face="'courier new', monospace">   if(hasChanged(client_id, session_state) ) {</font></div><div><font class="Apple-style-span" face="'courier new', monospace">   onStateChange();</font></div>
<div><font class="Apple-style-span" face="'courier new', monospace">}</font></div><div><font class="Apple-style-span" face="'courier new', monospace"><br></font></div><div><font class="Apple-style-span" face="'courier new', monospace">function onStateChange</font></div>
<div><span class="Apple-style-span" style="font-family:Arial">  --> first attempt to revalidate current session via propt:none authn request including </span><font class="Apple-style-span" face="'courier new', monospace">id_token</font><font class="Apple-style-span" face="Arial"> or a user hint for the session. </font></div>
<div style="font-family:Arial"><br></div><div><br></div>-- <br>Nat Sakimura (=nat)<div>Chairman, OpenID Foundation<br><a href="http://nat.sakimura.org/" target="_blank">http://nat.sakimura.org/</a><br>@_nat_en</div><br>
</div>