<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule"
>

<channel>
	<title>willnorris.com &#187; microformats</title>
	<atom:link href="http://willnorris.com/tag/microformats/feed" rel="self" type="application/rss+xml" />
	<link>http://willnorris.com</link>
	<description>there&#039;s more to life than this</description>
	<lastBuildDate>Tue, 15 May 2012 21:57:32 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4-beta3-20574</generator>
<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/</creativeCommons:license>
		<item>
		<title>try { reuse; } catch (Ex) { reinvent; }</title>
		<link>http://willnorris.com/2007/11/try-reuse-catch-ex-reinvent</link>
		<comments>http://willnorris.com/2007/11/try-reuse-catch-ex-reinvent#comments</comments>
		<pubDate>Tue, 06 Nov 2007 03:49:45 +0000</pubDate>
		<dc:creator>Will Norris</dc:creator>
				<category><![CDATA[identity]]></category>
		<category><![CDATA[technology]]></category>
		<category><![CDATA[hcard]]></category>
		<category><![CDATA[ldap]]></category>
		<category><![CDATA[microformats]]></category>
		<category><![CDATA[openid]]></category>
		<category><![CDATA[openid-ax]]></category>
		<category><![CDATA[saml]]></category>
		<category><![CDATA[shibboleth]]></category>

		<guid isPermaLink="false">http://willnorris.com/2007/11/try-reuse-catch-ex-reinvent</guid>
		<description><![CDATA[Earlier today, I wrote about the limitations of hCard primarily in regards to private data. After talking with Chris briefly and then reading Tantek&#8217;s thoughts on the topic, it clicked with me. I wouldn&#8217;t normally make two posts so close together about such similar topics, but I realize now these really are two different topics. [...]]]></description>
			<content:encoded><![CDATA[<p>Earlier today, I wrote about the <a href="http://willnorris.com/2007/11/hcard-is-not-a-provisioning-engine-for-private-data">limitations of hCard</a> primarily in regards to private data.  After talking with <a href="http://factoryjoe.com/blog/2007/11/01/hcard-for-openid-simple-registration-and-attribute-exchange/">Chris</a> briefly and then reading <a href="http://tantek.com/log/2007/11.html#d02t2318">Tantek&#8217;s thoughts</a> on the topic, it clicked with me.  I wouldn&#8217;t normally make two posts so close together about such similar topics, but I realize now these really are two different topics.  The concerns about hCard and privacy are very real and certainly worth consideration, but what Chris was really getting at was attribute naming.</p>

<p><span id="more-208"></span></p>

<h3>OpenID attributes</h3>

<p>The OpenID <a href="http://openid.net/specs/openid-simple-registration-extension-1_0.html">Simple Registration Extension</a> was designed, much like OpenID itself, to address a very specific use case &#8212; providing the most common data requested when registering at a new website (things like name, email, gender, etc).  It defines a fixed list of nine attributes that can be provided, and it works well for what it does, but it&#8217;s a bit rigid when one tries to do anything more with it.  Even before the final draft of the SREG extension had been published, work was already being done on a more flexible extension for <a href="http://openid.net/specs/openid-attribute-exchange-1_0-07.html">attribute exchange</a>.  This new extension defined only a mechanism for transferring attributes, but didn&#8217;t prescribe a fixed list of attributes.  But in order to be at all useful, two parties must be assured that they are both talking about the same attribute.  Therefore an attribute registry was established at <a href="http://www.axschema.org/">axschema.org</a> and a number of attributes (formatted as URLs) have <a href="http://www.axschema.org/types/">already been defined</a> which will likely be useful in common scenarios.</p>

<h3>Attributes in Higher Education</h3>

<p>Developed in the early 90s at the University of Michigan, LDAP quickly grew favor with higher education institutions to replace heavier-weight directory protocols.  A number of LDAP object classes were defined to provide attributes deemed useful in certain contexts, for example <a href="http://tools.ietf.org/html/rfc2798">rfc2798</a> defined <code>inetOrgPerson</code> which addressed the needs of &#8220;Internet and Intranet directory service deployments&#8221;.  Higher Education had its own unique needs, so in 2001 Internet2 published the first version of the <a href="http://www.educause.edu/eduperson/">eduPerson Object Class</a>.  If (and only if) institutions required additional attributes beyond those provided by some already published object class, it was common practice to define a local object class to house those attributes.</p>

<p>Within a few years, the SAML specification was published and <a href="http://shibboleth.internet2.edu/">Shibboleth</a> began finding its way onto many college campuses.  Though not required by SAML, Shibboleth recommended the use of URIs for SAML attribute names, and subsequently established a <a href="http://www.google.com/search?q=cache:http://middleware.internet2.edu/dir/docs/internet2-mace-dir-saml-attributes-200604.pdf">collection of URN values</a> to represent common LDAP attributes, including those defined in the eduPerson object class.  As before, if campuses needed to include additional attributes in a SAML assertion, they were defined within a local namespace.  Today, it is very common to see a mix of attributes at USC including those defined by Internet2:</p>

<ul>
<li><code>urn:mace:dir:attribute-def:displayName</code></li>
<li><code>urn:mace:dir:attribute-def:eduPersonAffiliation</code></li>
</ul>

<p>as well as those we have defined locally at USC:</p>

<ul>
<li><code>urn:mace:usc.edu:gds:attribute-def:uscUSCID</code></li>
<li><code>urn:mace:usc.edu:gds:attribute-def:uscStudentDegreeProgram</code></li>
</ul>

<h3>Applying Precedence</h3>

<p>No one is pretending that the fixed set of attributes defined in <a href="http://tools.ietf.org/html/rfc2426">rfc2426</a> is the definitive list of attributes that could possibly be useful in OpenID, no more than eduPerson was the exhaustive list of attributes for every university that used it.  All that is being questioned is why did Attribute Exchange redefine all that was already established in vCard?  I would strongly support Tantek&#8217;s third proposal of hosting the official hCard XMDP profile at <code>http://microformats.org/profile/hcard</code>, so that AX can leverage the hCard specification while maintaining URL based attribute names.  And given that it appears as though <a href="http://willnorris.com/openid-support">no one is currently supporting AX</a>, <strong>now</strong> is the time to make this change.</p>

<p>(For the non-technical, the title roughly reads &#8220;First try to reuse.  Only if that doesn&#8217;t work, then reinvent.&#8221;)</p>
]]></content:encoded>
			<wfw:commentRss>http://willnorris.com/2007/11/try-reuse-catch-ex-reinvent/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>hCard is not a provisioning engine (for private data)</title>
		<link>http://willnorris.com/2007/11/hcard-is-not-a-provisioning-engine-for-private-data</link>
		<comments>http://willnorris.com/2007/11/hcard-is-not-a-provisioning-engine-for-private-data#comments</comments>
		<pubDate>Mon, 05 Nov 2007 23:29:53 +0000</pubDate>
		<dc:creator>Will Norris</dc:creator>
				<category><![CDATA[identity]]></category>
		<category><![CDATA[technology]]></category>
		<category><![CDATA[hcard]]></category>
		<category><![CDATA[microformats]]></category>
		<category><![CDATA[openid]]></category>
		<category><![CDATA[openid-ax]]></category>
		<category><![CDATA[saml]]></category>
		<category><![CDATA[shibboleth]]></category>

		<guid isPermaLink="false">http://willnorris.com/2007/11/hcard-is-not-a-provisioning-engine-for-private-data</guid>
		<description><![CDATA[Last week I wrote about how hCard is much more appropriate than OpenID for the provisioning use-case and Chris continued that discussion, questioning why we need SREG and Attribute Exchange when hCard works just fine. So the question is, when OpenID is clearly a player in the future and part of that promise is about [...]]]></description>
			<content:encoded><![CDATA[<p>Last week I wrote about how hCard is much more appropriate than OpenID for <a href="http://willnorris.com/2007/10/openid-is-not-a-provisioning-engine">the provisioning use-case</a> and Chris <a href="http://factoryjoe.com/blog/2007/11/01/hcard-for-openid-simple-registration-and-attribute-exchange/">continued that discussion</a>, questioning why we need SREG and Attribute Exchange when hCard works just fine.</p>

<blockquote>
  <p>So the question is, when OpenID is clearly a player in the future and part of that promise is about 
  making things easier, more consistent and more citizen-centric, why would we go and introduce a <strong>whole 
  new format</strong> for representing person-detail-data when a perfectly good one already exists and is so 
  widely supported?</p>
</blockquote>

<p>While I certainly agree with Chris that hCard has a role to play in the new world of online identity, I don&#8217;t want SREG or AX to be dismissed too quickly.  I don&#8217;t believe he was suggesting that hCard would replace SREG/AX in all use cases, but I want to labor this point just a little bit so that others are not confused.</p>

<p><span id="more-207"></span></p>

<p>There is one huge benefit to SREG and AX that hCard doesn&#8217;t (and by it&#8217;s nature, can&#8217;t) address&#8230; releasing different attributes to different relying parties.  This can take a number of forms.  The one most commonly supported in OpenID providers today is the idea of personas - a complete set of attribute values that reflect your online identity within a particular context.  You may have a &#8220;work&#8221; persona that includes your formal name, work email address and website, etc.  Separately, you may have a &#8220;personal&#8221; persona that has some informal nickname along with a personal email address, website. etc.  Separate still, you may have an &#8220;anonymous&#8221; persona that includes little (or fabricated) data about yourself.  Depending on which relying party you are authenticating to, you may use a particular persona.</p>

<p>Varying this slightly, one can imagine a use case that will be become increasingly important as OpenID continues to expand.  hCard is suitable for public attributes I want to post for the world to see, but what about not-so-public data?  It will likely be some time before we start transferring credit card numbers over OpenID+AX, but I have no doubt it will happen eventually (as nervous as that makes even me).  But even before then, I can imagine a host of data that I may need or want to provide to a relying party, but do not want to publish in my public hCard.  As I included in my <a href="http://willnorris.com/2007/03/openid-provider-wish-list">OpenID provider wish-list</a>, OpenID providers will need to provide the tools to manage the policies controlling this release of data, a feature that has the potential to really differentiate one provider from the rest of the pack.  This fine-grained level of control has always been a core requirement for the <a href="http://shibboleth.internet2.edu/">Shibboleth</a> SAML Identity provider, and I would argue that the (currently beta) Shibboleth 2.0 IdP has one of the most powerful and flexible (and admittedly, verbose) <a href="https://spaces.internet2.edu/display/SHIB2/AFPAttributeFilterPolicy">filtering engines</a> of its kind anywhere.</p>

<p>So there are really two issues at play in Chris&#8217;s question, that of the data format and separately, the mechanism for conveying that data.  I haven&#8217;t really addressed the issue of the data format, because I agree with Chris in principal at least.  His <a href="http://microformats.org/wiki/attribute-exchange">comparison table</a> of attribute names shows a very clear overlap between the different methods, and perhaps it would be useful to work to consolidate some of that.  But the mechanisms for making that data available address different, and equally valid, use cases and each play a role in making all of this stuff work.</p>
]]></content:encoded>
			<wfw:commentRss>http://willnorris.com/2007/11/hcard-is-not-a-provisioning-engine-for-private-data/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>OpenID is not a provisioning engine</title>
		<link>http://willnorris.com/2007/10/openid-is-not-a-provisioning-engine</link>
		<comments>http://willnorris.com/2007/10/openid-is-not-a-provisioning-engine#comments</comments>
		<pubDate>Tue, 30 Oct 2007 08:11:46 +0000</pubDate>
		<dc:creator>Will Norris</dc:creator>
				<category><![CDATA[identity]]></category>
		<category><![CDATA[technology]]></category>
		<category><![CDATA[hcard]]></category>
		<category><![CDATA[ldap]]></category>
		<category><![CDATA[microformats]]></category>
		<category><![CDATA[openid]]></category>
		<category><![CDATA[openid-ax]]></category>
		<category><![CDATA[provisioning]]></category>
		<category><![CDATA[saml]]></category>
		<category><![CDATA[shibboleth]]></category>

		<guid isPermaLink="false">http://willnorris.com/2007/10/openid-is-not-a-provisioning-engine</guid>
		<description><![CDATA[In talking about the future possibilities of OpenID 2.0 and the Attribute Exchange extension, James Henstridge mentions, Imagine being able to update your shipping address in one place when you move house and having all the online retailers you use receive the updated address immediately. Or changing your email address and having all the bugzilla [...]]]></description>
			<content:encoded><![CDATA[<p>In talking about the future possibilities of OpenID 2.0 and the <a href="http://openid.net/specs/openid-attribute-exchange-1_0-07.html">Attribute Exchange</a> extension, <a href="http://blogs.gnome.org/jamesh/2007/10/23/openid-20/">James Henstridge</a> mentions,</p>

<blockquote>
  <p>Imagine being able to update your shipping address in one place when you 
  move house and having all the online retailers you use receive the updated 
  address immediately. Or changing your email address and having all the 
  bugzilla instances you use pick up the new address instantly (perhaps 
  requiring you to verify the new address first, of course).</p>
</blockquote>

<p>While I agree this kind of experience would be very neat, it is not a use case for OpenID nor the Attribute Exchange extension.<span id="more-206"></span>  I am not surprised to hear someone say this, as this is a common point of confusion here at USC in regards to <a href="http://shibboleth.internet2.edu/">Shibboleth</a>.  When it comes to attribute delivery, both OpenID and SAML are primarily designed to provide data <em>at the time of login</em> <sup id="fnref:1"><a href="#fn:1" rel="footnote">1</a></sup>.  So this means that if a user never logs in to your service, you never get any data about them.  And if a user&#8217;s data changes since their last login, you don&#8217;t find out about until they <em>next</em> login, since that is the only time attribute delivery occurs.  It is also important to note that you are typically only getting data about the user that is logging in, no one else.  You can&#8217;t treat an OpenID provider as a lookup service to get data about some other user.</p>

<p>So how does a relying party update their data without waiting on the user to login again?  One option is to have the data pushed to each service using some kind of messaging hub.  There is a whole market for enterprise messaging complete with its own set of acronyms like <a href="http://en.wikipedia.org/wiki/Enterprise_service_bus">ESB</a>, <a href="http://en.wikipedia.org/wiki/Enterprise_messaging_system">EMS</a>, <a href="http://en.wikipedia.org/wiki/Enterprise_application_integration">EAI</a>, and many many more.  I&#8217;m particularly interested in a project developed by a colleague of mine in Sweden called <a href="http://devel.it.su.se/pub/jsp/polopoly.jsp?d=1227">JEvent</a>, which uses the XMPP <a href="http://www.xmpp.org/extensions/xep-0060.html">Publish-Subscribe</a> protocol to deliver these types of messages using a standard XMPP server in the middle.  Your Jabber messaging window becomes your console. :)</p>

<p>The other method of getting at user data is for each relying party to pull the data.  This is the model we use at USC, where that mechanism for pulling data is LDAP.  A number of services on campus use LDAP to address both use cases mentioned above &#8212; refreshing data about users, as well as looking up data about someone other than the user who logged in.  So what&#8217;s the equivalent in the decentralized OpenID world?  Well honestly there isn&#8217;t anything just yet but we have a good foundation.  Thanks to <a href="http://microformats.org/">microformats</a> like <a href="http://microformats.org/wiki/hcard">hCard</a>, you can publish your data in a standard, machine-parsable format that your online retailers or bugzilla instances could watch periodically.  When you update your hCard on your homepage they can respond in kind, perhaps by immediately updating their databases or sending you a confirmation email of the change.  Right now all of this data is decentralized, published on personal blogs and webpages.  I don&#8217;t argue that this data should certainly be under individual control, but it puts an awful large burden on the individual service providers to do all that spidering.  I don&#8217;t know what the answer is, but I&#8217;ve been thinking about an hCard crawler with an LDAP front-end as a simple place to start.  Configure Apple AddressBook or Outlook to use LDAP, and you&#8217;re off and running.</p>

<div class="footnotes">
<hr />
<ol>

<li id="fn:1">
<p>SAML is actually a little more flexible here, but it&#8217;s not the common use case&#160;<a href="#fnref:1" rev="footnote">&#8617;</a></p>
</li>

</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://willnorris.com/2007/10/openid-is-not-a-provisioning-engine/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>wordpress microID plugin</title>
		<link>http://willnorris.com/2006/07/wordpress-microid-plugin</link>
		<comments>http://willnorris.com/2006/07/wordpress-microid-plugin#comments</comments>
		<pubDate>Fri, 07 Jul 2006 19:13:49 +0000</pubDate>
		<dc:creator>Will Norris</dc:creator>
				<category><![CDATA[identity]]></category>
		<category><![CDATA[claimid]]></category>
		<category><![CDATA[microformats]]></category>
		<category><![CDATA[microid]]></category>
		<category><![CDATA[openid]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://willnorris.com/2006/07/wordpress-microid-plugin</guid>
		<description><![CDATA[(I was going to post this as a comment to Richard&#8217;s post which I found from the microID blog, but then it started to get kinda long so I decided to just write this here). I&#8217;m a little confused by his use of microID in the comments. In addition to adding microIDs to the blog [...]]]></description>
			<content:encoded><![CDATA[<p>(I was going to post this as a comment to <a href="http://www.richardkmiller.com/blog/archives/2006/03/microid-plugin-for-wordpress">Richard&#8217;s post</a> which I found from the <a href="http://microid.org/blog/?p=8">microID blog</a>, but then it started to get kinda long so I decided to just write this here).</p>

<p>I&#8217;m a little confused by his use of microID in the comments.  In addition to adding microIDs to the blog HEAD and posts, Richard&#8217;s plugin (which I have installed here) adds a microID to blog comments that is computed using the commenter&#8217;s email and webpage.  I see two different use cases when it comes to microIDs and blog comments&#8230;</p>

<p><span id="more-153"></span></p>

<h3>Verifying email/URL couplet</h3>

<p>Richard quotes something <a href="http://jeremie.com/">Jeremie</a> says on the <a href="http://microid.org/">microID homepage</a> &#8212;</p>

<blockquote>
  <p>Blog comment systems can check the given email address 
  against a MicroID from the entered home page link to help 
  reduce link spamming and blatant spoofing.</p>
</blockquote>

<p>So this means a blog could potentially use a microID to verify the authenticity of an email/url claimed by a commenter.  That is, when I make a comment on someone&#8217;s blog, their comment filtering system would compute a microID using the email and URL I claimed, and would make an out-of-band call back to my blog and compare the microID that I have on my site there.  If it matches, then the email and URL are &#8220;valid&#8221; so to speak, and we&#8217;re done.  If it doesn&#8217;t match, then the email addresses used to compute each ID are obviously different.</p>

<p>However, I do disagree with Jeremie&#8217;s claim that this could help reduce blatant spoofing (Jeremie even mentions this himself in an <a href="http://microid.org/blog/?p=5">FAQ</a>).  Nothing prevents me from entering someone else&#8217;s email address and URL into a comment box.  When they compare microIDs, of course they will match.  This simply verifies a valid email/url couplet, but does not verify that the person making the comment actually owns either of those items.  Put simply, <em>microID does not do authentication</em> (which the webpage mentions).  Use <a href="http://openid.com/">openID</a> for that!</p>

<h3>Attributing ownership</h3>

<p>The second use case is that of attributing ownership of a given comment to the author of that comment (which I think is what Richard was going after with his plugin).  A microID is basically an assertion of ownership with three distinct parts.</p>

<ul>
<li>The <em>authority</em> making the assertion &#8212; this is the actual webpage that the content is hosted on.  If you have the ability to manipulate the content of a given website, then it is assumed that you have some kind of authority over that security domain (or at least a small portion of it).  This authority is the URL used to compute the microID.</li>
<li>The <em>person</em> who owns the content &#8212; in the microID world, people are identified by email address, and this email address is used to compute the microID.</li>
<li>The <em>content</em> for which ownership is being asserted &#8212; this is not part of the microID itself, but rather is implied based on the placement of the ID.  If I am asserting ownership of an entire website, then the microID should appear within the HEAD tag.  If ownership is being asserted for a small portion of content (such as a specific blog comment), then class values are used.</li>
</ul>

<p>Back to Richard&#8217;s plugin, the content is obviously the actual comment itself and the person is the commenter, but where I think his plugin goes astray is the authority.  In this case, the authority is not the commenter&#8217;s URL, but rather the URL of where this comment is hosted (most likely the URL of the original blog post the comment was made on).  This would allow the commenter to make a claim of ownership of that comment on a system such as <a href="http://claimid.com/">claimID</a> (although I believe claimID only supports page level claims right now&#8230; not sections of content like this.  Speaking of which, how <em>would</em> you specify which portion of a webpage you were claiming ownership of?  Maybe use an #anchor in the URL?  The microID verifier would certainly have to know how to deal with that).</p>

<p>So all that to say, I think the following function:</p>

<pre><code>function add_microid_on_comment($comment = '')
{
    $microid = microid_hash(get_comment_author_email(), get_comment_author_url());
    return "&lt;div class='microid-$microid'&gt;$comment&lt;/div&gt;";
}
</code></pre>

<p>should instead be changed to</p>

<pre><code>function add_microid_on_comment($comment = '')
{
    $microid = microid_hash(get_comment_author_email(), get_permalink());
    return "&lt;div class='microid-$microid'&gt;$comment&lt;/div&gt;";
}
</code></pre>

<p>(Wasn&#8217;t trying to pick on Richard in this post&#8230; actually I really like his plugin and find it very useful.  Explaining all this in this fashion actually helped clear it up in my head as well).</p>
]]></content:encoded>
			<wfw:commentRss>http://willnorris.com/2006/07/wordpress-microid-plugin/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

