<div>Well, I&#39;ve slept on it.&nbsp; I think we have a difference in philosophy.</div>
<div>&nbsp;</div>
<div>The other Extesions - AX, Simple Registration, etc.&nbsp;- follow the same data flow methodology:</div>
<div>&nbsp;</div>
<div>RP -&gt; UA -&gt; OP</div>
<div>RP &lt;- UA &lt;- OP</div>
<div>&nbsp;</div>
<div>I believe I&#39;m sticking to the same principles in my spec.&nbsp; We are doing the very same thing when we collect the authentication key (see above).&nbsp; We are even doing the very same thing when we have the sites authenticate with each other.&nbsp; It&#39;s just we have a non-human operating the User Agent.&nbsp; In this case, the RP is the &quot;destination&quot; site, the UA is the &quot;client&quot; site: 
</div>
<div>&nbsp;</div>
<div>RP -&gt;&nbsp;UA -&gt; OP</div>
<div>RP &lt;-&nbsp;UA &lt;- OP</div>
<div>&nbsp;</div>
<div>I think this fits well with what people expect.&nbsp; I also have no problem with having OPs incrementally improve their systems to make them compatible with new extensions.&nbsp; Since there will (eventually) be far more RPs out there than OPs, I think it&#39;s reasonable for them to support the bulk of the extension implementation. 
</div>
<div>&nbsp;</div>
<div>In this case, however, there really isn&#39;t all that much to implement.&nbsp; The following code changes will need to happen at the site that wants access to information at another site (the CC):</div>
<div>&nbsp;</div>
<div>* The form where the user submits their OpenID to grant permission to another site</div>
<div>* Logic that builds a simple&nbsp;OpenID login request with the Trusted Authentication data included, and a redirect to the OP</div>
<div>* A branch to the &quot;id_res&quot; checker that parses the OP response and stores the shared secret</div>
<div>* An automated script that performs OpenID authentication to the DC and retreives data</div>
<div>&nbsp;</div>
<div>The OP needs to implement the following:</div>
<div>&nbsp;</div>
<div>* When receiving a check_id request with Trusted Authentication arguments, send an X-OPENID-TrustedAuthentication HTTP header in the response, and be able to accept a SHA-256 hash as a response&nbsp; - This is not a big deal, and isn&#39;t any form of deviation, because this is the &quot;gray area&quot; in the spec where the UA is supposed to be verified that it&#39;s already logged in, or is prompted for credentials 
</div>
<div>* Add a logic branch that generates a shared secret when requested, stores it, and sends&nbsp;it&nbsp;in the&nbsp;authentication response</div>
<div>* Some form of user interface to manage the stored secrets - very easy</div>
<div>&nbsp;</div>
<div>All but one of these steps would be needed to implement ANY OpenID extension out there.&nbsp; And the only change that is &quot;out of spec&quot; is&nbsp;accepting an SHA-256 hash as an authentication key - which is&nbsp;trivial to implement at an OP.
</div>
<div>&nbsp;</div>
<div>Conservatively, (with distractions) I think an OP can implement the data passing in less than a couple of hours, and the user interface in a couple of days.</div>
<div>&nbsp;</div>
<div>Although&nbsp;your implementation is sound,&nbsp;and I like a lot of the ideas, they shift a lot of the responsibility to the party receiving the authentication request.&nbsp; I&#39;m not sure I like the idea of having the burden of implementing both an API and a special pseudo-OP.&nbsp; This also removes the power of having a single Identity management interface at the OP, meaning the user will have to log on to the destination site to invalidate the token.&nbsp; What if the user has 50 of these API connections set up?&nbsp; That&#39;s 50 sites to visit in order to manage these tokens.
</div>
<div>&nbsp;</div>
<div>Like I said, nothing&nbsp;technically wrong with the idea (it&#39;s novel), but it just doesn&#39;t fit with me.</div>
<div>&nbsp;</div>
<div>Thank you!</div>
<div>&nbsp;</div>
<div>John Ehn&nbsp;</div>
<div>&nbsp;</div>
<div><span class="gmail_quote">On 8/30/07, <b class="gmail_sendername">James Henstridge</b> &lt;<a onclick="return top.js.OpenExtLink(window,event,this)" href="mailto:james@jamesh.id.au" target="_blank">james@jamesh.id.au
</a>&gt; wrote:</span> 
<blockquote class="gmail_quote" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid">On 30/08/2007, John Ehn &lt;<a onclick="return top.js.OpenExtLink(window,event,this)" href="mailto:john@extremeswank.com" target="_blank">
john@extremeswank.com</a>&gt; wrote:<br>&gt; James,<br>&gt;<br>&gt; Sorry, but I&#39;m having problems following the flow.&nbsp;&nbsp;It seems like an<br>&gt; interesting idea, though.&nbsp;&nbsp;Can you provide with a little more information on
<br>&gt; how these components would interact? <br><br>Okay.&nbsp;&nbsp;The basic idea was that instead of creating a special protocol<br>for two OpenID relying parties to communicate with each other was for<br>the web services data provider to act as an OpenID provider.
<br><br>So, lets assume that the data consumer wants an auth token for the<br>user identified by <a onclick="return top.js.OpenExtLink(window,event,this)" href="http://user.identifier.url/" target="_blank">http://user.identifier.url
</a>.&nbsp;&nbsp;With normal OpenID<br>authentication, you&#39;d perform discovery to find the user&#39;s OpenID <br>provider.&nbsp;&nbsp;To request an auth token though we need to talk to the data<br>provider, so instead we skip discovery and perform an authentication
<br>request to the data provider&#39;s endpoint.&nbsp;&nbsp;The parameters might look <br>something like this:<br><br>* openid.mode = checkid_setup<br>* openid.claimed_id = <a onclick="return top.js.OpenExtLink(window,event,this)" href="http://user.identifier.url/" target="_blank">
http://user.identifier.url</a><br>* openid.identity = <a onclick="return top.js.OpenExtLink(window,event,this)" href="http://user.identifier.url/" target="_blank">http://user.identifier.url </a><br>* openid.return_to = <a onclick="return top.js.OpenExtLink(window,event,this)" href="http://data.consumer/" target="_blank">
http://data.consumer/.</a>..<br>* openid.ns.auth = ...<br>* (additional parameters related to the auth token request)<br><br>The data provider would then decide whether to grant the auth token <br>(possibly by performing OpenID authentication against
<br><a onclick="return top.js.OpenExtLink(window,event,this)" href="http://user.identifier.url/" target="_blank">http://user.identifier.url</a>, and/or asking the user), then send a<br>response back like:<br><br>* openid.mode
 = id_res<br>* openid.claimed_id = <a onclick="return top.js.OpenExtLink(window,event,this)" href="http://user.identifier.url/" target="_blank">http://user.identifier.url</a><br>* openid.identity = <a onclick="return top.js.OpenExtLink(window,event,this)" href="http://user.identifier.url/" target="_blank">
http://user.identifier.url</a><br>* openid.return_to = <a onclick="return top.js.OpenExtLink(window,event,this)" href="http://data.consumer/" target="_blank">http://data.consumer/.</a>..<br>* openid.ns.auth = ...<br>* openid.auth.token
 = ...<br>* openid.auth.secret = ...<br><br>The data consumer knows that the request came from the data provider<br>due to the signature on the OpenID response.&nbsp;&nbsp;The data provider knows <br>which user to create the token for because it was present in the
<br>OpenID request.&nbsp;&nbsp;The data provider can verify that the web browser<br>user is that user because control gets transferred to the data<br>provider during the authentication process. <br><br>This all assumes that the data consumer has already authenticated the
<br>user, so knows which identity URL to request a token for from the data<br>provider.<br><br>&gt; I was really trying to keep everything dumb and simple.&nbsp;&nbsp;The concept I was <br>&gt; going for was &quot;piggy-back on OpenID, but include a way to programmatically
<br>&gt; log on to the OpenID Provider&quot;.&nbsp;&nbsp;The problem I saw with OpenID was that<br>&gt; there are about a million different ways to authenticate with an OpenID <br>&gt; Provider, from HTML forms to digital certificates.&nbsp;&nbsp;Most require the User
<br>&gt; Agent to be a web browser.&nbsp;&nbsp;However, there is no standard way to just pass a<br>&gt; credential that can prove that you are who you say you are. <br><br>Well, OpenID authentication requests are designed to let the OP
<br>perform whatever checking they want before sending a response.&nbsp;&nbsp;So by<br>making the data provider act as an OP, it has the same freedom<br>(including the freedom to issue its own OpenID authentication request <br>to the user&#39;s actual OP).
<br><br>&gt; I was trying to solve the problem by coming up with an automatable (if<br>&gt; that&#39;s a word) way to authenticate with an OpenID Provider.&nbsp;&nbsp;If we have<br>&gt; that, there&#39;s no need to pass around a special token, because we can just 
<br>&gt; use standard OpenID authentication if we want to log on to another system.<br>&gt; So, I proposed just having the Consumer get a key from the OpenID Provider<br>&gt; that it can use to automatically authenticate with the Provider in the 
<br>&gt; future.&nbsp;&nbsp;The key is passed through the user when it&#39;s granted, because you<br>&gt; need the user to approve the whole thing anyway.<br><br>I think that this makes things more complicated than need be.&nbsp;&nbsp;If you 
<br>want an auth token from the data provider it seems better to ask the<br>data provider for the key directly, giving it the chance to<br>authenticate the user before responding.<br><br>This also has the benefit that it does not require any special 
<br>features from the user&#39;s OP -- the extension is purely concerned with<br>the interaction between data consumer and provider.<br><br><br>&gt; I don&#39;t expect this extension to fix all problems.&nbsp;&nbsp;It&#39;s only intended to 
<br>&gt; solve a specific use case (website to website info sharing).&nbsp;&nbsp;I am working<br>&gt; on two additional extensions which will solve the other problems I see:<br><br>Sure.&nbsp;&nbsp;I doubt my suggested workflow would help with those use cases 
<br>either (at least without some additional components).<br><br>James.<br></blockquote></div><br>