{"id":235,"date":"2009-11-16T04:10:11","date_gmt":"2009-11-16T11:10:11","guid":{"rendered":"https:\/\/self-issued.info\/?p=235"},"modified":"2009-11-16T04:10:11","modified_gmt":"2009-11-16T11:10:11","slug":"an-experimental-identity-selector-for-openid","status":"publish","type":"post","link":"https:\/\/self-issued.info\/?p=235","title":{"rendered":"An Experimental Identity Selector for OpenID"},"content":{"rendered":"<p><span class=\"plain\"><img decoding=\"async\" align=\"right\" src=\"https:\/\/self-issued.info\/images\/openid-logo.png\" alt=\"OpenID logo\" \/><\/span>The OpenID community has been talking about the value that an optional active client could bring to OpenID for well over a year.  To concretely explore this possibility, as many of you know by now, a team at Microsoft built a prototype multi-protocol identity selector supporting OpenID, starting with CardSpace 2, which I and others demonstrated at the <a href=\"http:\/\/openid.eventbrite.com\/\">OpenID Summit<\/a> and the <a href=\"http:\/\/www.internetidentityworkshop.com\/\">Internet Identity Workshop<\/a>.  We did this to stimulate discussion and engage the community about the value of adding active client support to OpenID.  And I&#8217;ll say up front that enormous thanks go to <a href=\"http:\/\/joseph.myplaxo.com\/\">Joseph Smarr at Plaxo<\/a>, the team at <a href=\"http:\/\/www.janrain.com\/\">JanRain<\/a>, and <a href=\"http:\/\/blog.nerdbank.net\/\">Andrew Arnott<\/a> for building demonstration relying parties that worked with the prototype, which made the demonstrations possible.<\/p>\n<p>While you may have read about it <a href=\"http:\/\/www.identityblog.com\/?p=1070\">on Kim&#8217;s blog<\/a> and many of you were there in person, I wanted to capture screen shots from the demos to make them available, so those who weren&#8217;t there can join the discussion as well.  Plus, I&#8217;ve posted <a href=\"https:\/\/self-issued.info\/presentations\/An_Experimental_Active_Client_for_OpenID.pdf\">the presentation that accompanied the demos<\/a>, rather than reproducing that content here.  Now, on to the demo, which closely follows the one actually given at the Summit&#8230;<\/p>\n<p>&nbsp;<\/p>\n<hr \/>\n<p><strong><font size=\"4\">Using a selector for the first time<\/font><\/strong><\/p>\n<p>I start by demonstrating the user experience for a first-time selector user at a a selector-enabled OpenID relying party.<\/p>\n<p>&nbsp;<\/p>\n<p><span class=\"plain\"><img decoding=\"async\" src=\"https:\/\/self-issued.info\/images\/OpenID_Selector\/Plaxo_signin.png\" alt=\"Plaxo signin\" \/><\/span><br \/>\nThe first screen shot shows a standard Plaxo login screen, but augmented behind the covers to enable it to pass its OpenID authentication request parameters to an active client, if present.  I will click on the &#8220;Sign in with OpenID&#8221; button on the Plaxo signin page, invoking the selector.<\/p>\n<p>In the prototype, selector-enabled relying parties use a variant of the Information Card object tag to communicate their request parameters to the selector.  The object tag parameters used on Plaxo&#8217;s RP page are:<br \/>\n<code>&lt;object type=\"application\/x-informationCard\" id=infoCardObjectTag&gt;<br \/>\n&lt;param name=protocol value=\"http:\/\/specs.openid.net\/auth\/2.0\"\/&gt;<br \/>\n&lt;param name=tokenType value=\"http:\/\/specs.openid.net\/auth\/2.0\"\/&gt;<br \/>\n&lt;param name=issuer value=\"Google.com\/accounts\/o8\/id Yahoo.com myOpenID.com\"\/&gt;<br \/>\n&lt;param name=issuerExclusive value=false\/&gt;<br \/>\n&lt;param name=OpenIDAuthParameters value=<br \/>\n\"openid.ns:http:\/\/specs.openid.net\/auth\/2.0<br \/>\nopenid.return_to:http:\/\/www.plaxo.com\/openid?actionType=complete<br \/>\nopenid.realm:http:\/\/*.plaxo.com\/<br \/>\nopenid.ns.sreg:http:\/\/openid.net\/extensions\/sreg\/1.1<br \/>\nopenid.sreg.required:email<br \/>\nopenid.sreg.optional:fullname,nickname,dob,gender,postcode,country,language,timezone<br \/>\nopenid.sreg.policy_url:http:\/\/www.plaxo.com\/about\/privacy_policy<br \/>\n\"\/&gt;<br \/>\n&lt;\/object&gt;<br \/>\n<\/code><\/p>\n<p>&nbsp;<\/p>\n<p><span class=\"plain\"><img decoding=\"async\" src=\"https:\/\/self-issued.info\/images\/OpenID_Selector\/Plaxo_empty_selector.png\" alt=\"Plaxo empty selector\" \/><\/span><br \/>\nHere I&#8217;ve clicked on the &#8220;Sign in with OpenID&#8221; button, invoking the selector.  (The &#8220;Google&#8221; and &#8220;Yahoo&#8221; buttons would have invoked the selector too.)  This shows the first-time selector user experience, where it isn&#8217;t yet remembering any OpenIDs for me.  The three OPs suggested by Plaxo &#8212; Google, Yahoo, and MyOpenID, are shown, as well as the option to type in a different OpenID.  I click on the Yahoo suggestion.<\/p>\n<p>&nbsp;<\/p>\n<p><span class=\"plain\"><img decoding=\"async\" src=\"https:\/\/self-issued.info\/images\/OpenID_Selector\/Plaxo_Yahoo_first_time.png\" alt=\"Plaxo Yahoo first time\" \/><\/span><br \/>\nClicking on Plaxo&#8217;s Yahoo suggestion resulted in a Yahoo OpenID card being made available for use.  Note that, by default, the selector will remember this card for me.  (Those of you who know OpenID well are probably thinking &#8220;Where did the selector get the Yahoo logo and friendly name string&#8221;?  For this prototype, they are baked into the selector.  Longer term, the right way is for the selector to retrieve these from the OP&#8217;s discovery document.  The OpenID UX working group is considering defining discovery syntax for doing just that.)<\/p>\n<p>Once I&#8217;ve clicked &#8220;OK&#8221; to select the identity to use, the selector (not the RP) redirects the browser to the OP &#8212; in this case, to the Yahoo login page.  The selector&#8217;s work is done at this point.  The remainder of the protocol flow is standard OpenID 2.0.<\/p>\n<p>&nbsp;<\/p>\n<p><span class=\"plain\"><img decoding=\"async\" src=\"https:\/\/self-issued.info\/images\/OpenID_Selector\/Yahoo_Plaxo_signin.png\" alt=\"Yahoo Plaxo signin\" \/><\/span><br \/>\nThis is the standard Yahoo OpenID signin page, which the selector redirected the browser to after I choose to use the suggested Yahoo OpenID.  I sign into Yahoo.<\/p>\n<p>&nbsp;<\/p>\n<p><span class=\"plain\"><img decoding=\"async\" src=\"https:\/\/self-issued.info\/images\/OpenID_Selector\/Yahoo_Plaxo_permission.png\" alt=\"Yahoo Plaxo permission\" \/><\/span><br \/>\nThe signin page is followed by the standard Yahoo permissions page.  I click &#8220;Agree&#8221;.<\/p>\n<p>&nbsp;<\/p>\n<p><span class=\"plain\"><img decoding=\"async\" src=\"https:\/\/self-issued.info\/images\/OpenID_Selector\/Plaxo_signed_in.png\" alt=\"Plaxo signed in\" \/><\/span><br \/>\nAfter logging with Yahoo, I&#8217;m redirected back to Plaxo.  Because I&#8217;d previously associated my Yahoo OpenID with my Plaxo account, I&#8217;m now logged into Plaxo.  My status &#8220;Michael is demonstrating an OpenID selector at the OpenID Summit&#8221;, which I updated live during the demo at the OpenID Summit, is shown.<\/p>\n<p>&nbsp;<\/p>\n<hr \/>\n<p><strong><font size=\"4\">Selector defaults to the OpenID last used at the site<\/font><\/strong><\/p>\n<p>At this point in the demo, I&#8217;ve signed out of Plaxo and returned to the selector-enabled sign-in page.  After clicking &#8220;Sign in with OpenID&#8221; again, the selector reappears.<\/p>\n<p><span class=\"plain\"><img decoding=\"async\" src=\"https:\/\/self-issued.info\/images\/OpenID_Selector\/Plaxo_Yahoo_second_time.png\" alt=\"Plaxo Yahoo second time\" \/><\/span><br \/>\nThis time, the selector has remembered the OpenID I last used at the site and tells me when I last used it there.  (This is one of the ways that a selector can help protect people from phishing.)  By default, the OpenID last used at a relying party is automatically selected &#8212; in this case, Yahoo.  I click &#8220;OK&#8221; to select it, with the rest of the flow again being the standard OpenID 2.0 flow.<\/p>\n<p>&nbsp;<\/p>\n<hr \/>\n<p><strong><font size=\"4\">Experience at a new RP plus a trusted OP experience<\/font><\/strong><\/p>\n<p><span class=\"plain\"><img decoding=\"async\" src=\"https:\/\/self-issued.info\/images\/OpenID_Selector\/Interscope_homepage.png\" alt=\"Interscope homepage\" \/><\/span><br \/>\n<a href=\"http:\/\/www.janrain.com\/\">JanRain<\/a> selector-enabled several production sites, including interscope.com, uservoice.com, and pibb.com, which use JanRain&#8217;s hosted <a href=\"http:\/\/www.janrain.com\/products\/rpx\">RPX service<\/a>.  This could be done with no impact on users without a selector by using JavaScript to detect whether a selector is present or not, and customizing the page accordingly.  The page above is the production Interscope Records page.  I click the OpenID button on the right under the &#8220;Join The Community&#8221; banner.<\/p>\n<p>&nbsp;<\/p>\n<p><span class=\"plain\"><img decoding=\"async\" src=\"https:\/\/self-issued.info\/images\/OpenID_Selector\/Interscope_signon.png\" alt=\"Interscope signon\" \/><\/span><br \/>\nThe OpenID button invokes the RPX &#8220;NASCAR&#8221; experience.  (Arguably, this page could be omitted from the experience if a selector is detected.)  I click the OpenID button on the &#8220;NASCAR&#8221; page.<\/p>\n<p>&nbsp;<\/p>\n<p><span class=\"plain\"><img decoding=\"async\" src=\"https:\/\/self-issued.info\/images\/OpenID_Selector\/Interscope_Yahoo_never_used_here.png\" alt=\"Interscope Yahoo never used here\" \/><\/span><br \/>\nThe selector is invoked by Interscope (really, by RPX) to let me choose an OpenID.  My Yahoo OpenID is shown and the &#8220;Never used here&#8221; tells me that I haven&#8217;t used it at this site before.  I could choose it by clicking OK or hitting Enter.  Instead, I click the &#8220;Other OpenIDs&#8221; button to explore other options.<\/p>\n<p>&nbsp;<\/p>\n<p><span class=\"plain\"><img decoding=\"async\" src=\"https:\/\/self-issued.info\/images\/OpenID_Selector\/Interscope_other_OpenIDs.png\" alt=\"Interscope other OpenIDs\" \/><\/span><br \/>\nThe &#8220;Other OpenIDs&#8221; tile shows me the OpenID providers suggested by Interscope &#8212; in this case, Flickr, Yahoo, and Google.  I click on the Google suggestion.<\/p>\n<p>&nbsp;<\/p>\n<p><span class=\"plain\"><img decoding=\"async\" src=\"https:\/\/self-issued.info\/images\/OpenID_Selector\/Interscope_Google_first_time.png\" alt=\"Interscope Google first time\" \/><\/span><br \/>\nThe selector has created a Google OpenID card for me to use.  It is marked &#8220;Verified&#8221; because it (like Yahoo) was on a whitelist in the selector and considered &#8220;safe&#8221; to use.  Of course, in production use, such a whitelist would have to be maintained by a neutral third party or parties and dynamically updated.  In the prototype, we hard-coded a few common providers so we could show a user experience that relies on a whitelist of OPs, to start the discussion about that possibility.  I hit Enter to use the new Google card at Interscope.<\/p>\n<p>&nbsp;<\/p>\n<p><span class=\"plain\"><img decoding=\"async\" src=\"https:\/\/self-issued.info\/images\/OpenID_Selector\/Google_UniversalMusic_signin.png\" alt=\"Google UniversalMusic signin\" \/><\/span><br \/>\nOnce I chose to use my Google card, the selector redirected me to Google&#8217;s signin page, with the actual RP for Interscope being signup.universalmusic.com.  I sign into Google.<\/p>\n<p>&nbsp;<\/p>\n<p><span class=\"plain\"><img decoding=\"async\" src=\"https:\/\/self-issued.info\/images\/OpenID_Selector\/Google_UniversalMusic_permission.png\" alt=\"Google UniversalMusic permission\" \/><\/span><br \/>\nFollowing signin, Google asks me permission to release information to signup.universalmusic.com.  I allow it.<\/p>\n<p>&nbsp;<\/p>\n<p><span class=\"plain\"><img decoding=\"async\" src=\"https:\/\/self-issued.info\/images\/OpenID_Selector\/Interscope_registration.png\" alt=\"Interscope registration\" \/><\/span><br \/>\nI&#8217;m redirected back to Interscope, which asked me to complete a sign-up process by supplying more information via a web form.<\/p>\n<p>&nbsp;<\/p>\n<hr \/>\n<p><strong><font size=\"4\">Selector remembering which OpenID&#8217;s you&#8217;ve used where<\/font><\/strong><\/p>\n<p><span class=\"plain\"><img decoding=\"async\" src=\"https:\/\/self-issued.info\/images\/OpenID_Selector\/Interscope_Google_second_time.png\" alt=\"Interscope Google second time\" \/><\/span><br \/>\nWhen visiting Interscope again after having signed out, signing in with OpenID shows me that I last used my Google OpenID here.  For that reason, it&#8217;s selected as the default.  I can also see that I haven&#8217;t used my Yahoo OpenID here.<\/p>\n<p>&nbsp;<\/p>\n<hr \/>\n<p><strong><font size=\"4\">Trusted versus untrusted OpenIDs<\/font><\/strong><\/p>\n<p><span class=\"plain\"><img decoding=\"async\" src=\"https:\/\/self-issued.info\/images\/OpenID_Selector\/test-id_signin.png\" alt=\"test-id signin\" \/><\/span><br \/>\n<a href=\"http:\/\/blog.nerdbank.net\/\">Andrew Arnott<\/a> created the first selector-enabled relying party site for us, which is shown above.  I click &#8220;Log in using your OpenID Selector&#8221;.<\/p>\n<p>&nbsp;<\/p>\n<p><span class=\"plain\"><img decoding=\"async\" src=\"https:\/\/self-issued.info\/images\/OpenID_Selector\/test-id_Google_never_used_here.png\" alt=\"test-id Google never used here\" \/><\/span><br \/>\nNow I have both Yahoo and Google cards, but neither have been used at test-id.org.  I notice that I can get more details about my cards, and click &#8220;More details&#8221; on the Google card.<\/p>\n<p>&nbsp;<\/p>\n<p><span class=\"plain\"><img decoding=\"async\" src=\"https:\/\/self-issued.info\/images\/OpenID_Selector\/test-id_Google_more_details.png\" alt=\"test-id Google more details\" \/><\/span><br \/>\n&#8220;More details&#8221; tells me where and when I used the card (signup.universalmusic.com), the discovered OpenID endpoint, and that this OpenID was on the selector&#8217;s whitelist.  I could now use either of these OpenIDs, but I select &#8220;Other OpenIDs&#8221; instead.<\/p>\n<p>&nbsp;<\/p>\n<p><span class=\"plain\"><img decoding=\"async\" src=\"https:\/\/self-issued.info\/images\/OpenID_Selector\/test-id_other_OpenIDs.png\" alt=\"test-id other OpenIDs\" \/><\/span><br \/>\nThe &#8220;Other OpenIDs&#8221; panel shows me OPs suggested by the site, as well as a dialog box to enter another OpenID.  I decide to enter my blog URL self-issued.info, which is also an OpenID.<\/p>\n<p>&nbsp;<\/p>\n<p><span class=\"plain\"><img decoding=\"async\" src=\"https:\/\/self-issued.info\/images\/OpenID_Selector\/test-id_self-issued_being_entered.png\" alt=\"test-id self-issued being entered\" \/><\/span><br \/>\nHere I&#8217;m entering my blog URL self-issued.info into the selector.  I then click Verify or OK to have the selector perform discovery on the OpenID to add it as one of my choices.<\/p>\n<p>&nbsp;<\/p>\n<p><span class=\"plain\"><img decoding=\"async\" src=\"https:\/\/self-issued.info\/images\/OpenID_Selector\/test-id_self-issued_not_verified.png\" alt=\"test-id self-issued not verified\" \/><\/span><br \/>\nDiscovery has succeeded, but the OP my blog is delegated to, signon.com, is not on the selector&#8217;s whitelist.  Because it&#8217;s not, a warning shield is shown, rather than the OP logo.  I&#8217;ll also have to make an explicit decision to trust this OpenID provider before the selector will let me use it.  The same would have happened if I chose an OP suggested by the RP if the OP was not on the whitelist.  This is another aspect of the selector&#8217;s phishing protection.  I check the &#8220;Continue, I trust this provider&#8221; box.<\/p>\n<p>&nbsp;<\/p>\n<p><span class=\"plain\"><img decoding=\"async\" src=\"https:\/\/self-issued.info\/images\/OpenID_Selector\/test-id_self-issued_trusted.png\" alt=\"test-id self-issued trusted\" \/><\/span><br \/>\nAfter checking the &#8220;Continue, I trust this provider&#8221; box, the warning shield is replaced by either the OP logo, if it can be discovered, or a generic OpenID logo, as in this case.  I click OK to use this OpenID.<\/p>\n<p>&nbsp;<\/p>\n<p><span class=\"plain\"><img decoding=\"async\" src=\"https:\/\/self-issued.info\/images\/OpenID_Selector\/signon_test-id_signin.png\" alt=\"signon test-id signin\" \/><\/span><br \/>\nThe selector follows my delegation link from self-issued.info and redirects me to signon.com.  (Ping, are you going to fix the signon.com UX issue above someday?)  I sign into signon.com.<\/p>\n<p>&nbsp;<\/p>\n<p><span class=\"plain\"><img decoding=\"async\" src=\"https:\/\/self-issued.info\/images\/OpenID_Selector\/test-id_signed_in.png\" alt=\"test-id signed in\" \/><\/span><br \/>\nHaving signed into my OpenID at signon.com, I&#8217;m redirected back to the test site, which received an authentication response from the OP.  I click &#8220;Reset test&#8221; to sign out, in preparation for another test.<\/p>\n<p>&nbsp;<\/p>\n<hr \/>\n<p><strong><font size=\"4\">More details<\/font><\/strong><\/p>\n<p><span class=\"plain\"><img decoding=\"async\" src=\"https:\/\/self-issued.info\/images\/OpenID_Selector\/test-id_self-issued_second_time.png\" alt=\"test-id self-issued second time\" \/><\/span><br \/>\nUpon a second visit to test-id.org, the selector has remembered that I last used the OpenID self-issued.info, which is actually delegated to mbj.signon.com.  I click &#8220;More details&#8221; to learn more about this OpenID.<\/p>\n<p>&nbsp;<\/p>\n<p><span class=\"plain\"><img decoding=\"async\" src=\"https:\/\/self-issued.info\/images\/OpenID_Selector\/test-id_self-issued_more_details.png\" alt=\"test-id self-issued more details\" \/><\/span><br \/>\n&#8220;More details&#8221; tells me where and when I last used the OpenID and that the OpenID has been verified.  But unlike my Google OpenID, which was verified via the whitelist, I told the selector to trust this OpenID myself.<\/p>\n<p>&nbsp;<\/p>\n<hr \/>\n<p><strong><font size=\"4\">Delegation to a trusted OP<\/font><\/strong><\/p>\n<p><span class=\"plain\"><img decoding=\"async\" src=\"https:\/\/self-issued.info\/images\/OpenID_Selector\/test-id_davidrecordon_being_entered.png\" alt=\"test-id davidrecordon being entered\" \/><\/span><br \/>\nAt the OpenID Summit, people wanted to see the untrusted user experience again, so I entered an OpenID that I was sure wasn&#8217;t on our built-in whitelist &#8212; davidrecordon.com.  However, verifying the OpenID actually brought me and those in attendance a surprise&#8230;<\/p>\n<p>&nbsp;<\/p>\n<p><span class=\"plain\"><img decoding=\"async\" src=\"https:\/\/self-issued.info\/images\/OpenID_Selector\/test-id_davidrecordon_verified.png\" alt=\"test-id davidrecordon verified\" \/><\/span><br \/>\nBecause davidrecordon.com is delegated to myopenid.com, which is on the whitelist, it turns out that the prototype considered davidrecordon.com to be trusted as well.  Upon reflection, this is probably the right behavior, but I&#8217;d never seen it until giving the demo live.  (Great job, Oren!)  I tried factoryjoe.com next and got the same result.  Finally Will Norris helped me out by saying that willnorris.com isn&#8217;t delegated, so we got to see the untrusted user experience again.<\/p>\n<p>&nbsp;<\/p>\n<hr \/>\n<p><strong><font size=\"4\">Conclusion<\/font><\/strong><\/p>\n<p>I&#8217;d like to thank Chuck Reeves and Oren Melzer for quickly building a killer prototype and to thank Ariel Gordon and Arun Nanda for helping design it, as well as others, both from Microsoft and other companies, who provided feedback that helped us fine-tune it as we built it.  See <a href=\"https:\/\/self-issued.info\/presentations\/An_Experimental_Active_Client_for_OpenID.pdf\">the presentation<\/a> for a much more comprehensive list of thank-yous.<\/p>\n<p>I&#8217;ll close by saying that in the OpenID v.Next planning meeting at IIW, there was an unopposed consensus that optional active client support should be included as a feature of v.Next.  Hopefully our demo, as well as those by others, including Markus Sabadello of <a href=\"http:\/\/www.eclipse.org\/higgins\/\">Higgins<\/a>, helped the community decide that this is a good idea by enabling people to concretely experience the benefits that an active client can bring to OpenID.  If so, I&#8217;d call the experiment a success!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>The OpenID community has been talking about the value that an optional active client could bring to OpenID for well over a year. To concretely explore this possibility, as many of you know by now, a team at Microsoft built a prototype multi-protocol identity selector supporting OpenID, starting with CardSpace 2, which I and others [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[22,3,20,14,19,10,6],"tags":[],"class_list":["post-235","post","type-post","status-publish","format-standard","hentry","category-events","category-information-cards","category-janrain","category-openid","category-phishing-resistance","category-software","category-windows-cardspace"],"_links":{"self":[{"href":"https:\/\/self-issued.info\/index.php?rest_route=\/wp\/v2\/posts\/235","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/self-issued.info\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/self-issued.info\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/self-issued.info\/index.php?rest_route=\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/self-issued.info\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=235"}],"version-history":[{"count":20,"href":"https:\/\/self-issued.info\/index.php?rest_route=\/wp\/v2\/posts\/235\/revisions"}],"predecessor-version":[{"id":255,"href":"https:\/\/self-issued.info\/index.php?rest_route=\/wp\/v2\/posts\/235\/revisions\/255"}],"wp:attachment":[{"href":"https:\/\/self-issued.info\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=235"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/self-issued.info\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=235"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/self-issued.info\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=235"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}