<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" xml:lang="en" xml:base="http://hueniverse.com/wp-atom.php">
	<title type="text">hueniverse</title>
	<subtitle type="text">Thoughts on Technology, Standards, and the Open Web</subtitle>

	<updated>2012-01-04T23:36:13Z</updated>

	<link rel="alternate" type="text/html" href="http://hueniverse.com" />
	<id>http://hueniverse.com/feed/atom/</id>
	

	<generator uri="http://wordpress.org/" version="3.3.1">WordPress</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/Hueniverse" /><feedburner:info uri="hueniverse" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by/3.0/" /><logo>http://creativecommons.org/images/public/somerights20.gif</logo><feedburner:emailServiceId>Hueniverse</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><entry>
		<author>
			<name>Eran Hammer-Lahav</name>
						<uri>http://hueniverse.com</uri>
					</author>
		<title type="html"><![CDATA[You, Me, and Node @WalmartLabs]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Hueniverse/~3/kAnvdHQDR2U/" />
		<id>http://hueniverse.com/?p=1529</id>
		<updated>2012-01-04T23:04:20Z</updated>
		<published>2012-01-04T23:04:20Z</published>
		<category scheme="http://hueniverse.com" term="Node.js" /><category scheme="http://hueniverse.com" term="Personal" /><category scheme="http://hueniverse.com" term="Work" />		<summary type="html"><![CDATA[Another adventure begins. Two months ago I’ve joined @WalmartLabs to lead the mobile web services team. Surprised? I was. After working for one of the largest web companies in the world, all I wanted to do was go to a startup. That’s not exactly right; I wanted to be part of a tiny team with [...]]]></summary>
		<content type="html" xml:base="http://hueniverse.com/2012/01/you-me-and-node-walmartlabs/">&lt;p&gt;Another adventure begins.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.walmartlabs.com/"&gt;&lt;img class="alignright size-full wp-image-1531" style="margin-left: 30px; margin-right: 30px;" title="WalmartLabs" src="http://hueniverse.com/wp-content/uploads/2012/01/www.walmartlabs.png" alt="" width="204" height="43" /&gt;&lt;/a&gt;Two months ago I’ve joined &lt;a href="http://www.walmartlabs.com/"&gt;@WalmartLabs&lt;/a&gt; to lead the mobile web services team. Surprised? I was. After working for one of the &lt;a href="http://hueniverse.com/2011/12/sled-yahoo-and-moving-on/"&gt;largest web companies in the world&lt;/a&gt;, all I wanted to do was go to a startup. That’s not exactly right; I wanted to be part of a tiny team with a big mission, a place where the size of the challenge is matched by the freedom and resources to address it. Oh, and a lot of &lt;a href="http://hueniverse.com/2011/06/6-months-with-node-js/"&gt;node.js&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;I am excited to share this and tell you all about it, especially on the heels of this morning &lt;a href="http://www.rcrwireless.com/article/20120104/app-corner/walmart-acquires-makers-of-obama-starbucks-apps-to-remake-mobile-commerce/"&gt;announcement of the acquisition of Small Society&lt;/a&gt;. But I’m not going to lie to you: I have an agenda and I am trying to recruit you. If you are contemplating a career move and I “had you at node”, feel free to jump right to very end of this post to find more about the team we&amp;#8217;re building.&lt;/p&gt;
&lt;p&gt;&lt;span id="more-1529"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;Rethinking Retail Through Mobile&lt;/h3&gt;
&lt;p&gt;It’s all about size, especially when it comes to consumer retail. @WalmartLabs is part of Walmart’s Global E-Commerce group and is focused on reinventing retail through technology. This is among the most important strategic investments Walmart has made in recent years and it goes deep and wide. This is not simply about making online shopping better, but about fundamentally changing retail by creating a new, continuous shopping experience across technologies and venues.&lt;/p&gt;
&lt;p&gt;Our team is focused specifically on executing this vision through mobile. Unlike most other mobile retail applications, our focus isn’t limited to buying stuff on your phone or tablet. We are looking at the full range of possibilities when you have a powerful mobile device in your hand, both inside and outside the store. In addition, we are looking at a much wider set of products, from electronics to pharmacy and all the way to fresh groceries.&lt;/p&gt;
&lt;p&gt;The best part about building a team and talking to potential new hires are the new product ideas that come up when you start to think about what’s possible: An app that sorts your shopping list based on aisle location as you walk into a store; the brick-and-mortar version of ‘60% of your friends bought this brand of toothpaste’ when trying to decide which to buy; real-time checkout, showing you the total dollar amount including tax of the items in your cart; shopping analytics across stores and online purchases producing a new and unmatched dataset about your lifestyle and health as the foundation of new tools to improve your life. And this is just from my most recent conversation.&lt;/p&gt;
&lt;p&gt;From my first meeting with the team, I found myself thinking about new ways to change retail. I’ve never given much thought to that, other than noticing a feature I liked on Amazon or a time-saving service at a store. All of a sudden, I’ve started noticing all the small things we can change today – the obvious ideas just lying on the floor – if only I could get those apps in the hand of enough people. And that’s where Walmart offers a unique opportunity, with hundreds of millions of loyal customers worldwide eager to give your new idea a try.&lt;/p&gt;
&lt;h3&gt;Working for Walmart? You Can’t Be Serious!&lt;/h3&gt;
&lt;p&gt;Now let’s talk about the big blue elephant in the room: working for Walmart. I’m in no way trying to change how you view Walmart; only to share with you the process I went through.&lt;/p&gt;
&lt;p&gt;To put it bluntly, I had a gag reflex reaction to the idea of working for Walmart. It’s hard for me to pinpoint exactly what my reaction was based on. Walmart’s image, &lt;a href="http://en.wikipedia.org/wiki/Walmart#History"&gt;history&lt;/a&gt;, and &lt;a href="http://en.wikipedia.org/wiki/Criticism_of_Wal-Mart"&gt;impact on society&lt;/a&gt; played a role, but it was mostly my recent experience working for a large web company and past experience working for Citibank, the largest bank in the world, that turned me off. Short of working for the Department of Defense or the Chinese Army, &lt;a href="http://www.businessinsider.com/the-10-biggest-employers-in-the-world-2011-9"&gt;nothing gets bigger than Walmart&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This was not the employer of my dreams – far from it! – but the opportunity itself, and more importantly the caliber of the team, convinced me to take a deeper look. I spent hours reading up on Walmart, the good and the bad. Given the size of the company, there was plenty of both. I was surprised at how much I didn&amp;#8217;t know about the company.&lt;/p&gt;
&lt;p&gt;I was mostly blown away by the numbers, of which two really stuck with me:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;in the United States, 140 million people visit a Walmart store every week, and&lt;/li&gt;
&lt;li&gt;Walmart is responsible for 35% of all groceries sold.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I remembered an article I read a few years ago about &lt;a href="http://en.wikipedia.org/wiki/Adam_Werbach"&gt;Adam Werbach&lt;/a&gt;, once the youngest president of the Sierra Club, and his decision to &lt;a href="http://www.fastcompany.com/magazine/118/working-with-the-enemy.html"&gt;join Walmart and the backstory of that decision&lt;/a&gt;. I also recalled the &lt;a href="http://www.stonyfield.com/food-inc"&gt;Stonyfield story in Food Inc&lt;/a&gt;. and the impact Walmart had on the landscape of organic food (price, availability, and commoditization) once they decided to carry it in their stores.&lt;/p&gt;
&lt;p&gt;I’m not trying to draw any comparisons between these stories and my personal decision, other than to point out that when you get to point the “Force” (or “Death Star”, depending on your perspective) at a target, big things happen.&lt;/p&gt;
&lt;p&gt;At the end, we all make compromises when we work for any corporation, especially those large enough to have real impact. Walmart’s size translates directly into a noticeable impact on society but without getting too philosophical, so does Google’s, Apple’s, and News Corp’s to name a few. I have major grievances with all these corporations, but I do recognize that if I was trying to recruit you to work there, I would not be spending this much time to get you to look past the brand’s reputation. I respect the fact that for some it will always be “you lost me at Walmart”.&lt;/p&gt;
&lt;h3&gt;What Do I Want to Do When I Grow Up?&lt;/h3&gt;
&lt;p&gt;Last year I wrote about my decision to &lt;a href="http://hueniverse.com/2010/09/goodbye-open-and-why-i%E2%80%99m-staying-at-yahoo/"&gt;stay at Yahoo!&lt;/a&gt; and work on &lt;a href="http://hueniverse.com/2011/07/introducing-sled/"&gt;Sled&lt;/a&gt;, a virtual startup within Yahoo! building a &lt;a href="https://github.com/hueniverse/postmile"&gt;collaborative list-making tool&lt;/a&gt;. The list included products, culture, manager, team, and work/life balance, and these are still the main factors that matter to me. When the time came to move on to another opportunity, I’ve asked myself a two questions: what is it I’m most excited about these days, and who is it I am most interested in working with?&lt;/p&gt;
&lt;p&gt;My passion and focus the past four years has been around APIs: frameworks, design, advocacy, and lot of security (you know, all that &lt;a href="http://hueniverse.com/oauth/"&gt;OAuth&lt;/a&gt; stuff). But my true joy over that period is a lot more specific: &lt;a href="http://hueniverse.com/node-js/"&gt;node.js&lt;/a&gt;. Working with node for over a year in a full-time capacity has spoiled me and for the first time in a while, added a specific technology to my job search criteria.&lt;/p&gt;
&lt;p&gt;In one sentence, my dream job was &lt;strong&gt;leading the development of a new, world-class, open-sourced, node-based, OAuth-protected, developer-focused, API server framework&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;I wanted to take all my experience and ideas from the past few years and apply them to one awesome project. But that wasn’t enough (is it ever?). It had to be &lt;strong&gt;real&lt;/strong&gt;. I didn’t want another academic exercise or working in a vacuum. I also had no energy to constantly fight my employer to let me do what I was hired for. I wanted to build something that will get used and abused as soon as it was forming, ideally by millions of users.&lt;/p&gt;
&lt;p&gt;I wasn’t expecting to find it but I actually ended up with two such opportunities – both amazing. One was an early stage startup and the other, Walmart. The Walmart opportunity was a surprise. One of the people I really wanted to work with was &lt;a href="https://twitter.com/dalmaer"&gt;Dion Almaer&lt;/a&gt;. We have not worked together before but we did cross paths over the years and I’ve been following Dion’s and &lt;a href="http://benzilla.galbraiths.org/"&gt;Ben Galbraith&lt;/a&gt;’s work with interest. Turned out that earlier this year they sold &lt;a href="http://setdirection.com/"&gt;their company&lt;/a&gt; to Walmart and took over mobile engineering, helping to create @WalmartLabs.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://almaer.com/blog/helping-set-direction-at-walmart"&gt;Ben and Dion’s story on how they got to Walmart&lt;/a&gt; is pretty interesting by itself but even more telling about the team and the kind of opportunities it offers. At the end it wasn’t an easy decision and it was very close. I’m happy to report that a 2 months into this, I’m super excited about my decision and it seems to be the prevailing attitude shared by the rest of the brilliant people I get to work with which include &lt;a href="http://www.incaseofstairs.com/"&gt;Kevin Decker&lt;/a&gt; leading the mobile web team, Stefan Li leading the Android team, &lt;a href="https://twitter.com/bsneed"&gt;Brandon Sneed&lt;/a&gt; leading the iOS team, and the new folks from &lt;a href="http://smallsociety.com/"&gt;Small Society&lt;/a&gt; to mention just a few.&lt;/p&gt;
&lt;h3&gt;Let’s Talk About You!&lt;/h3&gt;
&lt;p&gt;Now that you know how I ended up at Walmart and got the big picture of what we are trying to do, we can talk about what it is we are actually doing and how you might fit in.&lt;/p&gt;
&lt;p&gt;To expand a bit on my one sentence job description, the mobile services teams is in charge of the backend serving all of our mobile applications. Today these include iPhone, iPad, Android, and mobile web. We are mainly focused on the US market but will expand internationally in the coming months. We have a legacy JAVA system in place which we are going to replace over the next few months with a brand new node solution, as well as develop new services directly in node.&lt;/p&gt;
&lt;p&gt;Our main focus is building a world-class web services operation which includes building the best API server framework possible. Think of it as &lt;a href="http://expressjs.com/"&gt;Express&lt;/a&gt; for APIs, with the typical requirements for speed and flexibility, but designed in a way that enables building an entire API service in days and focus primarily on business logic instead of facilities (e.g. query and payload validation, smart routing, dynamic documentation, OAuth support). And of course, we are going to build the core of this framework as open source from the very beginning.&lt;/p&gt;
&lt;p&gt;In addition, we are looking to build and contribute to projects aimed at making mobile services better, including smart caching (we are currently evaluating &lt;a href="http://redis.io/"&gt;Redis&lt;/a&gt; and other new technologies as the foundation of such facilities), and dynamic repositioning of HTML rendering services between the back-end and front-end. Also, in alignment with our ‘Labs’ name, we experiment with new technologies and architectures aimed at improving mobile performance end-to-end.&lt;/p&gt;
&lt;p&gt;The current services team is about four people and we are looking to add a few more over the next few weeks. The new roles will be 100% node, working on the new framework and services. Unlike most other “node jobs”, this is really&lt;strong&gt; all about node&lt;/strong&gt;, not a trick to get smart people excited about yet another JavaScript gig.&lt;/p&gt;
&lt;p&gt;If you noticed, I haven’t wasted your time with stories about how, despite the size of the company, it still “feels just like a startup”. After all, this is &lt;strong&gt;what every large company tries to sell these days&lt;/strong&gt;. Instead, I invite you to come and check us out, talk to the team and form your own opinion on how lean and mean we really are. Most of our team joined us from recent startup experiences and they care a lot about that culture and energy. Our team is fairly distributed with the main office located in a &lt;a href="http://maps.google.com/maps?saddr=bart&amp;amp;daddr=850+Cherry+Ave,+San+Bruno,+CA+94066&amp;amp;hl=en&amp;amp;sll=37.627,-122.424186&amp;amp;sspn=0.020054,0.020492&amp;amp;geocode=FfJLPgIdwhS0-CEecZwAeijPQimph9X9xnmPgDHt_X6f6oM8-g%3BFXgkPgIdhvSz-Cn_gzv453mPgDEBSzhrS7d8Cw&amp;amp;vpsrc=0&amp;amp;t=w&amp;amp;gl=us&amp;amp;mra=ls&amp;amp;z=16"&gt;new building in San Bruno, CA&lt;/a&gt;. The iOS team is based in Portland, OR, and we have quite a few team members working remotely.&lt;/p&gt;
&lt;p&gt;We are looking for &lt;strong&gt;brilliant engineers passionate about new technologies in general and node.js in particular&lt;/strong&gt;. We are not going to bore you with a useless list of experience and requirements. If &lt;span style="text-decoration: underline;"&gt;&lt;strong&gt;you&lt;/strong&gt;&lt;/span&gt; think you have what it takes to get the job done, we want to talk. We promise not to bring you in for an endless parade of grilling interviews or ask you to write code on a whiteboard. We much rather check out your Github account and have a lively debate about technologies, software design, and your obligatory bizarre geek hobbies (&lt;a href="http://www.hammer-lahav.net/No-Place-Like-Home/Mountain-Farm"&gt;we’ve got our own to share&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;I will be writing about our progress and the new framework over the next few months. This promises to be an exciting ride. If you want to learn more, &lt;a href="mailto:eran@hueniverse.com"&gt;drop me a line&lt;/a&gt;.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Hueniverse/~4/kAnvdHQDR2U" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://hueniverse.com/2012/01/you-me-and-node-walmartlabs/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://hueniverse.com/2012/01/you-me-and-node-walmartlabs/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://hueniverse.com/2012/01/you-me-and-node-walmartlabs/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Eran Hammer-Lahav</name>
						<uri>http://hueniverse.com</uri>
					</author>
		<title type="html"><![CDATA[Sled, Yahoo!, and Moving On]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Hueniverse/~3/-flJNXXNEgA/" />
		<id>http://hueniverse.com/?p=1526</id>
		<updated>2012-01-04T23:36:13Z</updated>
		<published>2011-12-15T01:49:51Z</published>
		<category scheme="http://hueniverse.com" term="Node.js" /><category scheme="http://hueniverse.com" term="Sled" />		<summary type="html"><![CDATA[As is often the case when working on a startup, virtual or not, things don’t work out according to plan. I had the privilege to spend the past year working on Sled, from product inception to execution. At the same time we were launching Sled, I experienced some significant management changes at Yahoo! which eventually [...]]]></summary>
		<content type="html" xml:base="http://hueniverse.com/2011/12/sled-yahoo-and-moving-on/">&lt;p&gt;As is often the case when working on a startup, virtual or not, things don’t work out according to plan. I had the privilege to spend the past year working on &lt;a href="http://hueniverse.com/2011/07/introducing-sled/"&gt;Sled&lt;/a&gt;, from product inception to execution. At the same time we were launching Sled, I experienced some significant management changes at Yahoo! which eventually led to shutting it down.&lt;span id="more-1526"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;To be clear, the decision to discontinue Sled was mine alone, but it wasn’t made in a vacuum. The change in management brought with it a change in attitude towards the project in both form and substance. My options were to stay and fight for it, or shut it down and move on. It was pretty upsetting, as these events usually are, especially given how active the list-making / light collaboration space is and the huge potential there. After fighting the organization for three years, I decided to move on and left the company shortly after.&lt;/p&gt;
&lt;p&gt;This was the official announcement posted at the time on the now defunct Sled blog:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Over the past few months, I had the pleasure of being part of an exciting experiment at Yahoo! called Sled.&lt;/p&gt;
&lt;p&gt;Sled was a collaborative list making tool with a strong focus on life events and collaboration between friends and family. Planning a party, a house move, getting ready for a new baby, planning a trip, organizing a junior soccer league, or preparing for a marathon, are some of the areas Sled was focused on. We also found it really useful for building Sled itself, working in a small team, keeping track of issues and assignments.&lt;/p&gt;
&lt;p&gt;There is a lot we don’t know about how to make our daily lives more productive and organized, and how to collaborate better. What we do know is that the wide range of tools and services available to us are, generally speaking, not very helpful. Everything is either too limited or too complicated. Usually too complicated. We know what doesn’t work, but figuring out what does requires experimentation.&lt;/p&gt;
&lt;p&gt;Sled was developed as a virtual startup at Yahoo!, using open technologies and the freedom to experiment. As is often the case with startups and experiments, we have been constantly evaluating the product and its fit within our existing and future roadmap, and have made the decision to discontinue the project in its current form (shutting down sled.com at the end of the week).&lt;/p&gt;
&lt;p&gt;But our story doesn’t end there.&lt;/p&gt;
&lt;p&gt;We built Sled on an entirely open stack, using open source tools (Node.js, MongoDB, Express, Socket.IO, Jade) and open standards (JS, HTML5, OAuth 2.0). We have relied and benefit from a vibrant community of amazing developers and we want to give something back. One weak area for the community is the availability of fully-baked, showcase applications written in Node.js.&lt;/p&gt;
&lt;p&gt;Instead of following the typical industry path of discontinued products, we have decided in the experimental spirit of Sled to release the entire project under an open source license using a new name: &lt;a href="http://j.mp/postmile"&gt;Postmile&lt;/a&gt;. This means anyone will be able to grab the code and run the entire service, back and front, exactly as it was hosted on sled.com (including the soon to be open sourced iPhone app we never got to release).&lt;/p&gt;
&lt;p&gt;We hope you will find Postmile helpful, fun, and an insightful resource for the kind of projects you can build with Node.js today. Check it out at &lt;a href="http://j.mp/postmile"&gt;http://j.mp/postmile&lt;/a&gt;. You can use Postmile as a back-end API server for building new list-based products (to-do apps, simple project management tools, bug tracking), as a list making tool for your friends or your company, or just as a useful example to grab code from.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;The best part about working on Sled was node. I got the rare opportunity to &lt;a href="http://hueniverse.com/2011/06/6-months-with-node-js/"&gt;spend a year working full time on node&lt;/a&gt; and be part of the node community. The experience was so fantastic that I made working with node a central theme of my job search and I’m happy to report that it worked out quite nicely. But that’s for &lt;a href="http://hueniverse.com/2012/01/you-me-and-node-walmartlabs/"&gt;another post&lt;/a&gt;.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Hueniverse/~4/-flJNXXNEgA" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://hueniverse.com/2011/12/sled-yahoo-and-moving-on/#comments" thr:count="2" />
		<link rel="replies" type="application/atom+xml" href="http://hueniverse.com/2011/12/sled-yahoo-and-moving-on/feed/atom/" thr:count="2" />
		<thr:total>2</thr:total>
	<feedburner:origLink>http://hueniverse.com/2011/12/sled-yahoo-and-moving-on/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Eran Hammer-Lahav</name>
						<uri>http://hueniverse.com</uri>
					</author>
		<title type="html"><![CDATA[Is the Party Winding Down at Facebook?]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Hueniverse/~3/ux7EfQpNPV8/" />
		<id>http://hueniverse.com/?p=1520</id>
		<updated>2011-12-12T17:03:33Z</updated>
		<published>2011-12-12T17:03:33Z</published>
		<category scheme="http://hueniverse.com" term="Opinions" />		<summary type="html"><![CDATA[A picture started to emerge from casual conversations I’ve had over the past few weeks with friends working at Facebook. I have noticed how Facebook engineers are using a different, more restrained vocabulary to describe their jobs. What once was ‘amazing’ is now ‘challenging’, ‘exciting technology’ turned to ‘learning a lot’, and ‘having fun’ toned [...]]]></summary>
		<content type="html" xml:base="http://hueniverse.com/2011/12/is-the-party-winding-down-at-facebook/">&lt;p&gt;A picture started to emerge from casual conversations I’ve had over the past few weeks with friends working at Facebook. I have noticed how Facebook engineers are using a different, more restrained vocabulary to describe their jobs. What once was ‘amazing’ is now ‘challenging’, ‘exciting technology’ turned to ‘learning a lot’, and ‘having fun’ toned down to ‘still engaged’. They are all very ‘content’.&lt;span id="more-1520"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;This might be purely anecdotal but I have a feeling it is not. I’ve shared this insight with a few other friends outside of Facebook and they too started noticing the pattern within their own circle of Facebook connections. Unlike a year ago, these days I can’t point to a single person I know working at Facebook who is oozing excitement and energy. They are still very much engaged and are busy as ever, but they are less interested in talking about work.&lt;/p&gt;
&lt;p&gt;While this kind of corporate evolution is expected, it is a bit early for Facebook to make the transition from a hyper startup to a business-as-usual large company culture. If this continues, the looming IPO is going to include a noticeable loss of talent with what feels like a new holding pattern within the company of people waiting to fully vest or cash out.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Hueniverse/~4/ux7EfQpNPV8" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://hueniverse.com/2011/12/is-the-party-winding-down-at-facebook/#comments" thr:count="3" />
		<link rel="replies" type="application/atom+xml" href="http://hueniverse.com/2011/12/is-the-party-winding-down-at-facebook/feed/atom/" thr:count="3" />
		<thr:total>3</thr:total>
	<feedburner:origLink>http://hueniverse.com/2011/12/is-the-party-winding-down-at-facebook/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Eran Hammer-Lahav</name>
						<uri>http://hueniverse.com</uri>
					</author>
		<title type="html"><![CDATA[Netflix Forcing the Issue Too Soon]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Hueniverse/~3/-e9hSeuNKm0/" />
		<id>http://hueniverse.com/?p=1512</id>
		<updated>2011-12-13T04:22:30Z</updated>
		<published>2011-09-20T06:49:08Z</published>
		<category scheme="http://hueniverse.com" term="Opinions" />		<summary type="html"><![CDATA[(A note to my long-time readers, I’m planning on expanding this blog to include opinions about current technology trends and news beyond my usual fare of standards, open web, and engineering posts.) This morning I logged into my Netflix account and changed my plan from 3 DVDs + Streaming to DVDs Only. Despite the excellent [...]]]></summary>
		<content type="html" xml:base="http://hueniverse.com/2011/09/netflix-forcing-the-issue-too-soon/">&lt;p&gt;&lt;em&gt;(A note to my long-time readers, I’m planning on expanding this blog to include opinions about current technology trends and news beyond my usual fare of standards, open web, and engineering posts.)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This morning I logged into my Netflix account and changed my plan from 3 DVDs + Streaming to DVDs Only. Despite the &lt;a href="http://www.splatf.com/2011/09/netflix-qwikster-facts/"&gt;excellent analysis&lt;/a&gt; by many about Netflix’s reasons for the recent changes, the fact is that today the company is making &lt;strong&gt;$95.88&lt;/strong&gt; less annually from me than they did the day before. That’s a lot of money to lose from a single, loyal customer.&lt;span id="more-1512"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I love the unlimited streaming service, but given its current selection of movies, I use it mostly to catch up with TV shows I missed or skipped. We do this mostly during the summer TV hiatus. In other words, the current streaming catalog is great when there is nothing else to watch and you are willing to compromise with lesser, somewhat stale, content.&lt;/p&gt;
&lt;p&gt;I’m probably going to get a streaming service back in June when the 2012 season is over. But at that point I will no longer default to Netflix because I have no incentive to do so. It doesn’t save me money or add any nice features to my core DVD-by-mail service (today, I can see what in my queue is available on-demand and consume it that way). I will definitely consider Netflix as an option, but if my cable provider, Apple TV, or XBOX, offer me an easier alternative with the right content, I’m probably going to take the lazy way out.&lt;/p&gt;
&lt;p&gt;Strategically, this was the right move. Tactically, it’s a big risk to take given the blow it can serve to their momentum. Everything communicated by the company makes perfect sense to me. The problem is that by pushing the issue now, they have forced me to think about their separate services when their weaker offering is the one they are betting their future on.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Hueniverse/~4/-e9hSeuNKm0" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://hueniverse.com/2011/09/netflix-forcing-the-issue-too-soon/#comments" thr:count="3" />
		<link rel="replies" type="application/atom+xml" href="http://hueniverse.com/2011/09/netflix-forcing-the-issue-too-soon/feed/atom/" thr:count="3" />
		<thr:total>3</thr:total>
	<feedburner:origLink>http://hueniverse.com/2011/09/netflix-forcing-the-issue-too-soon/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Eran Hammer-Lahav</name>
						<uri>http://hueniverse.com</uri>
					</author>
		<title type="html"><![CDATA[The Unauthorized Node Knockout #2 Awards]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Hueniverse/~3/ij4l5tsT1xM/" />
		<id>http://hueniverse.com/?p=1503</id>
		<updated>2011-09-04T07:32:09Z</updated>
		<published>2011-09-04T07:32:09Z</published>
		<category scheme="http://hueniverse.com" term="Node.js" />		<summary type="html"><![CDATA[I’ve spend the past week participating as a judge in the 2nd Node Knockout competition – a 48 hours worldwide hackathon using node.js. The event included 720 contestants organized in 294 teams and resulted in 178 entries submitted for review. Overall, a fantastic event and a testament to the awesomeness that is the node community. [...]]]></summary>
		<content type="html" xml:base="http://hueniverse.com/2011/09/the-unauthorized-node-knockout-2-awards/">&lt;p&gt;&lt;a href="http://hueniverse.com/wp-content/uploads/2011/09/nko-logo.png"&gt;&lt;img class="size-full wp-image-1505 alignleft" style="margin-left: 20px; margin-right: 20px;" title="nko-logo" src="http://hueniverse.com/wp-content/uploads/2011/09/nko-logo.png" alt="" width="200" height="54" /&gt;&lt;/a&gt;I’ve spend the past week participating as a judge in the 2nd &lt;a href="http://nodeknockout.com/"&gt;Node Knockout&lt;/a&gt; competition – a 48 hours worldwide hackathon using &lt;a href="nodejs.org"&gt;node.js&lt;/a&gt;. The event included 720 contestants organized in 294 teams and resulted in 178 entries submitted for review. Overall, a fantastic event and a testament to the awesomeness that is the node community.&lt;/p&gt;
&lt;p&gt;The competition includes prizes for the best hack in the following categories: &lt;a href="http://nodeknockout.com/?sort=utility"&gt;fun or utility&lt;/a&gt;, &lt;a href="http://nodeknockout.com/?sort=design"&gt;design&lt;/a&gt;, &lt;a href="http://nodeknockout.com/?sort=innovation"&gt;innovation&lt;/a&gt;, &lt;a href="http://nodeknockout.com/?sort=completeness"&gt;completeness&lt;/a&gt;, &lt;a href="http://nodeknockout.com/?sort=popularity"&gt;popularity&lt;/a&gt;, and &lt;a href="http://nodeknockout.com/?sort=overall"&gt;overall&lt;/a&gt;, as well as overall for a &lt;a href="http://nodeknockout.com/?sort=solo"&gt;solo&lt;/a&gt; participant. While judging is still on-going, and while many of the top entries do deserve to be there, I found the categories to be a bit uninspiring.&lt;/p&gt;
&lt;p&gt;Also, as the only crazy person to judge every single entry (including some that dropped out in the process), I wanted to highlight some entries that might not get the attention they deserve. The following are the nominees and winners in my unauthorized awards.&lt;/p&gt;
&lt;p&gt;&lt;span id="more-1503"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;Most Geek-elicious&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://nodeknockout.com/teams/replicants"&gt;heatwave&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nodeknockout.com/teams/nobits"&gt;Botriot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nodeknockout.com/teams/infopoprac"&gt;gitBroker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nodeknockout.com/teams/noooooooooooode"&gt;Wandercirus&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nodeknockout.com/teams/nickaugust"&gt;rebelshell&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://wrench-labs.nko2.nodeknockout.com/"&gt;Node Defense&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nodeknockout.com/teams/duo"&gt;HackerWars9K&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And the winner is: &lt;a href="http://wrench-labs.nko2.nodeknockout.com/"&gt;Node Defense&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="Apple-style-span" style="font-size: 20px; font-weight: bold;"&gt;Biggest Time Suck&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://nodeknockout.com/teams/replicants"&gt;heatwave&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nodeknockout.com/teams/forward"&gt;Metris&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nodeknockout.com/teams/team-gauchos"&gt;BOSSMAN&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nodeknockout.com/teams/opower"&gt;Doodle or Die&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nodeknockout.com/teams/them"&gt;MultiSweeper&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nodeknockout.com/teams/pusher"&gt;Tanked&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And the winner is: &lt;a href="http://nodeknockout.com/teams/forward"&gt;Metris&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="Apple-style-span" style="font-size: 20px; font-weight: bold;"&gt;Most Practical&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://nodeknockout.com/teams/speedo"&gt;Observer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nodeknockout.com/teams/the-restless"&gt;nide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nodeknockout.com/teams/code-party"&gt;SlideJoin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nodeknockout.com/teams/minimason"&gt;Blue GPU Lava&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nodeknockout.com/teams/jsphiles"&gt;RESTalytics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nodeknockout.com/teams/team-honey-badger"&gt;Coding Stage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nodeknockout.com/teams/return-of-the-starcr"&gt;LocalNode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nodeknockout.com/teams/slowpoison"&gt;snotty&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And the winner is: &lt;a href="http://nodeknockout.com/teams/the-restless"&gt;nide&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="Apple-style-span" style="font-size: 20px; font-weight: bold;"&gt;Best Art Direction&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://nodeknockout.com/teams/watermelon-sauce"&gt;Apestronauts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nodeknockout.com/teams/go-horse-brazil"&gt;Driv.in&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nodeknockout.com/teams/rochester-js"&gt;ACROnode.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nodeknockout.com/teams/platform45-is-your-m"&gt;Wherewolf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nodeknockout.com/teams/the-indecisives"&gt;Gemini Command&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nodeknockout.com/teams/public-class"&gt;Pong&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nodeknockout.com/teams/fists-of-moose-knuck"&gt;Hubub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nodeknockout.com/teams/cubespace"&gt;Twends&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nodeknockout.com/teams/sf2-boys"&gt;Twalks&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And the winner is: &lt;a href="http://nodeknockout.com/teams/the-indecisives"&gt;Gemini Command&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="Apple-style-span" style="font-size: 20px; font-weight: bold;"&gt;Most Original Classic&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://nodeknockout.com/teams/public-class"&gt;Pong&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nodeknockout.com/teams/them"&gt;MultiSweeper&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nodeknockout.com/teams/forward"&gt;Metris&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nodeknockout.com/teams/rocket26"&gt;Moody Chef&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nodeknockout.com/teams/duo"&gt;HackerWars9K&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And the winner is: &lt;a href="http://nodeknockout.com/teams/public-class"&gt;Pong&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="Apple-style-span" style="font-size: 20px; font-weight: bold;"&gt;Most Bizzare&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://nodeknockout.com/teams/noooooooooooode"&gt;Wandercirus&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nodeknockout.com/teams/yes-baby-yes-baby-g"&gt;Rapminder&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nodeknockout.com/teams/upallnight"&gt;Ragechat&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nodeknockout.com/teams/son-of-inflatable-ch"&gt;Meaty.me&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nodeknockout.com/teams/code-is-too-damn-hig"&gt;Boys over Flowers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And the winner is: &lt;a href="http://nodeknockout.com/teams/code-is-too-damn-hig"&gt;Boys over Flowers&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="Apple-style-span" style="font-size: 20px; font-weight: bold;"&gt;Biggest WOW Moment&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://nodeknockout.com/teams/replicants"&gt;heatwave&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nodeknockout.com/teams/fat-guys-with-guns"&gt;PadPaddle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nodeknockout.com/teams/the-restless"&gt;nide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nodeknockout.com/teams/return-of-the-starcr"&gt;LocalNode&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And the winner is: &lt;a href="http://nodeknockout.com/teams/return-of-the-starcr"&gt;LocalNode&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Congratulations to everyone who participated. I highly recommend you to check out every single entry listed on this page. This is the best of the best &amp;#8211; and I&amp;#8217;ve seen them all! Also, a big shout out to &lt;a href="https://twitter.com/gerad"&gt;Gerad Suyderhoud&lt;/a&gt; and &lt;a href="https://twitter.com/visnup"&gt;Visnu Pitiyanuvath&lt;/a&gt; for the amazing job they have done organizing the event.&lt;/p&gt;
&lt;p&gt;Can&amp;#8217;t wait for next year!&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Hueniverse/~4/ij4l5tsT1xM" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://hueniverse.com/2011/09/the-unauthorized-node-knockout-2-awards/#comments" thr:count="2" />
		<link rel="replies" type="application/atom+xml" href="http://hueniverse.com/2011/09/the-unauthorized-node-knockout-2-awards/feed/atom/" thr:count="2" />
		<thr:total>2</thr:total>
	<feedburner:origLink>http://hueniverse.com/2011/09/the-unauthorized-node-knockout-2-awards/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Eran Hammer-Lahav</name>
						<uri>http://hueniverse.com</uri>
					</author>
		<title type="html"><![CDATA[Twitter Accounts]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Hueniverse/~3/mGQD2Q2VAEs/" />
		<id>http://hueniverse.com/?p=1500</id>
		<updated>2011-08-02T02:22:22Z</updated>
		<published>2011-08-02T02:22:22Z</published>
		<category scheme="http://hueniverse.com" term="Personal" />		<summary type="html"><![CDATA[Just a quick update. I&#8217;ve split my twitter account into two. Follow @hueniverse for blog updates and other information about the technical topics I discuss on this blog. Follow @eranhammer for my personal brain farts.]]></summary>
		<content type="html" xml:base="http://hueniverse.com/2011/08/twitter-accounts/">&lt;p&gt;Just a quick update. I&amp;#8217;ve split my twitter account into two. Follow &lt;a href="http://twitter.com/hueniverse"&gt;@hueniverse&lt;/a&gt; for blog updates and other information about the technical topics I discuss on this blog. Follow &lt;a href="http://twitter.com/eranhammer"&gt;@eranhammer&lt;/a&gt; for my personal brain farts.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Hueniverse/~4/mGQD2Q2VAEs" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://hueniverse.com/2011/08/twitter-accounts/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://hueniverse.com/2011/08/twitter-accounts/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://hueniverse.com/2011/08/twitter-accounts/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Eran Hammer-Lahav</name>
						<uri>http://hueniverse.com</uri>
					</author>
		<title type="html"><![CDATA[A Farmer Walks into Facebook]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Hueniverse/~3/mj8CrhMfk8o/" />
		<id>http://hueniverse.com/?p=1495</id>
		<updated>2011-07-19T06:57:15Z</updated>
		<published>2011-07-19T06:57:15Z</published>
		<category scheme="http://hueniverse.com" term="Social Web" />		<summary type="html"><![CDATA[A few weeks ago I went to visit some friends at Facebook&#8217;s headquarter. We had an interesting chat about OAuth and other geek topics. As is common these days, the conversation drifted to my recent adventures in farming. I was describing my setup, the chickens, ducks, geese, and pigs I&#8217;ve got running around, and then [...]]]></summary>
		<content type="html" xml:base="http://hueniverse.com/2011/07/a-farmer-walks-into-facebook/">&lt;p&gt;A few weeks ago I went to visit some friends at Facebook&amp;#8217;s headquarter. We had an interesting chat about OAuth and other geek topics. As is common these days, the conversation drifted to my recent adventures in farming. I was describing my setup, the chickens, ducks, geese, and pigs I&amp;#8217;ve got running around, and then mentioned my three emus all named &lt;a href="http://www.google.com/search?q=up+kevin"&gt;Kevin&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Someone who was listening in from a nearby cube stood up and asked, &amp;#8220;When did they add emus?&amp;#8221;&lt;/p&gt;
&lt;p&gt;Get it? At Facebook &lt;a href="http://www.farmville.com/"&gt;everyone&amp;#8217;s a farmer&lt;/a&gt;.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Hueniverse/~4/mj8CrhMfk8o" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://hueniverse.com/2011/07/a-farmer-walks-into-facebook/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://hueniverse.com/2011/07/a-farmer-walks-into-facebook/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://hueniverse.com/2011/07/a-farmer-walks-into-facebook/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Eran Hammer-Lahav</name>
						<uri>http://hueniverse.com</uri>
					</author>
		<title type="html"><![CDATA[OAuth 1.0 Blog Cleanup]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Hueniverse/~3/FwNufIQb8Vo/" />
		<id>http://hueniverse.com/?p=1491</id>
		<updated>2011-07-16T06:33:04Z</updated>
		<published>2011-07-15T18:11:01Z</published>
		<category scheme="http://hueniverse.com" term="OAuth" />		<summary type="html"><![CDATA[As I&#8217;m getting ready to finish work on OAuth 2.0 and add new content to this site, I decided it was time to finish the OAuth 1.0 chapter of this site. I&#8217;ve finally cleaned up the OAuth 1.0 guide and other pages. The guide is now updated to reflect RFC 5849 as well as some bug [...]]]></summary>
		<content type="html" xml:base="http://hueniverse.com/2011/07/oauth-1-0-section-cleanup/">&lt;p&gt;As I&amp;#8217;m getting ready to finish work on OAuth 2.0 and add new content to this site, I decided it was time to finish the OAuth 1.0 chapter of this site. I&amp;#8217;ve finally cleaned up the &lt;a href="http://hueniverse.com/oauth/guide/"&gt;OAuth 1.0 guide&lt;/a&gt; and other pages. The guide is now updated to reflect &lt;a href="http://tools.ietf.org/html/rfc5849"&gt;RFC 5849&lt;/a&gt; as well as some bug fixes in the scripts used to generate the signature base string tutorial. If you are linking to this site for OAuth resources, please link to the &lt;a href="http://hueniverse.com/oauth/"&gt;OAuth page&lt;/a&gt;.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Hueniverse/~4/FwNufIQb8Vo" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://hueniverse.com/2011/07/oauth-1-0-section-cleanup/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://hueniverse.com/2011/07/oauth-1-0-section-cleanup/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://hueniverse.com/2011/07/oauth-1-0-section-cleanup/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Eran Hammer-Lahav</name>
						<uri>http://hueniverse.com</uri>
					</author>
		<title type="html"><![CDATA[Introducing Sled]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Hueniverse/~3/SOLFkz6I56w/" />
		<id>http://hueniverse.com/?p=1457</id>
		<updated>2011-07-14T22:17:55Z</updated>
		<published>2011-07-14T22:17:55Z</published>
		<category scheme="http://hueniverse.com" term="Sled" /><category scheme="http://hueniverse.com" term="Startup" />		<summary type="html"><![CDATA[I&#8217;ve been obsessed with project management and personal productivity for a almost two decades. My experience ranges from tiny lists to gigantic project plans with hundreds of people and resources. In the past I&#8217;ve been a certified PMP and managed large engineering teams. What I&#8217;ve learned above all, is that we tend to overcomplicate everything. Four [...]]]></summary>
		<content type="html" xml:base="http://hueniverse.com/2011/07/introducing-sled/">&lt;p&gt;&lt;img class="alignleft" style="margin-left: 10px; margin-right: 10px;" title="Sled Logo" src="https://sled.com/images/logo.png" alt="" width="154" height="94" /&gt;I&amp;#8217;ve been obsessed with project management and personal productivity for a almost two decades. My experience ranges from tiny lists to gigantic project plans with hundreds of people and resources. In the past I&amp;#8217;ve been a certified PMP and managed large engineering teams. What I&amp;#8217;ve learned above all, is that we tend to overcomplicate everything.&lt;/p&gt;
&lt;p&gt;Four years ago my startup &lt;a href="http://hueniverse.com/2008/01/nouncer-building-blocks-for-real-time-content-delivery/"&gt;Nouncer&lt;/a&gt; failed for &lt;a href="http://hueniverse.com/2008/04/the-last-announcerment/"&gt;many reasons&lt;/a&gt;, none of which had much to do with the product itself. Looking at where Twitter is now and how it evolved, it is a clear validation of my &lt;a href="http://hueniverse.com/2007/07/extreme-blogging/"&gt;original vision&lt;/a&gt;. But even if I had gotten passed the challenges that doomed Nouncer, I still think it would have failed. It was just &lt;a href="http://hueniverse.com/2007/11/nouncer-platform-capabilities-preview/"&gt;too complicated&lt;/a&gt;, too soon.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve long considered Twitter&amp;#8217;s biggest asset to be its 140 character limit. It completely democratized personal expression by making everyone as expressive and articulate. It also helped people communicate more by making their content small enough for casual, constant consumption.&lt;/p&gt;
&lt;p&gt;A year ago I started thinking about applying this philosophy &amp;#8211; empowerment through restrictions &amp;#8211; to project management. I&amp;#8217;ve started thinking about enterprise-scale problems and what a restrictive tool might look like. But no longer working on large scale enterprise projects, my attention shifted to personal productivity and &amp;#8220;home projects&amp;#8221;, and so &lt;a href="https://sled.com"&gt;Sled&lt;/a&gt; was born.&lt;/p&gt;
&lt;p&gt;&lt;span id="more-1457"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Sled is an experiment.&lt;/p&gt;
&lt;p&gt;There is a lot we don&amp;#8217;t know about how to make our daily lives more productive and organized, and how to collaborate better. What we do know is that the wide range of tools and services available to us are, generally speaking, not very helpful. Everything is either too limited or too complicated. Usually too complicated. We know what doesn&amp;#8217;t work, but figuring out what does requires experimentation.&lt;/p&gt;
&lt;p&gt;Sled is a collaborative list making tool with a strong focus on life events and collaboration between friends and family. Planning a party, a move, getting ready for a new baby, planning a trip, organizing a junior soccer league, or preparing for a marathon, are some of the efforts I hope Sled will be useful for.&lt;/p&gt;
&lt;p&gt;The idea is to start with a really solid tool for making lists. Then add collaboration with a few people, a little bit of social features, and later a crowd-sourced knowledge base of lists and recommendations. For the past few months we&amp;#8217;ve been focusing on list making and the result is a simple tool to create lists alone or with a small group of friends. Sled is still in its very early stages, but it is usable and (we hope) fun.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m not planning on writing much about Sled on this blog. Instead, I will focus on &lt;a href="http://hueniverse.com/2011/06/6-months-with-node-js/"&gt;sharing my engineering experience&lt;/a&gt; building the product. If you want to keep up to date with Sled, follow us on &lt;a href="http://twitter.com/sled"&gt;Twitter&lt;/a&gt; or &lt;a href="http://facebook.com/sled"&gt;Facebook&lt;/a&gt;, or check out the &lt;a href="http://blog.sled.com"&gt;Sled blog&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;And if you want to check it out, sign-in with your Yahoo!, Twitter, or Facebook account and use invite code: &lt;strong&gt;hueniverse&lt;/strong&gt;.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Hueniverse/~4/SOLFkz6I56w" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://hueniverse.com/2011/07/introducing-sled/#comments" thr:count="4" />
		<link rel="replies" type="application/atom+xml" href="http://hueniverse.com/2011/07/introducing-sled/feed/atom/" thr:count="4" />
		<thr:total>4</thr:total>
	<feedburner:origLink>http://hueniverse.com/2011/07/introducing-sled/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Eran Hammer-Lahav</name>
						<uri>http://hueniverse.com</uri>
					</author>
		<title type="html"><![CDATA[Node.js: Express, Socket.io, and everything LearnBoost]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Hueniverse/~3/0_oirSzDLhs/" />
		<id>http://hueniverse.com/?p=1426</id>
		<updated>2011-07-14T22:20:56Z</updated>
		<published>2011-07-14T01:31:14Z</published>
		<category scheme="http://hueniverse.com" term="Node.js" /><category scheme="http://hueniverse.com" term="Sled" />		<summary type="html"><![CDATA[This post is part of a series of articles about my recent experience building Sled using Node.js. Express It There wasn&#8217;t much of selection 6 months ago when I started coding Sled when it came to Node frameworks. Node itself provides very little. You create an HTTP server and get a callback when a new HTTP request comes [...]]]></summary>
		<content type="html" xml:base="http://hueniverse.com/2011/07/node-js-express-socket-io-and-everything-learnboost/">&lt;p&gt;This post is part of a &lt;a href="http://hueniverse.com/2011/06/6-months-with-node-js/"&gt;series of articles&lt;/a&gt; about my recent experience building &lt;a href="http://sled.com"&gt;Sled&lt;/a&gt; using &lt;a href="http://nodejs.org"&gt;Node.js&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Express It&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://hueniverse.com/wp-content/uploads/2011/07/logo-learnboost.png"&gt;&lt;img class="alignright size-full wp-image-1463" style="margin-left: 20px; margin-right: 20px;" title="LearnBoost Logo" src="http://hueniverse.com/wp-content/uploads/2011/07/logo-learnboost.png" alt="" width="150" height="150" /&gt;&lt;/a&gt;There wasn&amp;#8217;t much of selection 6 months ago when I started coding &lt;a href="https://sled.com"&gt;Sled&lt;/a&gt; when it came to Node frameworks. Node itself provides very little. You create an HTTP server and get a callback when a new HTTP request comes in. Modern web applications require session management, request routing, and view rendering at the very least. These functions are provided by frameworks.&lt;/p&gt;
&lt;p&gt;At the time, the only two popular frameworks were &lt;a href="http://senchalabs.github.com/connect/"&gt;Connect&lt;/a&gt; and &lt;a href="http://expressjs.com/"&gt;Express&lt;/a&gt;. Connect provides a basic middleware framework with some built-in facilities such as a static file server, route management, cookie parser, form-encoded and JSON-encoded body parser, and logging. Express, built on top of Connect, adds a much more robust routing facilities, view rendering and other goodies. I&amp;#8217;m not doing these frameworks justice with this descriptions.&lt;/p&gt;
&lt;p&gt;I use Express extensively and it is fantastic.&lt;/p&gt;
&lt;p&gt;Express&amp;#8217; biggest asset is its maintainer, &lt;a href="http://tjholowaychuk.com/"&gt;TJ Holowaychuk&lt;/a&gt;. I have seen first-hand how Express grew and matured into a stable and powerful framework. Express made it easy for me to write the application server used for login, registration, account management, and other static assert (developer pages, about) with very little extra effort. If you are going to develop a traditional web application in Node, you should probably start with Express.&lt;/p&gt;
&lt;p&gt;I plan to open source some of the additional functionality I&amp;#8217;ve added on top of Express to validate request bodies and query parameters, a flexible authentication configuration facility for routes, and a light layer to make it easier to building API servers. Given my focus on OAuth, I&amp;#8217;m going to share my OAuth + Express experience in a followup post.&lt;/p&gt;
&lt;p&gt;Express really shines when you combine it with &lt;a href="http://jade-lang.com/"&gt;Jade&lt;/a&gt;, another brilliant brainchild of Mr. Holowaychuk &amp;#8211; a simple templating language for HTML which is easy to learn, easy to read, and unlike all the rest, doesn&amp;#8217;t suck. We had to restrain ourselves from converting some static HTML files into Jade because once we started using it, we didn&amp;#8217;t want to read actual HTML ever again.&lt;/p&gt;
&lt;h3&gt;Socket.io is Magic&lt;/h3&gt;
&lt;p&gt;Really!&lt;/p&gt;
&lt;p&gt;I am willing to bet that a large percent of those taking a look at Node for the first time are doing it because of a &lt;a href="http://socket.io/"&gt;Socket.io&lt;/a&gt; -powered demo they have seen. Socket.io provides a trivial-to-use server and client library for making real-time, streaming updates between a web server and browser client. It makes building cool real-time games a matter of hours, and it works on every crappy browser known using the best available option from Flash to WebSockets.&lt;/p&gt;
&lt;p&gt;We use Socket.io to power Sled&amp;#8217;s real-time features which include live updates to your shared list as changes are made. To put this in perspective, it took us one day to add real-time streaming updates to the API server, and another day or two to add it to the client. So in three days we got full, real-time updates going between multiple browsers. What used to be months of work when Google Docs was first introduced, is now trivial with Socket.io.&lt;/p&gt;
&lt;p&gt;So yeah, it&amp;#8217;s magic.&lt;/p&gt;
&lt;p&gt;Socket.io comes from &lt;a href="http://devthought.com/"&gt;Guillermo Rauch&lt;/a&gt; and the team of superstars at &lt;a href="https://www.learnboost.com/"&gt;LearnBoost&lt;/a&gt;. There are days when I have to wonder if these guys get anything done for their own startup, given the &lt;a href="https://github.com/learnboost"&gt;amazing open source projects&lt;/a&gt; they push out on a weekly basis. I&amp;#8217;m bummed that I&amp;#8217;m not the target audience for their product because looking at the technology it must be amazing. I consider them part of the Sled team, given just how much of their code we are using.&lt;/p&gt;
&lt;p&gt;In fact, I appreciate their work so much, I&amp;#8217;d like to get a &lt;a href="http://learnboost.chipin.com/learnboost-appreciation"&gt;small fundraiser going&lt;/a&gt; to send these guys to dinner or whatever else they feel like doing for fun. I hope you join me in showing our appreciation. Without their continued work and dedication, Node would be an amazing platform that is just too raw to use.&lt;/p&gt;
&lt;p&gt;&lt;center&gt;&lt;object width="250" height="250" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"&gt;&lt;param name="src" value="http://widget.chipin.com/widget/id/8abb742e0a9bd90a" /&gt;&lt;param name="flashvars" value="event_title=LearnBoost%20Appreciation&amp;amp;event_desc=Join%20me%20in%20showing%20your%20appreciation%20for%20the%20team%20behind%20socket.io%2C%20express%2C%20kue%2C%20mongoose%2C%20stylus%2C%20and%20everything%20else.%20These%20guys%20make%20node.js%20fantastic%21&amp;amp;color_scheme=blue" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="wmode" value="transparent" /&gt;&lt;embed width="250" height="250" type="application/x-shockwave-flash" src="http://widget.chipin.com/widget/id/8abb742e0a9bd90a" flashvars="event_title=LearnBoost%20Appreciation&amp;amp;event_desc=Join%20me%20in%20showing%20your%20appreciation%20for%20the%20team%20behind%20socket.io%2C%20express%2C%20kue%2C%20mongoose%2C%20stylus%2C%20and%20everything%20else.%20These%20guys%20make%20node.js%20fantastic%21&amp;amp;color_scheme=blue" allowscriptaccess="always" wmode="transparent" /&gt;&lt;/object&gt;&lt;/center&gt;Thanks to Blaine Cook for the idea.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Hueniverse/~4/0_oirSzDLhs" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://hueniverse.com/2011/07/node-js-express-socket-io-and-everything-learnboost/#comments" thr:count="7" />
		<link rel="replies" type="application/atom+xml" href="http://hueniverse.com/2011/07/node-js-express-socket-io-and-everything-learnboost/feed/atom/" thr:count="7" />
		<thr:total>7</thr:total>
	<feedburner:origLink>http://hueniverse.com/2011/07/node-js-express-socket-io-and-everything-learnboost/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Eran Hammer-Lahav</name>
						<uri>http://hueniverse.com</uri>
					</author>
		<title type="html"><![CDATA[Node.js: From Couch to Mongo]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Hueniverse/~3/Cy3DPHZlmdg/" />
		<id>http://hueniverse.com/?p=1424</id>
		<updated>2011-06-30T06:24:31Z</updated>
		<published>2011-06-30T06:24:09Z</published>
		<category scheme="http://hueniverse.com" term="Node.js" /><category scheme="http://hueniverse.com" term="Sled" />		<summary type="html"><![CDATA[This post is part of a series of articles about my recent experience building Sled using Node.js. I started with CouchDB and ended with MongoDB. Working with CouchDB was fantastic. It took no time to learn the REST API and jump right into building the application. I had the first version of the base API ready in 2 days, including [...]]]></summary>
		<content type="html" xml:base="http://hueniverse.com/2011/06/node-js-from-couch-to-mongo/">&lt;p&gt;This post is part of a &lt;a href="http://hueniverse.com/2011/06/6-months-with-node-js/"&gt;series of articles&lt;/a&gt; about my recent experience building &lt;a href="http://sled.com"&gt;Sled&lt;/a&gt; using &lt;a href="http://nodejs.org"&gt;Node.js&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I started with &lt;a href="http://couchdb.apache.org/"&gt;CouchDB&lt;/a&gt; and ended with &lt;a href="http://www.mongodb.org/"&gt;MongoDB&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Working with CouchDB was fantastic. It took no time to learn the REST API and jump right into building the application. I had the first version of the base API ready in 2 days, including full database integration. Couch is a document store using JSON as the document format. Combined with an HTTP REST API, it makes Couch an ideal fit for Node. That&amp;#8217;s exactly why I picked it.&lt;/p&gt;
&lt;p&gt;I dismissed MySQL from the very beginning for two reasons. First, I had no idea what my schema would look like, and knew I was going to change it a lot over time, as well as allow unstructured data. Second, MySQL is a block database in nature (e.g. database deadlocks, atomic actions, etc.) and while you can use it with Node, it really wasn&amp;#8217;t designed for this kind of environment. Also, at the time, there was no quality driver for Node. Oh, and I really wanted to play with a NoSQL database.&lt;/p&gt;
&lt;p&gt;I started talking directly to the database but within a few hours switched to use &lt;a href="http://cloudhead.io/"&gt;Cloudhead&lt;/a&gt;&amp;#8216;s excellent &lt;a href="https://github.com/cloudhead/cradle"&gt;cradle&lt;/a&gt; module. The module provides a light layer for managing the HTTP client calls, error handling, simple caching, and common macros for performing multiple database requests in a single function call. It is a very light abstraction layer (and it doesn&amp;#8217;t abstract too much either). This worked very well for a few months. I didn&amp;#8217;t use cradle&amp;#8217;s built-in cache because of the expected size of my database and my constant tweaking of data manually.&lt;/p&gt;
&lt;p&gt;&lt;span id="more-1424"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Once we started stress testing the server, we hit one of the most common problems with Node&amp;#8217;s asynchronous model: the inability to control the execution order of events. We have a simple document which includes a name, place, time, and date. The properties can be modified by multiple people, and if two people change the same property, the last update wins. But when two people change different properties (one the title and the other the place), there should not be any conflict.&lt;/p&gt;
&lt;p&gt;To update a document in Couch, you must have its current version. Typically this means going to the database, grabbing the latest version, changing it, and saving it back. The problem is, this simple process breaks into two callbacks, one for fetching the latest document, and another for saving the modified version. When two requests come in at the same time, Node will queue two database fetch requests (for the same document) and then will process each in order. Both requests will return the same document, but after the first changes the document, the second update fails.&lt;/p&gt;
&lt;p&gt;I came up with a few ways to address this race condition (I&amp;#8217;m sure there are more):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Retry as many times as it is likely to get multiple updates to the same document at the same time. So if we expect 5 people to update the same list at the same time, we should retry at least 5 times.&lt;/li&gt;
&lt;li&gt;Use a local cache to store the latest version of recently modified documents and a queue of pending updates. When the first request comes in, the change is added to the queue and the latest document is requested from the database. When the latest document is obtained, the update is applied to both the cached copy and the database. When the second request comes in, the cache can be in one of two states: have the latest document in memory, or pending. If the document is available, it is updated and saved. If not, the second update gets added to the queue. When the document is received, both updates are applied at the same time.&lt;/li&gt;
&lt;li&gt;Perform lazy database updates, batching together multiple updates into a single commit. This is performed as soon as there are updates, but it applies all the accumulated updates after it gets the latest copy.&lt;/li&gt;
&lt;li&gt;Use another database with native support for partial updates.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;#1 works but is butt-ugly. It hard-codes load expectations and makes it harder to identify actual database errors. #2 could work, but I just didn&amp;#8217;t feel comfortable with this level of complexity for something as fundamental as database updates. #3 means requests coming in between updates will include data that can be multiple-generations old. So I went with #4 and switched to Mongo.&lt;/p&gt;
&lt;p&gt;The good news is that converting the application from Couch to Mongo took two days. I used the powerful &lt;a href="https://github.com/christkv/node-mongodb-native"&gt;native Mongo driver&lt;/a&gt; from &lt;a href="http://christiankvalheim.com/"&gt;Christian Amor Kvalheim&lt;/a&gt;. Overall the transition wasn&amp;#8217;t bad, but it wasn&amp;#8217;t trivial. The main difference is how the two databases store documents. Couch stores native JSON objects while Mongo has its own internal format which is similar but not identical to JSON. The biggest difference is Mongo&amp;#8217;s support for a more complex set of numbers and native types.&lt;/p&gt;
&lt;p&gt;Coming from Couch, I got pretty spoiled at working exclusively with simple JSON documents. JSON-in-JSON-out. If you can make Couch work for you, this alone will make your life much simpler. With Mongo, you have to decide how to handle numbers, dates, identifiers, and other data types. To make the conversion faster, I wrote a small layer on top of the native driver to normalize my JSON objects into and out of the database, converting ids to strings, and all numbers to simple JavaScript numbers.&lt;/p&gt;
&lt;p&gt;I also had to add some restrictions on key names not to start with &amp;#8216;$&amp;#8217; or include periods which are forbidden in Mongo (for a reason). &lt;a href="https://sled.com/developer"&gt;We have an API&lt;/a&gt; allowing client developers to store a bit of data on the server for their own use. With Couch, we could let them dump a JSON object as-is (after some security sanity checks), but with Mongo, we had to filter out the forbidden keys and had to move to a key-value store instead.&lt;/p&gt;
&lt;p&gt;On the other hand, the database itself became much simpler, removing the need to use Couch views (which meant one less place to manage code). I&amp;#8217;m also loving the ability to manipulate arrays within a document with very specific instructions using Mongo&amp;#8217;s powerful array update support.&lt;/p&gt;
&lt;p&gt;Overall, if you need partial document updates as a basic database functionality, Mongo is a better fit, especially in Node. If you don&amp;#8217;t, Couch is simpler and much faster to learn and use. I really love Couch and I wish I could use it. Mongo is pretty awesome too.&lt;/p&gt;
&lt;p&gt;One major complaint for Mongo is the lack of decent management tools. Couch comes with the built-in Futon application which is a must-have for any new application development. If I had to use the Mongo command shell to get going in the first few days, it would have taken me twice as long to get going. The available tools for Mongo are awful. They are buggy, they crash, they corrupt data, and when they work, they require you to install Python, Ruby, or PHP on your server &amp;#8211; something I refuse to do on my clean Node box.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Hueniverse/~4/Cy3DPHZlmdg" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://hueniverse.com/2011/06/node-js-from-couch-to-mongo/#comments" thr:count="11" />
		<link rel="replies" type="application/atom+xml" href="http://hueniverse.com/2011/06/node-js-from-couch-to-mongo/feed/atom/" thr:count="11" />
		<thr:total>11</thr:total>
	<feedburner:origLink>http://hueniverse.com/2011/06/node-js-from-couch-to-mongo/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Eran Hammer-Lahav</name>
						<uri>http://hueniverse.com</uri>
					</author>
		<title type="html"><![CDATA[Node.js: The Style of Non-Blocking]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Hueniverse/~3/ccv9YPNfec0/" />
		<id>http://hueniverse.com/?p=1420</id>
		<updated>2011-06-30T06:25:41Z</updated>
		<published>2011-06-30T06:17:55Z</published>
		<category scheme="http://hueniverse.com" term="Node.js" /><category scheme="http://hueniverse.com" term="Sled" />		<summary type="html"><![CDATA[This post is part of a series of articles about my recent experience building Sled using Node.js. Node is all about non-blocking, asynchronous architecture. This means any activity taking a long time to finish, such as file access, network communication, and database operations, are requested and put aside until the results are ready and returned [...]]]></summary>
		<content type="html" xml:base="http://hueniverse.com/2011/06/the-style-of-non-blocking/">&lt;p&gt;This post is part of a &lt;a href="http://hueniverse.com/2011/06/6-months-with-node-js/"&gt;series of articles&lt;/a&gt; about my recent experience building &lt;a href="http://sled.com"&gt;Sled&lt;/a&gt; using &lt;a href="http://nodejs.org"&gt;Node.js&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;&lt;span style="font-size: 13px; font-weight: normal;"&gt;Node is all about non-blocking, asynchronous architecture. This means any activity taking a long time to finish, such as file access, network communication, and database operations, are requested and put aside until the results are ready and returned via a callback function. Instead of asking to read a file and waiting for the operating system to come back with a file handler or buffer, the a callback function is invoked when the operation is completed, freeing the server to handle additional requests.&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;What gives Node a bit of a negative reputation is how this architecture affects its style of programming and the difficulty some people are having in getting used to it. When I first started, I described this convoluted style of coding like scratching your right armpit with your left hand by twisting your left arm over the shoulder, behind the neck, and under the back of the right armpit. There are days when it still feels like that, but at least now my arms are much more flexible.&lt;/p&gt;
&lt;p&gt;&lt;span id="more-1420"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Consider the following code, used to fetch a database record and output the user name:&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate"&gt;
function getUser(id) {
    var user = db.query(id);
    return user;
}

console.log('Name: ' + getUser(432).name);
&lt;/pre&gt;
&lt;p&gt;The function blocks until the database call is completed. This means the server is doing nothing but waiting until the function completes, ignoring other pending requests. In Node, the code is broken into two functions:&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate"&gt;
function getUser(id, callback) {
    db.query(id, callback);
}

function display(user) {
    console.log(user.name);
}

getUser(432, display);
&lt;/pre&gt;
&lt;p&gt;However, using JavaScript anonymous functions, the code can be streamlined into:&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate"&gt;
function getUser(id, callback) {
    db.query(id, callback);
}

getUser(432, function (user) {
    console.log(user.name);
});
&lt;/pre&gt;
&lt;p&gt;This nesting of function definitions inside function calls makes the code appear more linear and many find it easier to read. However, it can be tricky for new developers. For example:&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate"&gt;
getUser(432, function (user) {
    console.log(user.name);
});

console.log('Done');
&lt;/pre&gt;
&lt;p&gt;is going to output &amp;#8216;Done&amp;#8217; before it outputs the name because the name output waits for the database call to return, place the results on the event queue, and wait for the current executing code (outputting &amp;#8216;Done&amp;#8217;) to finish.&lt;/p&gt;
&lt;p&gt;It takes time to get used to this style of coding, especially when your execution isn&amp;#8217;t completely linear, but forks based on changing conditions.  For example, we have an API call to add an item to a list. The call supports an optional parameter to insert the item at a specific position. Because we store each list item in its own database document, we keep the list order separately. This means, we sometimes make one database call, and sometimes many. At the conclusion, we perform additional processing and return the document id of the new list item.&lt;/p&gt;
&lt;p&gt;This produces a very simple blocking code:&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate"&gt;
function add(list, title, position) {
    // Add new item to 'items' store
    var item = db.insert('items', { list: list, title: title });
    //  Set position if requested
    if (position !== null) {
        var sort = db.get('items.sort', list);
        addToListAt(sort, item.id, position);
        db.update('items.sort', sort);
    }
    // Perform final processing
    var result = { status: 'ok', time: (new Date()).getTime() };
    return result;
}
&lt;/pre&gt;
&lt;p&gt;But not so simple non-blocking code:&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate"&gt;
function add(list, title, position, callback) {
    // Add new item to 'items' store
    db.insert('items', { list: list, title: title }, function (item) {
        //  Set position if requested
        if (position !== null) {
            db.get('items.sort', list, function (sort) {
                addToListAt(sort, item.id, position);
                db.update('items.sort', sort, function () {
                    finish(item.id);
                });
            });
        }
        else {
            finish(item.id);
        }
    });
    function finish(id) {
        // Perform final processing
        callback({ id: id, status: 'ok', time: (new Date()).getTime() });
    }
}
&lt;/pre&gt;
&lt;p&gt;By embedding the callback function as an argument to the non-blocking function, and separating each logical part of the process into smaller sub-functions, you can code as fast with Node as with any other platform, but it takes some getting used to.&lt;/p&gt;
&lt;p&gt;There are a few libraries out there that allow you to code using a blocking style, and turn that into non-blocking code automagically, but I found that to be counterproductive. There is tremendous value in &lt;strong&gt;seeing&lt;/strong&gt; exactly what is happening at run-time and staying close to the execution flow.&lt;/p&gt;
&lt;p&gt;Debugging non-blocking code is still very tricky. You can&amp;#8217;t just put a breakpoint at the top of the function and step through it. What will happen is that you will break, complete the first request, and then move into the next event in the queue which is not likely to be the next step into your function. Instead, you need to put multiple breakpoints inside each nested function, and rely heavily on logging to analyze your code.&lt;/p&gt;
&lt;p&gt;Like any other platform, Node has its own unique style and it can be off-putting to some. But it really doesn&amp;#8217;t take long to get used to and once you embrace non-blocking development, the benefits in performance are significant. It also forces you to think hard about your code and architecture, to make sure you are not doing something stupid that will fail-whale you later.&lt;/p&gt;
&lt;p&gt;Continue reading &lt;a href='http://hueniverse.com/2011/06/node-js-from-couch-to-mongo/'&gt;from Couch to Mongo&lt;/a&gt;.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Hueniverse/~4/ccv9YPNfec0" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://hueniverse.com/2011/06/the-style-of-non-blocking/#comments" thr:count="5" />
		<link rel="replies" type="application/atom+xml" href="http://hueniverse.com/2011/06/the-style-of-non-blocking/feed/atom/" thr:count="5" />
		<thr:total>5</thr:total>
	<feedburner:origLink>http://hueniverse.com/2011/06/the-style-of-non-blocking/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Eran Hammer-Lahav</name>
						<uri>http://hueniverse.com</uri>
					</author>
		<title type="html"><![CDATA[6 Months with Node.js]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Hueniverse/~3/60KH81NXH3U/" />
		<id>http://hueniverse.com/?p=1406</id>
		<updated>2011-06-30T06:15:27Z</updated>
		<published>2011-06-30T06:10:39Z</published>
		<category scheme="http://hueniverse.com" term="Node.js" /><category scheme="http://hueniverse.com" term="Sled" />		<summary type="html"><![CDATA[For the past 6 months I’ve been spending most of my time building a new service called Sled. I’ll write more about Sled in the coming weeks, but for now all you need to know is that Sled is a collaborative list making tool for small groups. Sled is built entirely in JavaScript, both on [...]]]></summary>
		<content type="html" xml:base="http://hueniverse.com/2011/06/6-months-with-node-js/">&lt;p&gt;For the past 6 months I’ve been spending most of my time building a new service called &lt;a href="http://sled.com"&gt;Sled&lt;/a&gt;. I’ll write more about Sled in the coming weeks, but for now all you need to know is that Sled is a collaborative list making tool for small groups.&lt;/p&gt;
&lt;p&gt;Sled is built entirely in JavaScript, both on the back-end and front-end. The back-end is build using &lt;a href="http://nodejs.org/"&gt;Node.js&lt;/a&gt; (aka Node), the relatively new server-side JavaScript platform. There is some published experience available about building web applications and services using Node, but the experience available is focused on using Node for real-time applications like instant messaging, chat rooms, and games. It is unusual to hear someone recommends Node for building a new web site if it is not focused on real-time.&lt;/p&gt;
&lt;p&gt;I expect this to change very fast.&lt;/p&gt;
&lt;p&gt;While Sled has a bit of real-time functionality in the form of live list updates from other participants, the core experience is still closer to a traditional web site. We have two main servers, one serving mostly static pages and scripts for rendering by the browser, and an API server. On the client, we use HTML5, CSS, and lot of JavaScript to talk to the API server and display data.&lt;/p&gt;
&lt;p&gt;The next few posts are a random collection of things I’ve learned after 6 intense months of working with Node.&lt;/p&gt;
&lt;h3&gt;&lt;span id="more-1406"&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h3&gt;To Node or not to Node&lt;/h3&gt;
&lt;p&gt;To be honest, I jumped at the opportunity to use JavaScript on the back-end. I’m a C++ guy at heart, coming from a long background of building real-time trading systems on Wall Street. I like C++, and I wish I could still be using it, but last time I tried building a web service in C++, it &lt;a href="http://hueniverse.com/2008/04/the-last-announcerment/"&gt;didn’t work out so well&lt;/a&gt;&amp;#8230; JavaScript has similar esthetics (no meaningful-white-space for me, thank-you-very-much), it is trivial to read by C++ developers, and is very easy to pick up.&lt;/p&gt;
&lt;p&gt;Late 2010, I was introduced to Node by &lt;a href="http://blog.std.in/"&gt;Peter Griess&lt;/a&gt; who has been an early participant in the Node effort. At the time, Peter was leading an effort to integrate Node into the Yahoo! Mail back-end environment. Once I figured the overall architecture for Sled, I met with Peter to discuss platform options. I knew Peter was working with Node but was reluctant to use it given its early state.&lt;/p&gt;
&lt;p&gt;After an hour of talking, it was clear that I should be giving Node a closer look. I envisioned the API server as a completely statelessness machine with a a simple document-based data store requirements, serving REST calls using as much of HTTP as possible. Node sounded like a perfect fit. For the first time in over a year, I got excited about doing web development on a new platform. Don&amp;#8217;t underestimate being excited about your technology.&lt;/p&gt;
&lt;p&gt;Ironically, when I asked Peter if I could count on him to help out he told me he just gave notice&amp;#8230; Great! But he assured me that the Node community is pretty awesome and that getting help should not be a problem. He was right.&lt;/p&gt;
&lt;p&gt;My main reasons for choosing Node 6 months ago were:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JavaScript is a natural choice for developers with C/C++ background&lt;/li&gt;
&lt;li&gt;JavaScript-all-around makes code management and reusability easier&lt;/li&gt;
&lt;li&gt;Team members can easily move between front-end and back-end&lt;/li&gt;
&lt;li&gt;Node is the hottest new platform, making it a good fit for a small project looking to attract talent&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Given the early stage of the project, I wasn&amp;#8217;t too concerned about performance (which proved to be very high) or stability (which hasn&amp;#8217;t been a blocking issue, but see below). I was mostly concerned about libraries and shared experience.&lt;/p&gt;
&lt;p&gt;My reasons for choosing Node proved to be right. One exception is code reusability between the back-end and front-end which didn’t really proved to be all that useful. We do a little bit of code reusability, mostly for OAuth 2.0 MAC tokens, but even there, the availability of native cryptographic facilities in Node make the reusable code narrower when moving to the browser.&lt;/p&gt;
&lt;p&gt;What I didn’t know 6 months ago, but made me stick with Node:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JavaScript is an extremely productive language, especially for back-end development&lt;/li&gt;
&lt;li&gt;The Node community is young which leaves plenty of room to impact core components and library development, and the leads are very open to new ideas and suggestions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;It’s fun. Super fun.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="font-size: 15px; font-weight: bold;"&gt;Is it Ready for Prime Time?&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Last year, when I told people I am going to use Node for sled.com, I was greeted with a lot of suspicion, warnings, and skepticism. Six months later I can say with confidence that it was the best decision I&amp;#8217;ve made on the engineering side of the project. It got us off to such a great start and that despite the early age of the platform.&lt;/p&gt;
&lt;p&gt;As a developer, Node has been amazingly stable. Our server experienced one week of instability in over 6 months due to a race condition bug in the Node HTTP client layer. This was easy to patch and was fixed within a week. I was very surprised at just how stable the API server have been. I&amp;#8217;ve started with version 0.2.6 and now running on 0.4.9, but experienced little to no disruptions during the transition from 0.2 to 0.4. The Node core team has done a great job at keeping the project stable, even in this very early stage.&lt;/p&gt;
&lt;p&gt;What isn&amp;#8217;t so great is library stability.&lt;/p&gt;
&lt;p&gt;There are days when I can&amp;#8217;t believe some of these libraries were ever executed, and this extends to some of the more popular modules. This is very much a work in progress and it requires a high degree of direct involvement in the library development. If you are going to use a module, you should join its mailing list and keep an eye on what is going on. Being part of the community is absolutely required if you are going to use Node.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: 15px; font-weight: bold;"&gt;The Community to the Rescue&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Node has one of the best communities I had the pleasure of working with over the past 20 years. Everyone is accessible, friendly, and eager to help. It doesn&amp;#8217;t matter if you are an expert or a novice, you are going to get attention and the help you need. This is especially true for the major module leads. Getting a library patch within hours is a pretty common thing and it helps if you work with them to pinpoint the problem.&lt;/p&gt;
&lt;p&gt;All things considered, whatever instability Node introduces, the community counters with plenty to spare.&lt;/p&gt;
&lt;h3&gt;More Coming&lt;/h3&gt;
&lt;p&gt;This will be the first in a series of posts about my on-going experience with Node. I hope people new to Node will find it useful. The next post will focus on &lt;a href="http://hueniverse.com/2011/06/the-style-of-non-blocking/"&gt;Node&amp;#8217;s non-blocking nature and how it impacts coding style&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Got an interesting Node project going? I&amp;#8217;d love to hear about it.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Hueniverse/~4/60KH81NXH3U" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://hueniverse.com/2011/06/6-months-with-node-js/#comments" thr:count="6" />
		<link rel="replies" type="application/atom+xml" href="http://hueniverse.com/2011/06/6-months-with-node-js/feed/atom/" thr:count="6" />
		<thr:total>6</thr:total>
	<feedburner:origLink>http://hueniverse.com/2011/06/6-months-with-node-js/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Eran Hammer-Lahav</name>
						<uri>http://hueniverse.com</uri>
					</author>
		<title type="html"><![CDATA[OAuth 2.0 Redirection URI Validation]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Hueniverse/~3/PQRR-5w_RUM/" />
		<id>http://hueniverse.com/?p=1402</id>
		<updated>2011-06-22T06:25:04Z</updated>
		<published>2011-06-22T06:25:04Z</published>
		<category scheme="http://hueniverse.com" term="OAuth" />		<summary type="html"><![CDATA[Why do we require clients to include the redirection URI when exchanging an authorization code for an access token in OAuth 2.0 (section 4.1.3)? Consider the following scenario: Evil user starts the OAuth flow on a legitimate client using the authorization code grant type flow. Client redirects the evil user to the authorization server, including [...]]]></summary>
		<content type="html" xml:base="http://hueniverse.com/2011/06/oauth-2-0-redirection-uri-validation/">&lt;p&gt;Why do we require clients to include the redirection URI when exchanging an authorization code for an access token in OAuth 2.0 (&lt;a href="http://tools.ietf.org/html/draft-ietf-oauth-v2-16#section-4.1.3"&gt;section 4.1.3&lt;/a&gt;)?&lt;/p&gt;
&lt;p&gt;Consider the following scenario:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Evil user starts the OAuth flow on a legitimate client using the authorization code grant type flow.&lt;/li&gt;
&lt;li&gt;Client redirects the evil user to the authorization server, including state information about the evil user account on the client.&lt;/li&gt;
&lt;li&gt;Evil user takes the authorization endpoint URI and changes the redirection to its evil site.&lt;/li&gt;
&lt;li&gt;Evil user tricks victim user to click on the link and authorize access (using phishing or other social engineering methods).&lt;/li&gt;
&lt;li&gt;Victim user thinking this is a valid authorization request (it looks kosher), authorizes access. Access is granted to the right legitimate client. So far nothing is wrong.&lt;/li&gt;
&lt;li&gt;Authorization server thinks it is sending victim user back to the client, but since the redirection URI was changed, victim user is sent to the evil site.&lt;/li&gt;
&lt;li&gt;Evil user takes the authorization code and gives it back to the client by constructing the original correct redirection URI.&lt;/li&gt;
&lt;li&gt;Client exchanges the code for access token, attaching it to the evil user&amp;#8217;s account.&lt;/li&gt;
&lt;li&gt;Evil user can now access victim user data via his client account.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The way this works, the attacker does not get direct access to protected resources, but it tricks the client into attaching the victim&amp;#8217;s access token to the attacker&amp;#8217;s account.&lt;/p&gt;
&lt;p&gt;Pre-registration of the redirection URI can help a lot, but depends on the matching rules. Since many large providers have open redirectors, the attacker can use those to construct a redirection URI that passes the authorization server validation.&lt;/p&gt;
&lt;p&gt;Requiring clients to register their full redirection URI without allowing any variations or partial matching is highly recommended.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Hueniverse/~4/PQRR-5w_RUM" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://hueniverse.com/2011/06/oauth-2-0-redirection-uri-validation/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://hueniverse.com/2011/06/oauth-2-0-redirection-uri-validation/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://hueniverse.com/2011/06/oauth-2-0-redirection-uri-validation/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Eran Hammer-Lahav</name>
						<uri>http://hueniverse.com</uri>
					</author>
		<title type="html"><![CDATA[Closing a Few More Discovery Loose Ends]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Hueniverse/~3/I0mF-NlFyxk/" />
		<id>http://hueniverse.com/?p=1393</id>
		<updated>2010-11-19T21:26:25Z</updated>
		<published>2010-11-19T21:26:25Z</published>
		<category scheme="http://hueniverse.com" term="Discovery" />		<summary type="html"><![CDATA[Two important specifications reach their final stage last month: XRD 1.0 as an OASIS Standard and Web Linking as an RFC. Both are essential building blocks in web discovery and richer distributed web services. It was a long journey getting both of these published in their respective communities &#8211; over 2 years of effort for [...]]]></summary>
		<content type="html" xml:base="http://hueniverse.com/2010/11/closing-a-few-more-discovery-loose-ends/">&lt;p&gt;Two important specifications reach their final stage last month: &lt;a href="http://docs.oasis-open.org/xri/xrd/v1.0/xrd-1.0.html"&gt;XRD 1.0&lt;/a&gt; as an OASIS Standard and &lt;a href="http://tools.ietf.org/html/rfc5988"&gt;Web Linking&lt;/a&gt; as an RFC. Both are essential building blocks in web discovery and richer distributed web services. It was a long journey getting both of these published in their respective communities &amp;#8211; over 2 years of effort for each.&lt;/p&gt;
&lt;p&gt;I would like to thank Mark Nottingham for his leadership and hard work authoring the Web Linking specification. This specification will hopefully help bridge the gap between the various formats (XRD, ATOM, HTML, etc.) and provide a consistent way to type links.&lt;/p&gt;
&lt;p&gt;Special thanks go to Will Norris for his editorial lead of XRD 1.0, taking my blog posts and notes and turning them into a useful specification with his own added ideas and improvements, and to Drummond Reed for superbly chairing the XRI TC over the past 5+ years and for supporting my crazy idea to drop XRDS and replace it with something simpler.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Hueniverse/~4/I0mF-NlFyxk" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://hueniverse.com/2010/11/closing-a-few-more-discovery-loose-ends/#comments" thr:count="2" />
		<link rel="replies" type="application/atom+xml" href="http://hueniverse.com/2010/11/closing-a-few-more-discovery-loose-ends/feed/atom/" thr:count="2" />
		<thr:total>2</thr:total>
	<feedburner:origLink>http://hueniverse.com/2010/11/closing-a-few-more-discovery-loose-ends/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Eran Hammer-Lahav</name>
						<uri>http://hueniverse.com</uri>
					</author>
		<title type="html"><![CDATA[(All these Brilliant People at) Facebook Make Me Sad]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Hueniverse/~3/ZEbKLk1G-10/" />
		<id>http://hueniverse.com/?p=1387</id>
		<updated>2010-11-03T07:58:25Z</updated>
		<published>2010-11-03T07:58:25Z</published>
		<category scheme="http://hueniverse.com" term="Open Web" />		<summary type="html"><![CDATA[This is not a post about open, about standards, about privacy, or really any criticism of Facebook in any way. In fact, the problem is just how unbelievable the Facebook team is (in a good way). The sheer strength of their talent is almost unmatched in our industry, past and present. The problem is, all [...]]]></summary>
		<content type="html" xml:base="http://hueniverse.com/2010/11/all-these-brilliant-people-at-facebook-make-me-sad/">&lt;p&gt;This is not a post about open, about standards, about privacy, or really any criticism of Facebook in any way. In fact, the problem is just how unbelievable the Facebook team is (in a good way). The sheer strength of their talent is almost unmatched in our industry, past and present. The problem is, all that talent is building something I just don&amp;#8217;t care about, and no one is left for anything else.&lt;/p&gt;
&lt;p&gt;Facebook doesn&amp;#8217;t provide me with anything useful.&lt;span id="more-1387"&gt;&lt;/span&gt;&lt;br /&gt;
When it comes to staying connected to the people I care about, they either live with me, I talk to them on the phone weekly, or have an annual dinner when I visit Israel or New York. This is just enough for me. There is a reason why I am not in touch with people from high school, the army, or film school. We all moved on, became different people, changed context, and lost the common thread that united us at the time. My personal Facebook experience of finding long lost friends is mostly a short awkward exchange followed by a one sided stream of useless information.&lt;/p&gt;
&lt;p&gt;When it comes to content, I much rather rely on the editorial board of the New York Times for my news, than what my &amp;#8220;friends&amp;#8221; find interesting. The idea that people I care about are in any way relevant to my news consumption has never produced useful results. When it comes to news, I want to be &amp;#8220;friend&amp;#8221; with the editors of the New York Times, and when it comes to buying a digital camera, the reviewers at DPReview.&lt;/p&gt;
&lt;p&gt;My family and friends are uniformly challenged when it comes to world affairs or digital cameras. Maybe it is just me, but in my offline world, information and sharing works perfectly fine without Facebook. As for casual chatting, games, and leaving comments on people&amp;#8217;s photos &amp;#8211; I choose to spend my free time doing something else. Instead of dealing with people&amp;#8217;s shit, &lt;a href="http://hammer-lahav.net/No-Place-Like-Home/Mountain-Farm"&gt;I rather handle chicken shit&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I am in no way suggesting that almost 600 million people are wrong. The massive and highly engaged Facebook user base clearly gets value and satisfaction from the product. I am also in no way critical or judgmental about those who find value there. Good for them! But for me, there are so many other unsolved problems in the world, and they have little to do with social.&lt;/p&gt;
&lt;p&gt;Last month at Open Web Foo, sitting outside with about a dozen of some really smart and highly connected folks, I asked people to name three &amp;#8220;wow&amp;#8221; experiences they had with new web products in the last year. Most had none to share. I asked them to think back 3 years and the list filled up in minutes.&lt;/p&gt;
&lt;p&gt;Forget about solving the world&amp;#8217;s problem &amp;#8211; if you don&amp;#8217;t care for Facebook, the web it just boring. It&amp;#8217;s stale.&lt;/p&gt;
&lt;p&gt;There are many reasons why engineers want to work for Facebook, from the potential windfall to learning just how they are able to ship so much technology so fast. It is an engineering dreamland. But there is one great reason why they shouldn&amp;#8217;t: because Facebook will be great without them, but the web might not.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Hueniverse/~4/ZEbKLk1G-10" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://hueniverse.com/2010/11/all-these-brilliant-people-at-facebook-make-me-sad/#comments" thr:count="65" />
		<link rel="replies" type="application/atom+xml" href="http://hueniverse.com/2010/11/all-these-brilliant-people-at-facebook-make-me-sad/feed/atom/" thr:count="65" />
		<thr:total>65</thr:total>
	<feedburner:origLink>http://hueniverse.com/2010/11/all-these-brilliant-people-at-facebook-make-me-sad/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Eran Hammer-Lahav</name>
						<uri>http://hueniverse.com</uri>
					</author>
		<title type="html"><![CDATA[The Growing Web Identity Crisis, Courtesy of Facebook]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Hueniverse/~3/ouwnQ2XPdgY/" />
		<id>http://hueniverse.com/?p=1383</id>
		<updated>2010-11-02T21:33:05Z</updated>
		<published>2010-10-18T19:56:12Z</published>
		<category scheme="http://hueniverse.com" term="Open Web" /><category scheme="http://hueniverse.com" term="Social Web" />		<summary type="html"><![CDATA[A concerning trend is showing up in recent TV and print advertisements of companies using their Facebook profile pages as their web identity instead of their own domains. Most of these companies are big corporations with a well-established web presence. Using social networks to connect with consumers and promote brands is not new, but using [...]]]></summary>
		<content type="html" xml:base="http://hueniverse.com/2010/10/the-growing-web-identity-crisis-courtesy-of-facebook/">&lt;p&gt;&lt;span&gt;A concerning trend is showing up in recent TV and print advertisements of companies using their Facebook profile pages as their web identity instead of their own domains. Most of these companies are big corporations with a well-established web presence. Using social networks to connect with consumers and promote brands is not new, but using these identities as the primary corporate web identity is new.&lt;span id="more-1383"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;For the past few years, the web identity community has been focused on the engineering side of a distributed web identity platform, developing protocols and tools to improve its usability. These efforts have mostly failed due to lack of clear consumer demand, low value, and an unusable user experience. At the same time, consumers have been eagerly embracing proprietary and closed solutions such as Facebook Connect and Sign-in with Twitter.&lt;/p&gt;
&lt;p&gt;While engineers love to debate protocols and solve engineering problems, the core issue has always been the identifier. What should people use to identify themselves to other users and when logging into web services. Such identifier solutions included HTTP URLs (such as your blog), email addresses, proprietary screen names, social networking accounts, PKI certificates, or new naming schemes (there is always a new identity startup just around the corner looking to sell you new moon lots).&lt;/p&gt;
&lt;p&gt;The recent trend in corporate web identity is to move away from their own web presence to a page on Facebook or Twitter. This is likely to make deploying a distributed web identity solution even harder. Web users have been voting with their clicks and opted to use their social networking profiles as their web identifiers. This is largely due to a clean, simple, and useful design offered by Facebook and Twitter. But the growing participation of corporations in this space is signaling that consumers are now perceiving these closed platforms as a natural part of the “open” web infrastructure.&lt;/p&gt;
&lt;p&gt;What was initially unacceptable – to put another company name on your ad – is now common practice: &lt;strong&gt;‘facebook.com/target’ &lt;/strong&gt;instead of &lt;strong&gt;‘target.com’&lt;/strong&gt;. Target no longer fear subordinating their identity to that of Facebook, because for most web users, the &lt;strong&gt;‘facebook.com/’&lt;/strong&gt; part is just the new form of &lt;strong&gt;‘http://’&lt;/strong&gt; – something they don’t care or understand which comes before the stuff that actually matters. Facebook in this context, is completely transparent to most users.&lt;/p&gt;
&lt;p&gt;Facebook has always claimed to be a platform and a utility, and this is the most obvious manifestation of this goal. The real threat to the open web is not from proprietary protocols and closed networks, but from &lt;strong&gt;‘facebook.com/’&lt;/strong&gt; and the &lt;strong&gt;‘@’&lt;/strong&gt; screen name prefix becoming another well-known prefix like &lt;strong&gt;‘http://’&lt;/strong&gt; and &lt;strong&gt;‘www.’&lt;/strong&gt;.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Hueniverse/~4/ouwnQ2XPdgY" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://hueniverse.com/2010/10/the-growing-web-identity-crisis-courtesy-of-facebook/#comments" thr:count="10" />
		<link rel="replies" type="application/atom+xml" href="http://hueniverse.com/2010/10/the-growing-web-identity-crisis-courtesy-of-facebook/feed/atom/" thr:count="10" />
		<thr:total>10</thr:total>
	<feedburner:origLink>http://hueniverse.com/2010/10/the-growing-web-identity-crisis-courtesy-of-facebook/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Eran Hammer-Lahav</name>
						<uri>http://hueniverse.com</uri>
					</author>
		<title type="html"><![CDATA[OAuth Bearer Tokens are a Terrible Idea]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Hueniverse/~3/aSq7hNsfjHc/" />
		<id>http://hueniverse.com/?p=1378</id>
		<updated>2010-09-29T19:09:29Z</updated>
		<published>2010-09-29T19:08:45Z</published>
		<category scheme="http://hueniverse.com" term="OAuth" />		<summary type="html"><![CDATA[My last post about the lack of signature support in OAuth 2.0 stirred some very good discussions and showed wide support for including a signature mechanism in OAuth 2.0. The discussions on the working group focused on the best way to include signature support, and a bit on the different approached to signatures (more on [...]]]></summary>
		<content type="html" xml:base="http://hueniverse.com/2010/09/oauth-bearer-tokens-are-a-terrible-idea/">&lt;p&gt;My last post about the &lt;a href="http://hueniverse.com/2010/09/oauth-2-0-without-signatures-is-bad-for-the-web/"&gt;lack of signature support in OAuth 2.0&lt;/a&gt; stirred some very good discussions and showed wide support for including a signature mechanism in OAuth 2.0. The discussions on the working group focused on the best way to include signature support, and a bit on the different approached to signatures (more on that in another post).&lt;/p&gt;
&lt;p&gt;However, the discussion failed to highlight the fundamental problem with supporting bearer tokens at all. In my &lt;a href="http://hueniverse.com/2010/09/oauth-2-0-without-signatures-is-bad-for-the-web/"&gt;previous post&lt;/a&gt; I suggested that bearer tokens over HTTPS are &lt;em&gt;fine for now&lt;/em&gt;. I’d like to take that back and explain why OAuth bearer tokens are a really bad idea.&lt;span id="more-1378"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;But first, some &lt;a href="http://forum.developers.facebook.net/viewtopic.php?pid=258460"&gt;live entertainment&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;Facebook developer &amp;#8216;wesbos&amp;#8217; writes:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Hey guys, I&amp;#8217;m using the freshly downloaded PHP API&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve got eveything setup and when I login to authenticate, I get this error:&lt;/p&gt;
&lt;p&gt;Fatal error: Uncaught CurlException: 60: SSL certificate problem, verify that the CA cert is OK. Details: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed thrown in /Users/wesbos/Dropbox/OrangeRhinoMedia/reporting/src/facebook.php  on line 512&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;To which &amp;#8216;Telemako&amp;#8217; replies (emphasis is mine):&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;[…] try this one:&lt;/p&gt;
&lt;p&gt;$opts[CURLOPT_&lt;strong&gt;SSL_VERIFYPEER&lt;/strong&gt;] = &lt;strong&gt;false&lt;/strong&gt;;&lt;br /&gt;
$opts[CURLOPT_SSL_VERIFYHOST] = 2;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;And &amp;#8216;philfreo&amp;#8217; &lt;a href="http://github.com/facebook/php-sdk/issues/issue/99"&gt;asks&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Is there any good reason why these shouldn&amp;#8217;t be a part of the core default $CURL_OPTS?&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Well, philfreo, Telemako, and wesbos, you have just turned off one of the most important protections SSL provides: defense against &lt;a href="http://en.wikipedia.org/wiki/Man-in-the-middle_attack"&gt;MITM attacks&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Putting All Your Eggs in One Basket&lt;/h3&gt;
&lt;p&gt;The main problem with using OAuth bearer tokens is the fact that they rely solely on SSL/TLS for its security. Bearer tokens have no internal protections. Just like cash, whoever holds the token is its rightful owner, and proving otherwise is impractical. OAuth 1.0 signatures evolved from the basic requirement not to mandate SSL/TLS. But using signatures goes beyond just a deployment consideration.&lt;/p&gt;
&lt;p&gt;In his blog post “&lt;a href="http://benlog.com/articles/2010/09/07/defending-against-your-own-stupidity/"&gt;defending against your own stupidity&lt;/a&gt;”, &lt;a href="http://ben.adida.net/"&gt;Ben Adida&lt;/a&gt; (a highly respected security expert) writes:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Consider the utility of a safety parachute. A determined attacker trying to kill you will obviously sabotage the safety parachute just as easily as he can sabotage the primary one. So, does that mean you might as well jump without a safety parachute? Of course not. You want to take into account not just the worst-case attacker, you want to take into account your own stupidity. A safety parachute means that, if you packed your primary wrong, you can still live. Defense in depth, as it’s more commonly known in the security community, is usually not about building the 12 layers of security around the “Die Hard” vault that a skilled attacker has to vanquish, one by one. Defense in depth is the humble realization that, of all the security measures you implement, a few will fail because of your own stupidity. It’s good to have a few backups, just in case.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;No matter what you do, if for any reason the SSL/TLS layer is broken, the entire security architecture of OAuth bearer tokens falls apart. In a world &lt;a href="http://googleenterprise.blogspot.com/2010/09/more-secure-cloud-for-millions-of.html"&gt;moving steadily towards multiple means of authentication and verification&lt;/a&gt;, this is a step backwards.&lt;/p&gt;
&lt;h3&gt;SSL/TLS is Harder than You Think&lt;/h3&gt;
&lt;p&gt;It is common knowledge among security experts that implementing SSL/TLS is notoriously hard. This is why very few attempt to write their own libraries. However, equally well established is that many clients implement SSL/TLS in a way that voids its most valuable defense: that against a &lt;a href="http://en.wikipedia.org/wiki/Man-in-the-middle_attack"&gt;man-in-the-middle&lt;/a&gt;. If anyone can get between your client and the server, they can capture the token and use it at will.&lt;/p&gt;
&lt;p&gt;The example above shows one of two common ways in which SSL/TLS security is compromised. I would love mock the developers quoted but it is a mistake I have made myself three years ago when writing my own OpenID library. I had no problem getting the signatures done, but had a hard time with bad certificate errors. Some were due to local configuration (getting root certificates configured is still a hard thing for most developers to do), but also due to poorly configured servers. My solution, just like the suggestion above, was to ignore these errors.&lt;/p&gt;
&lt;p&gt;The problem with SSL/TLS, is that when you fail to verify the certificate on the client side, the connection still works. Any time ignoring an error leads to success, developers are going to do just that. The server has no way of enforcing certificate verification, and even if it could, an attacker will surely not.&lt;/p&gt;
&lt;p&gt;This is not new. Ben Adida described this exact issue when &lt;a href="http://benlog.com/articles/2009/12/22/its-a-wrap/"&gt;reviewing the original WRAP proposal&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;But wait, you say, don’t worry, the token is sent over SSL, so it’s all good.&lt;/p&gt;
&lt;p&gt;Right. What’s going to happen when someone “forgets to turn on SSL”, which is all too common when security is abstracted out “somewhere down in the stack.” Or when we stop dealing with those pesky certificate errors and just choose not to validate the cert, which will leave the protocol wide open to network attackers who can now literally play man-in-the-middle just by spoofing DNS on a wifi network, capturing the token, and replaying it to access all sorts of additional resources, effectively stealing the user’s credentials.&lt;/p&gt;
&lt;p&gt;This might actually be worse than passwords, because at least you can work to educate users about SSL (and after their Facebook account gets hacked, they might actually care), but it’s very hard for users to gauge whether web applications are doing the right thing with respect to SSL certs when the SSL calls are all made by the backend which has trouble surfacing certificate errors.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;The second common potential problem are typos. Would you consider it a proper design when omitting one character (the ‘s’ in ‘https’) voids the entire security of the token? Or perhaps sending the request (over a valid and verified SSL/TLS connection) to the wrong destination (say ‘http://&lt;strong&gt;g&lt;/strong&gt;acebook.com’?). Remember, being able to use OAuth bearer tokens from the command line was clearly a use case bearer tokens advocates promoted.&lt;/p&gt;
&lt;h3&gt;Who is in Charge of Your Service Security?&lt;/h3&gt;
&lt;p&gt;The main difference between using bearer tokens and signatures is in who they put in charge of enforcing the service security. Signatures ensure that mistakes don’t compromise the token because the secret is never sent with the request. At most, an attacker can use the captured request once, and for enhanced security, signatures can and should be used together with SSL/TLS for a multi-layer protection.&lt;/p&gt;
&lt;p&gt;Yes, developers do stupid things, like posting their client credentials (API keys) on public lists and in open source code. But I have yet to see developers expose token secrets like that. It is really hard to expose OAuth 1.0a token secrets by mistake (unless that mistake is leaving your entire database open for public review, in which case, nothing will help you).&lt;/p&gt;
&lt;h3&gt;Bearer Tokens are not Just Like Cookies&lt;/h3&gt;
&lt;p&gt;The winning argument in favor of using bearer tokens has always been cookies. Bearer tokens have the same security properties of cookie authentication, as both use plaintext strings without secrets or signatures. However, there is one big difference – the client developer.&lt;/p&gt;
&lt;p&gt;For many years, browsers made it insanely easy to ignore bad certificates. It took a lot of time and many attacks to make it hard and scary to approve bad certificate exceptions. Client developers are usually not at the same level as browser security developers. While a JavaScript OAuth client enjoys the same quality code that the browser uses to verify certificates, other clients do not.&lt;/p&gt;
&lt;h3&gt;The Ironic Solution&lt;/h3&gt;
&lt;p&gt;We know developers don’t read security considerations sections. That’s a fact of life. Developer only read the parts they need to implement and ignore the parts that ask them to think. Only large companies with dedicated security teams pay much attention to that, and they usually do their own analysis. So warning developers to check the certificate is not likely to accomplish much.&lt;/p&gt;
&lt;p&gt;What’s the alternative? SDKs!&lt;/p&gt;
&lt;p&gt;If your developers cannot be trusted to implement your API correctly, it is common to offer them a library instead. I hope you can see the irony here. If you solve the SSL/TLS deployment issue with an SDK, why not just implement signatures? One argument used against signatures was that even with libraries, people will try to write their own code. Well, that&amp;#8217;s a scary proposition.&lt;/p&gt;
&lt;h3&gt;Security is Hard&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://www.links.org/"&gt;Ben Laurie&lt;/a&gt;, one of Google’s top security experts and the OpenSSL project lead writes in his explanation why WRAP “&lt;a href="http://www.links.org/?p=833"&gt;is just so obviously a bad idea, it’s difficult to know where to start&lt;/a&gt;”:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;The idea that security protocols should be so simple than anyone can implement them is attractive, but as we’ve seen, wrong. But does the difficulty of implementing them mean they can’t be used? Of course not […] every crypto algorithm under the sun is hard to implement, but there’s no shortage of libraries for them, either.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;As I have pointed out before, the &amp;#8216;signatures are hard&amp;#8217; argument dies with &lt;a href="http://hueniverse.com/2010/09/twitter-a-hot-princess-google-an-empty-castle/"&gt;Twitter&amp;#8217;s recent deployment of OAuth signatures as a requirement&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;But Everyone Else is Doing it&lt;/h3&gt;
&lt;p&gt;My favorite argument in favor of bearer tokens, and the most ridiculous one, is that Facebook, Google, Microsoft, and Yahoo! are all doing it, so that must mean its good. After all, they must have reviewed it and decided it was safe.&lt;/p&gt;
&lt;p&gt;The other variation of this argument is that bearer tokens are already widely deployed so we need to support them. All I have to say is quote the obvious: “if your friend jumped off a roof, would you?”&lt;/p&gt;
&lt;p&gt;Facebook is using MD5 in their current API, probably because that is what Flickr used when Facebook copied their API authentication scheme. See the pattern? New services simply follow what other established companies are already doing, without questioning the reasoning behind it. Big companies have resources to make these decisions, but they rarely apply as-is to others, and it is simply irresponsible to ignore their leadership position.&lt;/p&gt;
&lt;p&gt;This is how we got stuck with Basic authentication and cookie logins. This is what &lt;a href="http://www.ietf.org/rfc/rfc2617.txt"&gt;RFC 2617&lt;/a&gt; has to say about Basic HTTP authentication:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;The Basic authentication scheme is not a secure method of user authentication, nor does it in any way protect the entity, which is transmitted in cleartext across the physical network used as the carrier.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;And yet, it is still one of the most widely deployed authentication scheme on the web. People don&amp;#8217;t read specifications, they just follow the market.&lt;/p&gt;
&lt;h3&gt;Actually, Not Everyone is Doing it&lt;/h3&gt;
&lt;p&gt;OAuth 1.0 had bearer token support alongside signatures for three years now, and yet, it is barely used. Twitter could have deployed OAuth 1.0 as specified in &lt;a href="http://tools.ietf.org/html/rfc5849#section-3.4.4"&gt;RFC 5849 section 3.4.4&lt;/a&gt; but chose not to. The claim that bearer tokens are a new feature is false. All OAuth 2.0 does is clean it up and present it in a more accessible way.&lt;/p&gt;
&lt;p&gt;The problem is both with the specification and the market hype. By positioning bearer tokens as the default choice for 2.0 developers, and by highlighting the big vendors deploying it, developers are less likely to think for themselves, especially given the allergic reaction many developers have to signatures.&lt;/p&gt;
&lt;p&gt;I still have hope that early and future adopters of OAuth 2.0 will make the right decision and not deploy bearer token support for their core APIs. I have never suggested to outright ban bearer tokens. They provide a useful way to experiment with an API, to try out ideas, to test code, and to make API calls that have little to no security requirements. For example, it is perfectly fine to use bearer tokens for any Twitter API call that returns user-specific data that is publically available (like your followers list). Not so fine to use it to update your status or read private messages.&lt;/p&gt;
&lt;h3&gt;Now What?&lt;/h3&gt;
&lt;p&gt;I have concluded that the &lt;a href="http://tools.ietf.org/wg/oauth/"&gt;OAuth working group&lt;/a&gt; is not a productive place to have this debate. People are much too entrenched in their positions and with existing live deployments, a committee is not the way to reach consensus. Instead, I believe that an open public debate and market pressure is the best way to go. This is where I hope others will join me in asking their service providers to take their security more seriously.&lt;/p&gt;
&lt;p&gt;With regard to the specification, I have proposed (and so far received wide support) to make an editorial change that will separate the ‘how to get a token’ part from the ‘how to use a token’ part. This is not a new idea. By doing so, we will enhance the modularity of the protocol and remove any bias for or against bearer tokens and signatures from the specification. Instead, developers will be presented with two or more alternatives, and will have to make their own decision about what is right for their platform. This proposal is still &lt;a href="http://www.ietf.org/mail-archive/web/oauth/current/msg04523.html"&gt;pending working group consensus&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I am sure this will not be the last word on the subject.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Hueniverse/~4/aSq7hNsfjHc" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://hueniverse.com/2010/09/oauth-bearer-tokens-are-a-terrible-idea/#comments" thr:count="13" />
		<link rel="replies" type="application/atom+xml" href="http://hueniverse.com/2010/09/oauth-bearer-tokens-are-a-terrible-idea/feed/atom/" thr:count="13" />
		<thr:total>13</thr:total>
	<feedburner:origLink>http://hueniverse.com/2010/09/oauth-bearer-tokens-are-a-terrible-idea/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Eran Hammer-Lahav</name>
						<uri>http://hueniverse.com</uri>
					</author>
		<title type="html"><![CDATA[More OAuth Nonsense]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Hueniverse/~3/SBLHV4Y20Nc/" />
		<id>http://hueniverse.com/?p=1375</id>
		<updated>2010-09-23T06:10:49Z</updated>
		<published>2010-09-23T06:10:49Z</published>
		<category scheme="http://hueniverse.com" term="OAuth" />		<summary type="html"><![CDATA[ComputerWorld is the latest to run a scary story about OAuth 2.0 and how insecure it is. Unfortunately, instead of doing their homework and paying attention to my post, they borrowed a bunch of my quotes (almost half the article), added some original nonsense, sprinkled a few errors, and gave it a sensational headline: “OAuth [...]]]></summary>
		<content type="html" xml:base="http://hueniverse.com/2010/09/more-oauth-nonsense/">&lt;p&gt;ComputerWorld is the &lt;a href="http://hueniverse.com/2010/09/all-this-twitter-oauth-security-nonsense/"&gt;latest&lt;/a&gt; to run a &lt;a href="http://www.computerworld.com/s/article/9187359/OAuth_2.0_security_used_by_Facebook_others_called_weak"&gt;scary story about OAuth 2.0&lt;/a&gt; and how insecure it is. Unfortunately, instead of doing their homework and paying attention to &lt;a href="http://hueniverse.com/2010/09/oauth-2-0-without-signatures-is-bad-for-the-web/"&gt;my post&lt;/a&gt;, they borrowed a bunch of my quotes (almost half the article), added some original nonsense, sprinkled a few errors, and gave it a sensational headline: “&lt;em&gt;OAuth 2.0 security used by Facebook, others called weak&lt;/em&gt;”.&lt;/p&gt;
&lt;p&gt;OAuth 2.0 without signatures works just fine for companies like Facebook, because their developers hard-code their API endpoints. There is no danger what-so-ever for an access token to leak or get phished (any more than if they used signatures) because Facebook uses HTTPS for their OAuth 2.0 API.  This is why I titled one of the subsections: “&lt;strong&gt;Why None of this Matters Today&lt;/strong&gt;”. My post was about discovery and long term security improvements of the web &amp;#8211; not that there is anything broken about today’s implementations.&lt;span id="more-1375"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Let me make this crystal clear: &lt;strong&gt;OAuth 2.0 without signatures over HTTPS is perfectly secure&lt;/strong&gt; for proprietary APIs where the client only sends the access token to a hardcoded endpoint, and uses HTTPS properly.&lt;/p&gt;
&lt;p&gt;My favorite part is the quote from Google’s Eric Sachs (who, BTW, is not a co-author of any OAuth specification), explaining why having no signatures is a good thing:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;These guys are not experts in security. They can have a hard time understanding security models.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;This is exactly the problem. OAuth 2.0 moves some of the enforcement requirements (again, when used with dynamic service discovery) to the client, and the client developer is rarely a security expert. This is why the specification has to assume that the client developer is going to make mistakes and do everything possible to render them harmless.&lt;/p&gt;
&lt;p&gt;Raise your hand if you ever wrote a client application using HTTPS and got tired of exceptions about bad certificates, so you just ignored them silently. Unless your HTTPS code is written in a way that completely blocks the connection if there is any error, it might not do you much good. HTTPS is great when done right, and this is just one example of the difficulty in trusting clients to do the right thing.&lt;/p&gt;
&lt;p&gt;To be clear, I don’t want mandatory signatures in OAuth 2.0. I think there are valuable use cases for the current bearer token approach. And I agree that developer ease is an important design factor. Signatures were not mandatory in OAuth 1.0a either, but they are an equal part of the protocol, as they should be.&lt;/p&gt;
&lt;p&gt;Given the recent support for putting signatures back in (as an optional component), I have pushed back the publication of draft 11 until we can add a signature proposal to the core specification. I expect it sometimes in late October.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Hueniverse/~4/SBLHV4Y20Nc" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://hueniverse.com/2010/09/more-oauth-nonsense/#comments" thr:count="1" />
		<link rel="replies" type="application/atom+xml" href="http://hueniverse.com/2010/09/more-oauth-nonsense/feed/atom/" thr:count="1" />
		<thr:total>1</thr:total>
	<feedburner:origLink>http://hueniverse.com/2010/09/more-oauth-nonsense/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Eran Hammer-Lahav</name>
						<uri>http://hueniverse.com</uri>
					</author>
		<title type="html"><![CDATA[Goodbye Open (and Why I’m Staying at Yahoo!)]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Hueniverse/~3/8h1GDsX7f3I/" />
		<id>http://hueniverse.com/?p=1360</id>
		<updated>2010-09-17T22:43:22Z</updated>
		<published>2010-09-16T22:38:15Z</published>
		<category scheme="http://hueniverse.com" term="Open Web" /><category scheme="http://hueniverse.com" term="Personal" /><category scheme="http://hueniverse.com" term="Social Web" /><category scheme="http://hueniverse.com" term="Work" />		<summary type="html"><![CDATA[It’s that time again, to move on. The past three years have been a roller-coaster. Coming from a small startup after a decade in financial services technology, I got to learn, contribute, lead, and provoke open web development. My standards participation landed me a great job, relocated my family to the West coast, and introduced [...]]]></summary>
		<content type="html" xml:base="http://hueniverse.com/2010/09/goodbye-open-and-why-i%e2%80%99m-staying-at-yahoo/">&lt;p&gt;It’s that time again, to move on. The past three years have been a roller-coaster. Coming from a small startup after a decade in financial services technology, I got to learn, contribute, lead, and provoke open web development. My standards participation landed me a great job, relocated my family to the West coast, and introduced me to a lot of amazing people. It has been awesome.&lt;/p&gt;
&lt;p&gt;Over the past couple of months I have been steadily phasing out my open specifications and standards involvement. The OAuth 2.0 core specification is the only thing I am still working on (OAuth is a keeper). Everything else has either fizzled away or lost its interest to me. This should not come as a surprise to anyone who talked to me or read my posts over the past few months.&lt;br /&gt;
&lt;span id="more-1360"&gt;&lt;/span&gt;&lt;br /&gt;
First, let’s get the most important detail out of the way. I will be working on a new “startup”, building from ground up a new consumer web experience. No, I am not leaving Yahoo! In fact, I’m planning on sticking around for a while. This wasn’t an obvious conclusion, but one that I am extremely excited about (I’ll explain why in a second).&lt;/p&gt;
&lt;p&gt;A startup at Yahoo! you ask? Well, you will have to wait a bit longer for more on that. We’re still working out the details. For now, I just want you to know that I am currently hiring a front end developer (in the Bay area). The project is probably going to use Node.JS, CouchDB, HTML5, JavaScript, OAuth, and other cool new stuff. This is a chance to combine startup environment with job security and stability. I plan to write a lot more about working at Yahoo! and this new project soon.&lt;/p&gt;
&lt;h3&gt;Taking Inventory&lt;/h3&gt;
&lt;p&gt;In the &lt;a href="http://hueniverse.com/2008/04/the-last-announcerment/"&gt;tradition of recoding my thoughts&lt;/a&gt; as I set on a new adventure, these are some of the things I worked on over the past couple of years (and I do mean to brag, a little):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;OAuth – Leading author and editor of the 1.0, 1.0a (RFC 5849), and 2.0 specifications, as well as many articles and tutorials. Shepherded the transition from an open community to the IETF. Negotiated licensing terms. Coordinated the handling of a critical security flaw.&lt;/li&gt;
&lt;li&gt;Open Web Foundation – First elected president, co-founder, and past chair of the Legal Affairs and Elections committees. Established bylaws, and managed the foundation corporate registration.&lt;/li&gt;
&lt;li&gt;XRD – Lead architect and co-editor of the XRD 1.0 OASIS XRI-TC standard (pending). Previously authored the XRDS-Simple specification.&lt;/li&gt;
&lt;li&gt;Well-Known URIs – Co-authored RFC 5785 for establishing a URI prefix for well-known locations, and a IANA registry (serving as the Designated Expert approving new requests).&lt;/li&gt;
&lt;li&gt;Host-meta &amp;amp; LRDD – Authored a proposed RFC for a method locating host metadata for Web-based protocols, including a unified link-based resource descriptor discovery method. Work coordinated across many communities and standards bodies including W3C TAG.&lt;/li&gt;
&lt;li&gt;OpenID – Leading participant in the redesign of the discovery layer and identity services.&lt;/li&gt;
&lt;li&gt;Metalink – Served as document shepherded in the IETF for RFC 5854.&lt;/li&gt;
&lt;li&gt;WebFinger – Co-author of a simple web-identity layer using account URIs (email-like identifiers) for the discovery of social and personal web identity information.&lt;/li&gt;
&lt;li&gt;Portable Contacts – Helped with the initial draft. Facilitated discussions with the IETF vCard community.&lt;/li&gt;
&lt;li&gt;OpenSocial – Represented Yahoo! in the foundation creation process. Provided the initial design for the IPR framework and governance model.&lt;/li&gt;
&lt;li&gt;Discovery – Participated in specification efforts including Salmon, Activity Streams, OExchange, DiSO, Web Linking, and others, with focus on discovery services and architecture.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Is Open Dead?&lt;/h3&gt;
&lt;p&gt;Absolutely not. But I think the kind of open I was working on is mostly gone. This is not a bad thing, just the result of the changing industry, people’s careers, and economic conditions. For the most part, the movement that started with OpenID and OAuth is largely over. All the cool kids got grownup jobs and have been mostly missing. Think of the people you used to hear from on a weekly basis, and then try to remember when was the last time they had something new or provocative to say.&lt;/p&gt;
&lt;p&gt;I have written extensively about the &lt;a href="http://hueniverse.com/2010/05/open-vs-fast-good-vs-evil-google-vs-facebook/"&gt;changing industry and the role of Google and Facebook&lt;/a&gt; in the new environment. Standards development goes through cycles of products and explorations. During the exploration phase, people come together with ideas and try to create a new marketplace by working together to invent new capabilities and opportunities. Email, HTTP, and HTML are some well-known examples. During the product phase, companies with specific existing requirements come together to either unseat the market leader, or to solve specific problems where there is no competitive advantage to go at it alone.&lt;/p&gt;
&lt;p&gt;Three years ago the social space was a happening scene. Every day a new startup emerged with a new idea on how to make the web more social. Companies focused on specific communities or activities, and there was plenty of excitement. As the space matured, we now have Facebook as the clear winner with a lead that will be impossible to beat anytime soon. Facebook is to social networking what Google is to keyword search. Both are too far ahead of everyone else in their respective areas.&lt;/p&gt;
&lt;h3&gt;Got Product?&lt;/h3&gt;
&lt;p&gt;I am sure in a year or two we will go back to the exploration phase, but for now, we are deep in the product phase, and if you don’t have a product, you don’t really belong there. I have not been a fan of Yahoo!’s social strategy for most of the past two years. The vision coming from the top &lt;strong&gt;these days&lt;/strong&gt; is a lot more promising, exciting, and aligned with where I think the company should go, but this was not always the case.&lt;/p&gt;
&lt;p&gt;The reality is, that when it comes to the kind of technologies I’ve been involved in, Yahoo! has not been an important player. This did not impact my ability to lead during the exploration phase, but now without a leading product, it is very hard to be effective. If you want to develop new social web standards, you absolutely have to work at Facebook or Twitter. That’s where all the action is. Google might be trying its best, but in practice no one cares about social technology coming out of Google. They have also lost their leadership in most of the groups I have been active in (and not due to lack of trying).&lt;/p&gt;
&lt;p&gt;There is still interesting work done by Blaine Cook, Status.net, and the federated social web folks, but it’s all too experimental, and I don’t see it anywhere near mass market anytime soon.&lt;/p&gt;
&lt;h3&gt;Standards is a Horrible Career Path&lt;/h3&gt;
&lt;p&gt;Late last year I came to the conclusion that my ability to be effective at my job is coming to an end. Yahoo! has been consistently supportive of my work, provided me with a wealth of resources, and gave me absolute freedom to “make the web better” (that’s how one of my managers described my job). This is very unusual, and something Yahoo! deserves a lot of credit for. Yahoo! repeatedly &lt;a href="http://www.readwriteweb.com/archives/how_the_oauth_security_battle_was_won_open_web_sty.php"&gt;stepped up to support the community&lt;/a&gt; and provided resources without asking what’s in it for them, because it was what was best for the web. This is very rare in our industry.&lt;/p&gt;
&lt;p&gt;I was faced with two options: find a new job where I can be effective again, or move on. Given my passion (and success) at developing open specifications and communities, I spent a considerable time and effort looking for a similar opportunity elsewhere. I talked to all the usual suspects, got some offers, got ignored a lot, and at the end arrived at the conclusion that it’s time to move on from standards. I do want to say that of all the companies I talked to, I was impressed with how respectfully Facebook handled the interaction. Can&amp;#8217;t say that about some of the others.&lt;/p&gt;
&lt;p&gt;I also realized just how destructive choosing standards as a career path can be. The standards world is very demanding and will suck every free minute you have. Most people contribute very little, and at the end, a handful of people end up carrying all the load. The problem is, no one wants to foot the bill for those suckers. Only a handful of very large corporations (mostly telecommunication and hardware) support employees doing standards full time, and mostly to serve their self-interest.&lt;/p&gt;
&lt;p&gt;Anyone who ever met me knows that I am not the right person to represent a company line. I have my own voice, it&amp;#8217;s loud (sometimes obnoxious), and I’m not shy of using it. I don’t know of any other company that allows its employees to speak their mind so freely and openly, even when they are in disagreement with the company’s official policy. Even our legal team has policies in place to enable that. I have often been out of alignment over Yahoo!&amp;#8217;s OAuth and OpenID strategies. But at no time was I told to shut up, something at least one of my collaborators at Google cannot say.&lt;/p&gt;
&lt;p&gt;At the end, especially during hard economic times, finding a role focused on standards is hard. It is especially hard when you have views that are not likely to always be in line with those of your employer. Kids &amp;#8211; stay away from standards as a career.&lt;/p&gt;
&lt;h3&gt;It’s All About the Product&lt;/h3&gt;
&lt;p&gt;I miss building stuff. I miss writing code and seeing how something starts from nothing and progress into a working system. With the exception of the last three years, I have been building applications since I was 8 years old, using my first Sinclair ZX81 computer. When I was 11 a friend and I wrote a palm reading program. We got into trouble when we set up a stand at a local fair and gave someone a printout stating that her intelligent was below average. Hey, not my fault her head-line was so short.&lt;/p&gt;
&lt;p&gt;More than OAuth, my passion the past few years has been discovery. It is very rewarding to see some of my work finally making its way to actual products. But most of the time it was just frustrating, putting all this effort in without any actual commitment from those building products. I still think discovery is going to be more and more critical as the web grows and becomes more distributed, but it will take a while longer before my vision can be fully appreciated.&lt;/p&gt;
&lt;h3&gt;Why Yahoo!?&lt;/h3&gt;
&lt;p&gt;That’s a great question, and one that I have been debating for almost a year now. It was a hard decision, but once I reached it, it was clearly the right decision, and I am super excited about the coming year. To get to my conclusion, there are a few factors you need understand. When considering a new employer, I mostly care about: their products, their culture, my manager, my team, and how they balance work-life. Technology, compensation, location, reputation, and IPO prospects have never made a difference to me.&lt;/p&gt;
&lt;p&gt;So let’s go through them one by one.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Products –&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Yahoo! is still working to define what it is. I have heard the official description but like most people, am still trying to figure out what it really means. What I do know is that we have the biggest audience on line, a long list of best in class properties, a leading brand name with unparalleled trust (no one is afraid of Yahoo! trying to take over the world), and a user profile that is exactly the people I want to build products for – normal everyday web users. If you get the core Yahoo! user base to use a new experience, your impact is massive – far beyond just web habits.&lt;/p&gt;
&lt;p&gt;Facebook, Google, and Twitter are all one hit wonders. Granted, these are some unbelievable wonders, and I have nothing but awe and respect for what these three companies are doing in their space. But let’s face it, they are known for one thing (Google has a few new promising areas like Chrome and Android), and working there most likely means focusing on &lt;strong&gt;improving &lt;/strong&gt;an existing product rather than &lt;strong&gt;building something new&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;I rarely use Twitter or Facebook. They don’t add much value to me. That’s in no way criticism of their products, just that I care a lot more about what people say on &lt;a href="http://www.backyardchickens.com/"&gt;BackyardChickens.com&lt;/a&gt; than on Twitter or Facebook. Same goes for the people in my family. One of the reasons Facebook is such a success is the fact their employees are truly passionate about the product and use it intensely, and I think that that alignment is important.&lt;/p&gt;
&lt;p&gt;Working for Yahoo!, especially these days, offers more opportunities to work on something new and exciting than anywhere else. It offers unmatched access to resources and audiences, and a management team that is eager to hear new ideas from every level of the organization.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Culture –&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If it wasn’t clear by now, I value openness, directness, flat hierarchy, equality, diversity, and individuality. This list alone rules out a bunch of companies. Google’s approach is to build an army of (really smart, talented, and somewhat socially inadequate) clones. When you are hired, you don’t know what you are going to work on. Google&amp;#8217;s hiring process is designed to make sure they hire great engineers that can do anything. This allows them to shift resources around as needed quickly, but in the three times I engaged Google over a job, I could not get past that. I will not take a job where I am just another engineer.&lt;/p&gt;
&lt;p&gt;Facebook is much better, but their emphasis is mostly on coding skills alone. I could not figure out what Twitter’s culture is like (and I’m not sure if they know either).&lt;/p&gt;
&lt;p&gt;Yahoo! scores high on every one of my cultural values. The problem at Yahoo! is that the culture has been taken hostage by complaining, ranting, sarcasm, irony, and a generally depressing mood. The underlying culture is very much there, but it is hard to enjoy it given the general atmosphere. &lt;strong&gt;Part&lt;/strong&gt; of the problem, is the constant hammering of the tech press, making a big deal out of every departure (much more than at other companies).&lt;/p&gt;
&lt;p&gt;This is where Yahoo!’s collegial culture is counterproductive to its own best interest. Consider some of the recent high profile departures. Yes these are all smart, talented individuals. But with a few exceptions, these are mostly people who got pass on in a recent reorganization, failed to deliver a product, did not fit in a company focused on mass market consumer experiences, were offended that someone else got a better role or more control, or been there for more than 5 years. In other words, this is corporate business as usual.&lt;/p&gt;
&lt;p&gt;The problem is, because Yahoo!s are so nice (people often wonder why they keep me), they will never leak out and share these negative realities to balance the news (we are known to leak plenty of other stuff). This is great for the individuals working there, because at some point, we all move on, but at the moment, it is taking a toll.&lt;/p&gt;
&lt;p&gt;I am in no way blaming the press for any of the underlying issues, or for doing their job highlighting them. I don&amp;#8217;t think the coverage is fully balanced (&amp;#8220;People are running away from Yahoo!&amp;#8221; vs. &amp;#8220;Facebook stole another Google engineer&amp;#8221;), and it is clearly one of the main factors casing the current mood. I only mentioned this as an example of how the culture and mood are linked.&lt;/p&gt;
&lt;p&gt;My solution is simple. Two months ago I decided to try and stop complaining. No more sitting at URL’s (our café) bitching about everything we suck at. For now, it seems to work.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;My Manager –&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I think most people will consider this entire post as one big ass kissing. I hope those who know me see this for what it is – a public venting of my views, frustration, admiration, and random rants. I like to share my views, even when others find them inappropriate. It has made me plenty of enemies, but no one has ever claimed not to know where I stand or where they stand with me.&lt;/p&gt;
&lt;p&gt;Keep in mind that I’m the guy who, on his first week at Yahoo!, was featured on Valley Wag under the headline: “&lt;a href="http://valleywag.gawker.com/5017086/new-yahoo-joining-up-without-severance-package-would-be-like-running-into-a-burning-building"&gt;New Yahoo: Joining up without severance package would be like ‘running into a burning building’&lt;/a&gt;” (I am still the number one search result for ‘&lt;a href="http://www.google.com/search?q=running+into+a+burning+building"&gt;running into a burning building&lt;/a&gt;’). With that said, I am going to simply state that my manager, Mike Curtis (head of Mail engineering), is awesome. I recently had the rare opportunity to pick my own manager and I think that says it all. I am also happy about the chain of command between me and the CEO.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;My Team –&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;My discussions around a new role outside Yahoo! did not reach the team evaluation stage (with one exception at Facebook, where the team was great). So while important, it was not a big factor. What was, is my ability to build my own team, which is something I have always enjoyed doing. At Citibank, I twice built large teams building high frequency trading systems, and it is something I miss doing. I am not going to be building anything this big anytime soon, but I get to hire a couple of people today and that’s plenty fun.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Work / Life Balance –&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is Yahoo!’s number one asset and number one liability. If you are an employee, you will not find a better place to have a family, to have a hobby, or in other words, to have life beyond work. Between company events, benefits, and overall atmosphere, Yahoo! is the most welcoming place I have ever worked (or interviewed with) when it comes to having a family (our twins are turning 6 next month).&lt;/p&gt;
&lt;p&gt;Beyond its culture, the reason for that is the profile of the employees. Being one of the few “old” web companies around, and currently attracting less young blood than its competitors, Yahoo!’s employees tend to have a family and are not the kind of people usually joining a startup. The problem, of course, is that this makes it harder to move fast and innovate at a competitive rate. Every time I visit Facebook I feel like (at 36) I’m the oldest guy in the room – the place is like a college campus.&lt;/p&gt;
&lt;p&gt;But with the new management’s determination to innovate, and to give anything a try to accomplish that, I really believe Yahoo! is in a unique position to attract a large group of brilliant engineers, those not interested in the bootstrapping startup life, but innovative and passionate about building the next generation of web experiences. Being the place where you don’t have to choose between spending time with your family and changing the world through web innovation, is something Yahoo! has a unique opportunity to become, more than anyone else. We are clearly not there yet, but this is something I want to work on.&lt;/p&gt;
&lt;p&gt;This is also why I believe Yahoo! has a better chance of understanding our audience, the same way Facebook truly understand theirs. Our company profile is very much the audience we seek to serve &amp;#8211; everyone.&lt;/p&gt;
&lt;h3&gt;On to the Next Great Thing&lt;/h3&gt;
&lt;p&gt;It took me a while to get here, and after a yearlong search, I’ve decided to stick around and it feels right. There are still more things to figure out about my new project and the company, and like any “startup”, anything can happen and this can be short lived or a huge success (or anything in between). Many people I talked to these last few days told me I’m nuts, day dreaming, or naïve. Maybe I am.&lt;/p&gt;
&lt;p&gt;But I’m having more fun than everyone I know, I got a great job, I’m paid well, my employer truly cares about my well-being, I get to spend quality time with my family, and I even get to play farmer in my spare time (chickens, ducks, bees, large garden and an orchard).&lt;/p&gt;
&lt;p&gt;Can you say that, without qualifications, about your job?&lt;/p&gt;
&lt;p&gt;I’m hiring a front end developer (you can start tomorrow), and Yahoo! has plenty of great jobs available in both new and core products. If you are interested, and available in the Bay area, email me at &lt;a href="mailto:eran@hueniverse.com"&gt;eran@hueniverse.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This blog will continue to highlight open standards, because that’s something I am still very much passionate about, but it will also offer more insight into life at Yahoo!, my new project, and whatever else is on my mind. This is going to be yet another fun ride. Stick around.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Hueniverse/~4/8h1GDsX7f3I" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://hueniverse.com/2010/09/goodbye-open-and-why-i%e2%80%99m-staying-at-yahoo/#comments" thr:count="7" />
		<link rel="replies" type="application/atom+xml" href="http://hueniverse.com/2010/09/goodbye-open-and-why-i%e2%80%99m-staying-at-yahoo/feed/atom/" thr:count="7" />
		<thr:total>7</thr:total>
	<feedburner:origLink>http://hueniverse.com/2010/09/goodbye-open-and-why-i%e2%80%99m-staying-at-yahoo/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Eran Hammer-Lahav</name>
						<uri>http://hueniverse.com</uri>
					</author>
		<title type="html"><![CDATA[OAuth 2.0 (without Signatures) is Bad for the Web]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Hueniverse/~3/BOZbEP5_IFk/" />
		<id>http://hueniverse.com/?p=1356</id>
		<updated>2010-09-16T06:07:00Z</updated>
		<published>2010-09-16T06:05:22Z</published>
		<category scheme="http://hueniverse.com" term="OAuth" /><category scheme="http://hueniverse.com" term="Open Web" />		<summary type="html"><![CDATA[OAuth 2.0 drops signatures and cryptography in favor of bearer tokens, similar to how cookies work. As the OAuth 2.0 editor, I’m associated with the OAuth 2.0 protocol more than most, and the assumption is that I agree with the decisions and directions the protocol is taking. While being an editor gives you a certain [...]]]></summary>
		<content type="html" xml:base="http://hueniverse.com/2010/09/oauth-2-0-without-signatures-is-bad-for-the-web/">&lt;p&gt;&lt;a href="http://hueniverse.com/2010/05/introducing-oauth-2-0/"&gt;OAuth 2.0&lt;/a&gt; drops signatures and cryptography in favor of bearer tokens, similar to how cookies work. As the OAuth 2.0 editor, I’m associated with the OAuth 2.0 protocol more than most, and the assumption is that I agree with the decisions and directions the protocol is taking. While being an editor gives you a certain degree of temporary control over the specification, at the end decisions are made by the group as a whole (as they should).&lt;/p&gt;
&lt;p&gt;And as a whole, the OAuth community has made a big mistake about the future direction of the protocol. A mistake that is going to make OAuth 2.0 a much less significant agent of change on the web.&lt;span id="more-1356"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;All this Crypto Business&lt;/h3&gt;
&lt;p&gt;OAuth 1.0 allows application developers to sign requests. Signatures remove the need to send plain-text secrets on insecure (or secure) channels. Instead of sending the secret with the request for the other side to compare against their copy of the secret (similar to how passwords work), the secret is used to calculate a value which cannot be converted back the secret itself. Instead, the signature can be verified by someone with a copy of the secret.&lt;/p&gt;
&lt;p&gt;When performing an irreversible calculation that the other side can verify, signatures protect secrets by simply never sending them on the wire. By removing the need to send secrets, applications don’t need to rely on other protocols (such as SSL/TLS) to protect the plain-text secrets. That’s not all signatures provide, but more on that later.&lt;/p&gt;
&lt;p&gt;To sign a request, developers have to follow a list of steps in a very specific order and with much care (which often feels like battling a dragon). The smallest mistake causes the entire request to fail. While the OAuth 1.0 signature process could have been somewhat simpler (no double encoding, different sorting, no URI parsing into query parameters, etc.), any time developers need to canonicalize data, stuff breaks. Even beyond the complex math, cryptography is hard because it is generally unforgiving. It does not tolerate mistakes.&lt;/p&gt;
&lt;h3&gt;WRAP and the Stupidity Threshold&lt;/h3&gt;
&lt;p&gt;After deploying OAuth 1.0, many companies discovered the cost of supporting OAuth 1.0 due to mismatching signatures. OAuth 1.0 looks simple enough for developer to code from scratch instead of using a library (as opposed to SSL or TLS which no one in their right mind will try to write from scratch). When developers write their own code, they are likely to get one small detail wrong. It didn’t help that the specification was vague and implicit about many important details (which since has been corrected in the RFC).&lt;/p&gt;
&lt;p&gt;Ironically, the bigger the company was, the more resources it had, and the &lt;a href="http://hueniverse.com/2010/09/twitter-a-hot-princess-google-an-empty-castle/"&gt;least interesting and useful API it offered&lt;/a&gt;, the louder the complaining about OAuth signatures was. This had an easy and straightforward solution: provide better libraries to your developers as well as better (or any) debugging tools. Alternatively, make your API so valuable that developers will be motivated to struggle through it and figure it out. Unfortunately, this was not the solution the people behind &lt;a href="http://hueniverse.com/2009/11/wrap-and-the-demise-of-the-oauth-community/"&gt;WRAP&lt;/a&gt; had in mind.&lt;/p&gt;
&lt;p&gt;At the heart of the WRAP architecture is the requirement to remove any cryptography from the client side. The WRAP authors observed how developers struggled with OAuth 1.0 signatures and their conclusion was that the solution is to drop signatures completely. Instead, they decided to rely on a proven and widely available technology: HTTPS (or more accurately, SSL/TLS). Why bother with signatures if instead the developer can add a single character to their request (turning it from &lt;em&gt;http://&lt;/em&gt; to &lt;em&gt;https://&lt;/em&gt;) and protect the secret from an eavesdropper.&lt;/p&gt;
&lt;p&gt;Much of the criticism that followed focused on the fact that WRAP does not actually require HTTPS. It simply makes it an option. This use of tokens without a secret or other verification mechanism is called a bearer token. Whoever holds the token gains access. If you are an attacker, you just need to get hold of this simple string and you are good to go. No signatures, calculations, reverse engineering, or other such efforts required.&lt;/p&gt;
&lt;h3&gt;As Secure As a Cookie&lt;/h3&gt;
&lt;p&gt;WRAP was based on a simple, and powerful argument: bearer tokens are already a core web architecture. While far from ideal, the WRAP security model was directly based on cookies – the authentication layer behind almost every web application. Why bother to create something more secure if it makes it harder for developers to use, while not actually improving the overall security of the service. As long as a site offers both an OAuth API and a human web interface (i.e. a web site), the overall service will only be as secure as its weakest part – the cookie-based authentication system.&lt;/p&gt;
&lt;p&gt;The problem with this argument is not today, but 5 years from now. When trying to propose a new cookie protocol, developers will make the same argument, only this time pointing the finger at OAuth 2.0 as the weakest link. Removing signatures and relying solely on a secure channel solves the immediate problem, and maintain the same existing level of security. But it lacks any kind of forward looking responsibility, and the drive to make the web more secure. It’s a copout.&lt;/p&gt;
&lt;p&gt;What makes this more frustrating is that the people behind WARP are some of the brightest security minds on the web. These guys know exactly what they are doing, and it’s not like they don’t care. They just gave up and decided that the best they can do is maintain the status quo. They are also representing a large and powerful coalition of big companies too lazy to work a little harder by helping their developers use signatures successfully.&lt;/p&gt;
&lt;h3&gt;Doesn’t HTTPS Solve Everything?&lt;/h3&gt;
&lt;p&gt;HTTPS guarantees an end-to-end secure connection. The implementation and deployment details are critical to ensure that, but when done correctly (which is not always the case), is a great solution. What HTTPS provides is a secure channel. Any secret, password, or bearer token sent over HTTPS is protected and cannot be compromised by an attacker listening in on the line. HTTPS allows a client to send a secret to its desired destination securely.&lt;/p&gt;
&lt;p&gt;However, HTTPS can’t help if the client’s desired destination is a bad place. HTTPS doesn’t help prevent phishing attacks because anyone can get an SSL certificate and show the secure icon in the browser. The fact you are using a secure channel doesn’t mean the entity on the other side is good. It just means that no one else can listen in on it (just the bad guys). If a client sends their bearer token to the wrong place, even over HTTPS, it’s game over.&lt;/p&gt;
&lt;p&gt;Another issue is that the OAuth working group could not even reach consensus on actually requiring HTTPS, leaving it as an recommendation for services to decide. Even OAuth 1.0 requires HTTPS for its plain-text flavor, which was added to get it published as an RFC. Instead, OAuth 2.0 is satisfied with just a warning.  OAuth 2.0’s solution is to allow (but not require) access tokens to be short lived. By limiting the bearer token’s lifetime, stolen tokens are only useful for a short period of time, limiting the potential damage.&lt;/p&gt;
&lt;h3&gt;Why None of this Matters Today&lt;/h3&gt;
&lt;p&gt;OAuth today is used together with proprietary web service APIs. There is little to no interoperability across these services (Facebook API used only on Facebook, etc.) and almost no clients performing discovery of any kind. Because the API endpoints are hard coded into the client, when combined with HTTPS, there is no risk of leaking the tokens. In this setup, the client does not need to do much thinking about where to send tokens and how to protect them.&lt;/p&gt;
&lt;p&gt;Unlike cookies which are sent to the server based on a somewhat complex set of client rules, OAuth clients today don’t use any rules. Instead they use a single token for an entire service with all API endpoint preconfigured. There are no new subdomains to handle, or really any kind of unexpected or dynamic interaction. In this environment, bearer tokens over HTTPS are just fine.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why All of this will Matter Soon&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;As soon as we try to introduce discovery or interoperable APIs across services, OAuth 2.0 fails. Because it lacks cryptographic protection of the tokens (there are no token secrets), the client has to figure out where it is safe to send tokens. OAuth reliance on the cookie model requires the same solution – making the client apply the security policy and figure out which servers to share its tokens with. The resource servers, of course, can ask for tokens issued by any authorization server.&lt;/p&gt;
&lt;p&gt;For example, a protected resource can claim that it requires an OAuth access token issued by Google when in fact, it has nothing to do with Google (ever though it might be a Google subdomain). The client will have to figure out if the server is authorized to see its Google access token. Cookies have rules regarding which cookie is shared with which server. But because these rules are enforced by the client, there is a long history of security failures due to incorrect sharing of cookies. The same applies to OAuth 2.0.&lt;/p&gt;
&lt;p&gt;Any solution based on client side enforcement of a security policy is broken and will fail. OAuth 1.0 solves this by supporting signatures. If a client sends a request to the wrong server, nothing bad happens because the evil server has no way of using that misguided request to do anything else. If a client sends an OAuth 2.0 request to the wrong server (found via discovery), that server can now access the user’s resources freely as long as the token is valid.&lt;/p&gt;
&lt;p&gt;It is clear that once discovery is used, clients will be manipulated to send their tokens to the wrong place, just like people are phished. Any solution based solely on a policy enforced by the client is doomed.&lt;/p&gt;
&lt;h3&gt;No Discovery for You&lt;/h3&gt;
&lt;p&gt;Without signatures, OAuth 2.0 cannot safely support discovery. It is a waste of time and a risky business. Clearly, the OAuth community today does not care enough about discovery and interoperable services to do something about it. The cryptographic solutions proposed so far are focused on self-encoded tokens and other distributed systems, based on narrow use cases promoted by the likes of Google, Microsoft, and a few other enterprise-focused companies.&lt;/p&gt;
&lt;p&gt;Without discovery, smaller companies will have a harder time getting their services accessible (e.g. when importing your address book from any provider, not just the big four).&lt;/p&gt;
&lt;h3&gt;Now What?&lt;/h3&gt;
&lt;p&gt;I am not advocating throwing OAuth 2.0 out, starting over, or requiring signatures. All I have ever advocated for is the inclusion of a basic signature option in the core specification, in the spirit of OAuth 1.0. The 1.0 signature isn’t perfect, but as the Twitter developer community demonstrated, is clearly within reach.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Hueniverse/~4/BOZbEP5_IFk" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://hueniverse.com/2010/09/oauth-2-0-without-signatures-is-bad-for-the-web/#comments" thr:count="35" />
		<link rel="replies" type="application/atom+xml" href="http://hueniverse.com/2010/09/oauth-2-0-without-signatures-is-bad-for-the-web/feed/atom/" thr:count="35" />
		<thr:total>35</thr:total>
	<feedburner:origLink>http://hueniverse.com/2010/09/oauth-2-0-without-signatures-is-bad-for-the-web/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Eran Hammer-Lahav</name>
						<uri>http://hueniverse.com</uri>
					</author>
		<title type="html"><![CDATA[Twitter a Hot Princess, Google an Empty Castle]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Hueniverse/~3/DerJIVREJ0c/" />
		<id>http://hueniverse.com/?p=1353</id>
		<updated>2010-09-16T06:06:05Z</updated>
		<published>2010-09-16T05:28:47Z</published>
		<category scheme="http://hueniverse.com" term="OAuth" />		<summary type="html"><![CDATA[Over the past two years I have been arguing that the problem with supporting OAuth 1.0 signatures wasn’t with the signatures, but with the lack of value in trying to figure them out. The primary argument made by the WRAP authors and now the majority of OAuth 2.0 contributors is that signatures are hard and [...]]]></summary>
		<content type="html" xml:base="http://hueniverse.com/2010/09/twitter-a-hot-princess-google-an-empty-castle/">&lt;p&gt;Over the past two years I have been arguing that the problem with supporting &lt;a href="http://hueniverse.com/2008/10/beginners-guide-to-oauth-part-iii-security-architecture/"&gt;OAuth 1.0 signatures&lt;/a&gt; wasn’t with the signatures, but with the lack of value in trying to figure them out. The primary argument made by the &lt;a href="http://hueniverse.com/2009/11/wrap-and-the-demise-of-the-oauth-community/"&gt;WRAP&lt;/a&gt; authors and now the majority of OAuth 2.0 contributors is that &lt;strong&gt;signatures are hard and developers are stupid&lt;/strong&gt;. This combination, they argued, is costing them developers.&lt;/p&gt;
&lt;p&gt;To address this, they argued that the only solution is to remove signatures. I countered that instead of creating a new protocol, the companies complaining (primarily, Google, Microsoft, and Yahoo!) should invest in quality libraries and debugging tools.&lt;/p&gt;
&lt;p&gt;My point was (and still is) that if you give developers value, they will fight to figure out the signatures. A couple of weeks ago Twitter discontinued their support for Basic authentication, and what these people said cannot happen, &lt;strong&gt;happened&lt;/strong&gt;. All these developers figured out how to migrate their application to OAuth 1.0. That despite the lacking Twitter developers support, alleged bugs, and &lt;a href="http://hueniverse.com/2010/09/all-this-twitter-oauth-security-nonsense/"&gt;other complaints about Twitter’s implementation&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Don’t expect knights to battle dragons if your castle is empty. Twitter put a hot blond (or brunette) princess (or prince) in their castle, and their (API) knights fought the evil (signature) dragon and got their reward. Google and the rest of the big web providers with their useless offering of boring APIs left their castle empty.&lt;/p&gt;
&lt;p&gt;Guess what! The kind of knights who come to fight dragons living in empty castle are there for the fight, not to do something useful. Yes, battling dragons is a bitch, but knights tend to forget that once they get their happy-ever-after. Give them an empty castle and they will do nothing but obsess about their battle scars.&lt;/p&gt;
&lt;p&gt;Why does this matter? Because without signatures, &lt;a href="http://hueniverse.com/2010/09/oauth-2-0-without-signatures-is-bad-for-the-web/"&gt;there can be no secure discovery and less open web&lt;/a&gt;.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Hueniverse/~4/DerJIVREJ0c" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://hueniverse.com/2010/09/twitter-a-hot-princess-google-an-empty-castle/#comments" thr:count="4" />
		<link rel="replies" type="application/atom+xml" href="http://hueniverse.com/2010/09/twitter-a-hot-princess-google-an-empty-castle/feed/atom/" thr:count="4" />
		<thr:total>4</thr:total>
	<feedburner:origLink>http://hueniverse.com/2010/09/twitter-a-hot-princess-google-an-empty-castle/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Eran Hammer-Lahav</name>
						<uri>http://hueniverse.com</uri>
					</author>
		<title type="html"><![CDATA[How to Enter a Standards Working Group]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Hueniverse/~3/oqemuOCuPng/" />
		<id>http://hueniverse.com/?p=1350</id>
		<updated>2010-09-06T06:16:57Z</updated>
		<published>2010-09-06T06:16:57Z</published>
		<category scheme="http://hueniverse.com" term="Open Web" />		<summary type="html"><![CDATA[As the OAuth specification editor, I am approached daily with comments, questions, ideas, and some very odd solicitations. It is quite fun. It seems that most people joining the work are determined to undermine their contribution by doing their best to alienate or insult the community, and often the editor. This is not unique to [...]]]></summary>
		<content type="html" xml:base="http://hueniverse.com/2010/09/how-to-enter-a-standards-working-group/">&lt;p&gt;As the OAuth specification editor, I am approached daily with comments, questions, ideas, and some very odd solicitations. It is quite fun. It seems that most people joining the work are determined to undermine their contribution by doing their best to alienate or insult the community, and often the editor.&lt;/p&gt;
&lt;p&gt;This is not unique to OAuth &amp;#8211; I have seen the same mistakes in many other places. Since working on an early draft of the OAuth 2.0 specification, I started collecting tips for newcomers. Here are some that would make your entrance into a standards working group much smoother and productive.&lt;span id="more-1350"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Don&amp;#8217;t start with a proposal, start with a question.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Assume you don&amp;#8217;t understand everything, especially if you have feedback or ideas for changes. Instead of jumping in with some new re-architecture of the entire protocol, start by asking why it is the way it is. Engage the community first with a question, and work your way to change requests based on the answer you receive. By asking a question, you allow for the possibility that whatever if bugging you has a valid reason.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Keep your message as short and to the point as possible.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You are an unknown so people will look for reasons to ignore your  message. Most people don&amp;#8217;t even open messages from newcomers. Instead,  they wait to see if a thread develops. In other words, they wait until  someone else puts in the extra work to deal with the new guy. If your  message is short, it is more likely not to be ignored.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Don&amp;#8217;t email the editor privately, asking for permission before asking the list.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You don&amp;#8217;t need permission to ask questions or post to the list. All the specification editors I know (and certainly me) are usually busy and work in bursts. This means your email is most likely going to be moved to some queue of questions and feedback about the specification, to be processed right before the next editorial cycle. You are also wasting their time by forcing them to read your message twice (once directly and once on the list), and in many cases, repeat the discussion. This is why we have a public list &amp;#8211; just join and post away.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Don&amp;#8217;t prefix your message with I&amp;#8217;m new here.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s never a good idea to start a relationship with an excuse. The only reason to put an &amp;#8220;I&amp;#8217;m new here&amp;#8221; disclaimer on your message is if you were too lazy to do your homework, read group archives, read the full specification (and revision history), and think before writing. If you do all that, your contribution is as valid and relevant as that of anyone else. The working group regulars know you are new.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Focus on what you know best.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Pick an area where you have experience and provide feedback to show you know what you are talking about. Don&amp;#8217;t start with a multi-page review of the entire specification. Instead, focus on the areas you are most knowledgeable about and demonstrate your skills and experience through the quality of your contribution. Don&amp;#8217;t provide a summary of your career &amp;#8211; saying you have many years of experience is the least effective way to get that message across. Let you work speak for itself.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Never start with an editorial suggestion.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Editors like to write, and they take pride in their work. They also have their own unique voice. Starting a relationship with a specification editor by criticizing their style is not a good way to get them to listen. Typos, mistakes, and other technical issues with the specification are always welcomed, but offering replacement text or ideas on how to say something differently will most likely be ignored, no matter how good the suggestions are. Wait for an editor to ask you to suggest text before sending in your own revision.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Start with a compliment, show good progress.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Pick something you think is good about the work, and highlight it. This isn&amp;#8217;t rocket science, just common sense. Don&amp;#8217;t compliment any one person in particular (like the editor or chair). Compliment the work and the community and do it in a way that adds value, like highlighting what is strong and good about the work, providing additional support.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Clearly state your role and introduce yourself.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Spend a few words to introduce yourself the first time you write something. Don&amp;#8217;t just barge in &amp;#8211; it&amp;#8217;s rude. Also, standards are highly political, and in a political environment, people want to know who they are dealing with. No need for life story, just the basic facts (lurker, developer, representative for a big company). And don&amp;#8217;t assume everyone know who you are just because you think you are important.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Do your political homework.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Identify the key participants and align yourself with those you agree with, showing you are well versed in the internal politics. Joining the discussion through agreement with a primary participant allows you to establish a work relationship with those most likely to be in a position to listen and impact. Agreeing with someone is usually better than disagreeing &amp;#8211; it adds emphasis to an existing view, and doesn&amp;#8217;t cost you political points going directly against someone else.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Make sure to be right if you are going to keep a thread going.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you are going to stand your ground and keep an argument going, against the group consensus, make sure you know what you are talking about. It is perfectly fine to keep an issue going if you are unhappy with the resolution, but if you are new, this behavior is more likely to alienate the group than win your argument. If you are going to keep at it, make sure to add new facts and new examples to make your point.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Don&amp;#8217;t explain basic standards principals.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Assume everyone knows what bike-shedding, design by committee, or KISS are. Don&amp;#8217;t lecture the working group about process and other philosophical ideals. For most of the people involved, this is probably not the first standard.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Don&amp;#8217;t prefix more messages with &amp;#8220;I&amp;#8217;m still new here&amp;#8221;.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You didn&amp;#8217;t need to state it the first time, so please don&amp;#8217;t keep  repeating you are (still) new. Yes, we got it, you are new here.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Hueniverse/~4/oqemuOCuPng" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://hueniverse.com/2010/09/how-to-enter-a-standards-working-group/#comments" thr:count="1" />
		<link rel="replies" type="application/atom+xml" href="http://hueniverse.com/2010/09/how-to-enter-a-standards-working-group/feed/atom/" thr:count="1" />
		<thr:total>1</thr:total>
	<feedburner:origLink>http://hueniverse.com/2010/09/how-to-enter-a-standards-working-group/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Eran Hammer-Lahav</name>
						<uri>http://hueniverse.com</uri>
					</author>
		<title type="html"><![CDATA[All This Twitter OAuth Security Nonsense]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Hueniverse/~3/3fObPZN5EYM/" />
		<id>http://hueniverse.com/?p=1343</id>
		<updated>2010-09-02T22:53:58Z</updated>
		<published>2010-09-02T22:49:13Z</published>
		<category scheme="http://hueniverse.com" term="OAuth" />		<summary type="html"><![CDATA[In a wordy article that could have been much shorter and a lot less sensational, Ryan Paul of ArsTechnica throws mud mostly at Twitter, but saves plenty to throw at OAuth. Unfortunately, Ryan Paul (who clearly is a smart guy) is heavy on the accusation but light on the arguments. Typically, I would go over [...]]]></summary>
		<content type="html" xml:base="http://hueniverse.com/2010/09/all-this-twitter-oauth-security-nonsense/">&lt;p&gt;In a &lt;strong&gt;wordy &lt;/strong&gt;&lt;a href="http://arstechnica.com/security/guides/2010/09/twitter-a-case-study-on-how-to-do-oauth-wrong.ars"&gt;article &lt;/a&gt;that could have been much shorter and a lot less sensational, &lt;a href="http://arstechnica.com/security/guides/2010/09/twitter-a-case-study-on-how-to-do-oauth-wrong.ars"&gt;Ryan Paul of ArsTechnica throws&lt;/a&gt; mud mostly at Twitter, but saves plenty to throw at OAuth. Unfortunately, Ryan Paul (who clearly is a smart guy) is heavy on the accusation but light on the arguments. Typically, I would go over this article an item at a time, but I’m right in the middle of draft 11 of OAuth 2.0 which is a much better use of my time. If you want to read a great rebuttal, &lt;a href="http://benlog.com/articles/2010/09/02/an-unwarranted-bashing-of-twitters-oauth/"&gt;Ben Adida&amp;#8217;s response&lt;/a&gt; (as always) is a great read.&lt;span id="more-1343"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;The OAuth standard has many significant weaknesses and limitations. A number of major Web companies are collaborating through the IETF to devise an update that will fix some of the problems, but it&amp;#8217;s still largely a work in progress. The current version of the standard—OAuth 1.0a—is an inelegant hack that lacks maturity and fails to provide clear guidance on many critical issues that are essential to building a robust authentication system.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;First, the current version of the standard is &lt;a href="http://tools.ietf.org/html/rfc5849"&gt;RFC 5849&lt;/a&gt;. The RFC not only changed a lot of the terminology, highlighted the known security limitations, and has completely new prose, it also explicitly clarified at least one of the author’s issues regarding the handling of timestamps (which most companies don’t even bother to check anyway).&lt;/p&gt;
&lt;p&gt;My favorite silliness from the article, when discussing the lack of specification details about using client secrets in installed applications:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Part of the problem is that the specification doesn&amp;#8217;t provide much guidance about what implementers should do instead, which has forced them to improvise. Facebook and Google Buzz have both come up with reasonable solutions and offer desktop-appropriate OAuth authentication flows that do not require a secret key or require the end user to go through a complicated copy/paste process.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;The specification is very clear (as the article quotes) – don’t use client secrets in installed applications! The reason why the specification doesn’t say much more is because there is no solution. It does not exist for a distributed application unless you issue a different secret to each installation. To say that Facebook and Google came up with reasonable solutions is pure sensationalism. What is their reasonable solution? They don’t use client secrets. In other words, they do exactly what the specification says.&lt;/p&gt;
&lt;p&gt;The article does bring up important points implementers should pay attention to when using OAuth, such as the secrecy of their client credentials, the exact details of their user experience, how they authenticate the user (cookies, etc.), and an overall awareness to phishing. But OAuth, just like other security protocols, is designed to be implemented by security experts. In addition, there are simply no widely available solutions for many of these problems.&lt;/p&gt;
&lt;p&gt;If Twitter uses the client secret in installed application for anything other than gathering statistics, well, they should &lt;strong&gt;reconsider&lt;/strong&gt;. But it’s not like they have other alternative. That’s the only valid “news” the article has to offers.&lt;/p&gt;
&lt;p&gt;It’s easy to&lt;a href="http://hueniverse.com/2010/06/xauth-a-terrible-horrible-no-good-very-bad-idea/"&gt; throw mud without getting dirty with making a fully baked technical argument&lt;/a&gt; – and it makes for a fun read too. But when it comes to a widely deployed security protocol, scoring page views by scaring readers about security is&lt;strong&gt; not fair game&lt;/strong&gt;. It is always valuable to highlight OAuth&amp;#8217;s weakness, but in context, with the right security risk analysis, and with clear comparison to other alternatives.&lt;/p&gt;
&lt;p&gt;I expect more from ArsTechnica.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Hueniverse/~4/3fObPZN5EYM" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://hueniverse.com/2010/09/all-this-twitter-oauth-security-nonsense/#comments" thr:count="8" />
		<link rel="replies" type="application/atom+xml" href="http://hueniverse.com/2010/09/all-this-twitter-oauth-security-nonsense/feed/atom/" thr:count="8" />
		<thr:total>8</thr:total>
	<feedburner:origLink>http://hueniverse.com/2010/09/all-this-twitter-oauth-security-nonsense/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Will Meyer</name>
						<uri>http://www.willmeyer.com/</uri>
					</author>
		<title type="html"><![CDATA[An Introduction to OExchange]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Hueniverse/~3/XKL0mV7WSck/" />
		<id>http://hueniverse.com/?p=1329</id>
		<updated>2010-06-10T06:19:05Z</updated>
		<published>2010-06-10T06:19:05Z</published>
		<category scheme="http://hueniverse.com" term="Discovery" /><category scheme="http://hueniverse.com" term="Guest Writer" /><category scheme="http://hueniverse.com" term="WebFinger" /><category scheme="http://hueniverse.com" term="XRD" /><category scheme="http://hueniverse.com" term="oexchange" />		<summary type="html"><![CDATA[OExchange is a newly-introduced protocol stack that allows users to share URL-based content with any service on the web. It covers posting links to social networks as well as sending content to things like online translation and printing services. The protocol &#8212; driven by the folks at Clearspring (where I work) with the support of [...]]]></summary>
		<content type="html" xml:base="http://hueniverse.com/2010/06/an-introduction-to-oexchange/">&lt;p&gt;&lt;a href="http://hueniverse.com/wp-content/uploads/2010/06/oexchange_128x128.png"&gt;&lt;img class="alignleft size-full wp-image-1338" style="margin: 10px;" title="oexchange_128x128" src="http://hueniverse.com/wp-content/uploads/2010/06/oexchange_128x128.png" alt="" width="128" height="128" /&gt;&lt;/a&gt;&lt;strong&gt;OExchange&lt;/strong&gt; is a &lt;a href="http://techcrunch.com/2010/06/02/oexchange"&gt;newly-introduced&lt;/a&gt; protocol stack that allows users to share URL-based content with any service on the web. It covers posting links to social networks as well as sending content to things like online translation and printing services.&lt;/p&gt;
&lt;p&gt;The protocol &amp;#8212; driven by the folks at &lt;a href="http://www.clearspring.com"&gt;Clearspring&lt;/a&gt; (where I work) with the support of a long list of online services &amp;#8212; builds on several existing open web specifications.  It is backed by an open development &lt;a href="http://groups.google.com/group/oexchange"&gt;list&lt;/a&gt;, &lt;a href="http://www.oexchange.org/tools"&gt;tools&lt;/a&gt; for developers, and lots of additional &lt;a href="http://www.oexchange.org"&gt;resources&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;&lt;span id="more-1329"&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;The Problem&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Lots of services accept URL-based content — social networks, news and bookmarking sites, communication tools, long-tail forums, translation utilities — and more appear every day.  Why do blogs only allow users to share to the top few social networks?  Why can&amp;#8217;t users engage with more personal, relevant, dynamically-discovered options? Why are sharing tools and publishers still &amp;#8220;integrating&amp;#8221; with services individually?&lt;/p&gt;
&lt;p&gt;As I&amp;#8217;ve written &lt;a href="http://www.addthis.com/blog/2010/06/02/the-future-of-open-sharing-is-the-web"&gt;before&lt;/a&gt;, users should be able to send content to any of an unbounded number of services. Sharing features should dynamically adapt to support the communities of interest users actually participate in and the tools they use, whatever platforms they are built on, and whether or not they are well-known. Services should be able to receive content from anywhere, in a common way.  Basic interoperability benefits the web at large &amp;#8212; services, users, and content providers &amp;#8212; and we see a tremendous gap when it comes to simple URL exchange.&lt;/p&gt;
&lt;h3&gt;The Solution&lt;/h3&gt;
&lt;p&gt;A common protocol means more content for services, easier integration for tools, more personalization for users, and more traffic back to publishers.  OExchange defines the technical solution in three areas (take a look at the complete &lt;a href="http://www.oexchange.org/spec/"&gt;spec&lt;/a&gt; for all the gory details).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. A way for services to receive content&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Known as an &amp;#8220;Offer&amp;#8221; in OExchange terminology, this method maps onto the dominant model already deployed widely today.  Specifically, for a service to be able to accept content via OExchange, it exposes an endpoint of the form:&lt;/p&gt;
&lt;pre&gt;http://www.example.com/share.php?url=http://hueniverse.com&lt;/pre&gt;
&lt;p&gt;This endpoint (which can be located at any path) accepts a set of &lt;a href="http://www.oexchange.org/spec/#offer"&gt;standard&lt;/a&gt; arguments. Only one of these arguments, the url, is required.  Anyone can send content to this service by sending the user&amp;#8217;s browser to this endpoint.  The receiving service controls any relevant authentication as well as other aspects of the user experience &amp;#8212; the service is the one that defines what actually happens once the user sends their URL there.&lt;/p&gt;
&lt;p&gt;A common method removes any and all service-specific integration requirements &amp;#8212; all supporting services can accept content in the same way.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. A way for services to make themselves discoverable&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;By building on top of the established &lt;a href="http://hueniverse.com/xrd/"&gt;XRD&lt;/a&gt; and &lt;a href="http://tools.ietf.org/html/draft-hammer-hostmeta-12"&gt;host-meta&lt;/a&gt; specifications, OExchange makes it possible to integrate with services that you, as a content publisher or sharing tool, didn&amp;#8217;t even know about at development time.&lt;/p&gt;
&lt;p&gt;A service defines everything about itself in a structured and machine-readable document format (known as the OExchange &lt;a href="http://www.oexchange.org/spec/#target-xrd"&gt;Target XRD&lt;/a&gt;), and anyone that wants to integrate with it can easily locate this document using established means (such as host-meta references).&lt;/p&gt;
&lt;p&gt;This makes it possible to determine that a service exists, and how to send content to it, dynamically as opposed through manual integration.  The full discovery flow is outlined in the &lt;a href="http://www.oexchange.org/spec/#discovery"&gt;spec&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. A decentralized, user-centric model for expressing preferred services&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We are big believers in the promise of &lt;a href="http://www.abstractioneer.org/2009/04/personal-web-discovery.html"&gt;personal discovery&lt;/a&gt;.  In OExchange, we recommend the use of &lt;a href="http://hueniverse.com/2009/08/introducing-webfinger/"&gt;WebFinger&lt;/a&gt; and, eventually, &lt;a href="http://xrdprovisioning.net/"&gt;XRD Provisioning&lt;/a&gt;, to let a user publish a set of services they actually care about, in the form of service XRD URLs.  The key idea here is that it should be possible to look up the set of link-accepting services (each expressed as machine-readable documents) appropriate for a given user.  Tools can inspect this list and present the right options to the user at runtime.&lt;/p&gt;
&lt;p&gt;Importantly, this list may include services the tool doesn&amp;#8217;t actually know about &amp;#8212; it can use the basic OExchange discovery mechanism to then figure out how to send content to this service.  For example, imagine visiting a blog and being presented with not only the option to share content to the mainstream social networking service on which you have an account, but also the long-tail service no one but you and your 5 friends has heard of.&lt;/p&gt;
&lt;h3&gt;Do we need another protocol?&lt;/h3&gt;
&lt;p&gt;There is quite an open web capability stack available at this point, and OExchange leverages established protocols extensively.  That said, there are a few things missing to accomplish certain domain-specific use-cases.  For example, though there are any number of relatively domain-specific protocols that can be used to send content from one service to another, there are none which can offer a simple interoperability layer without introducing substantial requirements on the implementor.  Its our belief that these requirements can counteract the benefit of the additional content to the service, and hamper adoption.&lt;/p&gt;
&lt;p&gt;For anything that OExchange is newly-defining, it therefore keeps the recommendations as simple as possible, and actually takes pains to map onto predeployed models.  Really, OExchange is as much a packaging of existing protocols into a specific use-case stack as it is a new protocol.&lt;/p&gt;
&lt;h3&gt;What next?&lt;/h3&gt;
&lt;p&gt;The strategy we&amp;#8217;ve taken with the specification is to first codify an existing practice and be compatible with a wide range of existing deployed services, then to add a new service discovery capability on top of that, then to expand from that point into additional protocol actions and modes.  In this vein, along with encouraging adoption and working to support the stack in the products we&amp;#8217;re all building, we&amp;#8217;re now beginning to focus in earnest on the additional capabilities.  One often-cited example is an exchange mode that can take place without popping a new browser window/tab.&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;re interested in getting involved in the development of the spec, please join &lt;a href="http://groups.google.com/group/oexchange"&gt;the discussion&lt;/a&gt;.  If you just want to get going on implementing it, check out the quick start &lt;a href="http://www.oexchange.org/guide"&gt;guide&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We&amp;#8217;re pretty excited about a more interoperable web, thanks for the chance to outline it!&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Hueniverse/~4/XKL0mV7WSck" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://hueniverse.com/2010/06/an-introduction-to-oexchange/#comments" thr:count="1" />
		<link rel="replies" type="application/atom+xml" href="http://hueniverse.com/2010/06/an-introduction-to-oexchange/feed/atom/" thr:count="1" />
		<thr:total>1</thr:total>
	<feedburner:origLink>http://hueniverse.com/2010/06/an-introduction-to-oexchange/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Eran Hammer-Lahav</name>
						<uri>http://hueniverse.com</uri>
					</author>
		<title type="html"><![CDATA[How the Open Community Can Beat Facebook]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Hueniverse/~3/-eX4Be1Fcwc/" />
		<id>http://hueniverse.com/?p=1325</id>
		<updated>2010-06-08T07:38:40Z</updated>
		<published>2010-06-08T07:38:30Z</published>
		<category scheme="http://hueniverse.com" term="Open Web" />		<summary type="html"><![CDATA[Well, the open community can&#8217;t beat Facebook. But companies using open technologies can &#8211; by building better products. Outside the echo chamber of web standards fanatics, the vast majority of web users don&#8217;t care about how the web works. They care about their user experience, where their friends are, and when something goes wrong, protecting [...]]]></summary>
		<content type="html" xml:base="http://hueniverse.com/2010/06/how-the-open-community-can-beat-facebook/">&lt;p&gt;Well, the open community can&amp;#8217;t beat Facebook.&lt;/p&gt;
&lt;p&gt;But companies using open technologies can &amp;#8211; by building better products. Outside the echo chamber of web standards fanatics, the vast majority of web users don&amp;#8217;t care about how the web works. They care about their user experience, where their friends are, and when something goes wrong, protecting their privacy.&lt;/p&gt;
&lt;p&gt;When I read about Google Buzz (and other open-based products), it is repeatedly described as the open alternative to Facebook. Does this information help me (as a consumer) make a better decision about which product to use? No. That&amp;#8217;s like telling the average cell phone buyer that the difference between the iPhone and Android is that the latter uses an open source operating system. When it comes to selling phones, Google relies on their search reputation and brand, not the openness of their platform.&lt;br /&gt;
&lt;span id="more-1325"&gt;&lt;/span&gt;&lt;br /&gt;
Getting consumers to use your products, like any other retail interaction, requires offering something useful that is better than other alternatives. It is true that sometimes a backlash against one company leads consumers to switch to someone else, but they don&amp;#8217;t &amp;#8220;vote for the new guy&amp;#8221;, they &amp;#8220;vote out the old guy&amp;#8221;. If users leave Facebook to use Google, it is not a victory for Google &amp;#8211; it is a loss for Facebook.&lt;/p&gt;
&lt;p&gt;When it comes to showing the value in open technology, very few efforts can show how being open makes products better. Even if OpenID solved all its problems, &lt;a href="http://hueniverse.com/2010/06/xauth-a-terrible-horrible-no-good-very-bad-idea/"&gt;found a less offensive solution to the NASCAR problem&lt;/a&gt;, got providers certified and trusted, provided a legal framework for managing liability, educated consumers, and actually worked, it will still fail without the wealth of data offered by Facebook.&lt;/p&gt;
&lt;p&gt;Why should publishers (content and service providers) choose a solution that doesn&amp;#8217;t deliver actual consumer value?&lt;/p&gt;
&lt;p&gt;In an attempt to address this, the OpenID community has been looking for ways to compete with Facebook. The OpenID/OAuth Hybrid proposal was one approach. Adding rich profile data was another (in the &lt;a href="http://factoryjoe.com/blog/2010/01/04/openid-connect/"&gt;conceptual proposal for OpenID Connect&lt;/a&gt;). But these are all focused on enabling technologies, not products. Even if there was a complete open solution for every Facebook feature, it would still not offer a compelling value proposition because without actual data behind it, it is nothing but empty containers.&lt;/p&gt;
&lt;p&gt;If Facebook asked me, I would recommend using open technologies because it is good for business (when available and applicable). But to everyone else I would recommend focusing more on the product and less about the openness of the platform. Open is certainly a selling point in the enterprise market, but it is not in the consumer market.&lt;/p&gt;
&lt;p&gt;Two years ago the big fight was against the &amp;#8220;walled-gardens&amp;#8221; and user data, now it is about open standards. It didn&amp;#8217;t make a difference back then (users didn&amp;#8217;t care) and it won&amp;#8217;t make one now. Facebook didn&amp;#8217;t change their data policies because of what users wanted &amp;#8211; they changed it because of what publishers demanded, and the publishers asked for data, in whatever shape or form Facebook wanted to give it.&lt;/p&gt;
&lt;p&gt;The reason why the &lt;a href="http://openidconnect.com/"&gt;newly proposed OpenID Connect protocol&lt;/a&gt; is actually promising is that it focuses on mobility instead of federation. Instead of trying to build a fully distributed and federated identity framework, the proposal uses &lt;a href="http://hueniverse.com/2010/05/introducing-oauth-2-0/"&gt;OAuth 2.0&lt;/a&gt; to build vendor-specific identity solutions that are all implemented the same way. By allowing publishers to move from one compliant vendor to another, it lays the groundwork for future federation and distribution.&lt;/p&gt;
&lt;p&gt;In other words, the fact that it doesn&amp;#8217;t embrace discovery at its core, but starts with reliance on client registration and vendor specific relationship is an assets because it guarantees better products with built-in mobility. That mobility will allow publishers to take their business elsewhere if they don&amp;#8217;t get the data and services they want.&lt;/p&gt;
&lt;p&gt;Good technology enables better products. Being open is just the cherry-on-top.&lt;/p&gt;
&lt;p&gt;Then of course, there is the other option: &lt;a href="http://hueniverse.com/2010/05/open-vs-fast-good-vs-evil-google-vs-facebook/"&gt;if you can&amp;#8217;t beat them, join them&lt;/a&gt;.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Hueniverse/~4/-eX4Be1Fcwc" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://hueniverse.com/2010/06/how-the-open-community-can-beat-facebook/#comments" thr:count="4" />
		<link rel="replies" type="application/atom+xml" href="http://hueniverse.com/2010/06/how-the-open-community-can-beat-facebook/feed/atom/" thr:count="4" />
		<thr:total>4</thr:total>
	<feedburner:origLink>http://hueniverse.com/2010/06/how-the-open-community-can-beat-facebook/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Eran Hammer-Lahav</name>
						<uri>http://hueniverse.com</uri>
					</author>
		<title type="html"><![CDATA[XAuth &#8211; a Terrible, Horrible, No Good, Very Bad Idea]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Hueniverse/~3/jnWH4kwFr3c/" />
		<id>http://hueniverse.com/?p=1318</id>
		<updated>2010-06-08T05:27:42Z</updated>
		<published>2010-06-06T06:31:12Z</published>
		<category scheme="http://hueniverse.com" term="Open Web" /><category scheme="http://hueniverse.com" term="OpenID" /><category scheme="http://hueniverse.com" term="Social Web" />		<summary type="html"><![CDATA[A few weeks ago, a handful of web companies lead by Meebo and Google (with moral support from Yahoo!) announced their support for a new protocol called XAuth. The idea is very simple and seemingly appealing &#8211; create a sort of shared-cookie service for sites to use to store and find which identity providers a [...]]]></summary>
		<content type="html" xml:base="http://hueniverse.com/2010/06/xauth-a-terrible-horrible-no-good-very-bad-idea/">&lt;p&gt;&lt;a href="http://hueniverse.com/wp-content/uploads/2010/06/xauth.png"&gt;&lt;img class="alignright size-full wp-image-1320" title="xauth" src="http://hueniverse.com/wp-content/uploads/2010/06/xauth.png" alt="" width="188" height="306" /&gt;&lt;/a&gt;A few weeks ago, a handful of web companies lead by Meebo and Google (with moral support from Yahoo!) &lt;a href="http://googlesocialweb.blogspot.com/2010/04/simplifying-social-web-with-xauth.html"&gt;announced their support&lt;/a&gt; for a new protocol called &lt;a href="http://xauth.org/info/"&gt;XAuth&lt;/a&gt;. The idea is very simple and seemingly appealing &amp;#8211; create a sort of shared-cookie service for sites to use to store and find which identity providers a user prefers, solving the &lt;a href="http://factoryjoe.com/blog/2009/04/06/does-openid-need-to-be-hard/"&gt;OpenID NASCAR problem&lt;/a&gt;. It is a similar idea to existing commercial products such as &lt;a href="http://www.janrain.com/products/rpx"&gt;JanRain&amp;#8217;s RPX&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve heard about this proposal a few months ago and have been rolling my eyes ever since. Why? Because this is &amp;#8211; to borrow from one of my son&amp;#8217;s &lt;a href="http://www.amazon.com/Alexander-Terrible-Horrible-Good-Very/dp/0689300727"&gt;favorite book&lt;/a&gt; &amp;#8211; &lt;strong&gt;a terrible, horrible, no good, very bad idea&lt;/strong&gt;. It is a dangerous and over simplified hack aimed at solving a complex problem &amp;#8211; how to manage online identities and improve the usability of distributed identity providers.&lt;br /&gt;
&lt;span id="more-1318"&gt;&lt;/span&gt;&lt;br /&gt;
The &lt;a href="http://xauth.org/spec/"&gt;XAuth proposal&lt;/a&gt; is a privacy and security nightmare. It relies on the use of a single, shared domain name which is currently &lt;a href="http://www.networksolutions.com/whois-search/xauth.org"&gt;under the control of one company &amp;#8211; Meebo&lt;/a&gt;. While I have nothing against Meebo, other than proposing and promoting this, I certainly don&amp;#8217;t trust it to manage the web&amp;#8217;s identity preference layer. I heard suggestions of handing control over to the OpenID Foundation, but I don&amp;#8217;t trust it either. If it is controlled by a single entity, it fails the most basic test of distributed identity services.&lt;/p&gt;
&lt;p&gt;In addition, XAuth is a cookie-like mechanism that suffers from all the same problems, and as such, is an easy target for abuse and manipulation. And guess what &amp;#8211; it is an &lt;a href="http://xauth.org/"&gt;opt-out mechanism&lt;/a&gt; per browser.&lt;/p&gt;
&lt;p&gt;This is a misguided attempt to solve a problem browser vendors have failed to address. It is true that getting browser vendors to care about identity and innovate in the space is a huge challenge, but solving it with a server-hosted, centralized solution goes against everything the distributed identity movement has tried to accomplish over the past few years.&lt;/p&gt;
&lt;p&gt;As for the name, I resent the association between XAuth and the OAuth brand, using a cloned logo and a very confusing name. This is especially true considering it has nothing to do with OAuth, and everything to do with OpenID. And by the way, the name is &lt;a href="http://en.wikipedia.org/wiki/X_Window_authorization"&gt;already taken&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.amazon.com/Alexander-Terrible-Horrible-Good-Very/dp/0689300727"&gt;I think I&amp;#8217;ll move to Australia.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: This post &lt;a href="http://www.abstractioneer.org/2010/06/xauth-is-lot-like-democracy.html"&gt;sparked a response&lt;/a&gt; from Google&amp;#8217;s John Panzer (someone I highly respect, and respectfully disagree with) as well as an &lt;a href="http://lists.openid.net/pipermail/openid-specs/2010-June/thread.html"&gt;interesting thread on the OpenID list&lt;/a&gt;. A couple quotes I complete agree with:&lt;/p&gt;
&lt;p&gt;From &lt;a href="http://lists.openid.net/pipermail/openid-specs/2010-June/007166.html"&gt;Peter Watkins&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;The current XAuth implementation has sites using IFRAME elements to access the XAuth service/JS code. Web browsers send Referer headers with IFRAME, so whoever runs xauth.org is in a position to see information about what Extender and Receiver sites a user accesses. Currently auth.org has pretty good settings &amp;#8212; cache control headers telling browsers they can cache the page for a week. But that could change. Move responsibility into the browser and that problem is solved.&lt;/p&gt;
&lt;p&gt;Also, xauth.org could start delivering JS code that reports information to the xauth.org mothership in addition to simply &amp;#8220;working&amp;#8221;. Say the local government tries to compel xauth.org to deliver additional code to specific IP addresses (not that Google has *ever* had any trouble with any government legal pressure, right?). xauth.org could deliver pristine, trustworthy JS to everyone else. How would the government targets, let&amp;#8217;s say political activists maybe, be able to tell their privacy was being subverted? Move the function to the browser and that hole is closed.&lt;/p&gt;
&lt;p&gt;This is by no means a comprehensive list (shoot, it&amp;#8217;s been less than 24 hours since I startd reading up on XAuth), but I think it&amp;#8217;s enough that you can&amp;#8217;t say there are no privacy issues that going to an in-browser model would solve no privacy issues.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;From &lt;a href="http://lists.openid.net/pipermail/openid-specs/2010-June/007169.html"&gt;Philip Hallam-Baker&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;As often happens in these debates, we have a proposal that has an acknowledged issue that we are being told isn&amp;#8217;t an issue because the developers don&amp;#8217;t see it as an issue.&lt;/p&gt;
&lt;p&gt;I really take offense when I raise an issue and someone says &amp;#8216;that does not matter to anyone&amp;#8217; or &amp;#8216;that issue has been dealt with&amp;#8217;. The one issue that I have never found it difficult to get the industry to agree on is the necessity of ensuring that no party gains a proprietary leverage in a communication protocol.&lt;/p&gt;
&lt;p&gt;I don&amp;#8217;t see how the promise that the issue will be fixed in future changes anything. Either the centralization is easy to eliminate from the protocol or it isn&amp;#8217;t. And if it is easy to eliminate then why introduce it in the first place?&lt;/p&gt;
&lt;p&gt;The starting point for identity in my view is that I have to entirely own my name. There cannot be any entity that can use the investment I make in my name to extract rent at a future date. No corporation, no not-for-profit, no non-profit, no industry group. Nothing.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;(Image adapted from the book &amp;#8220;Alexander and the Terrible, Horrible, No Good, Very Bad Day&amp;#8221; by Judith Viorst, illustrated by Ray Cruz.)&lt;/em&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Hueniverse/~4/jnWH4kwFr3c" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://hueniverse.com/2010/06/xauth-a-terrible-horrible-no-good-very-bad-idea/#comments" thr:count="20" />
		<link rel="replies" type="application/atom+xml" href="http://hueniverse.com/2010/06/xauth-a-terrible-horrible-no-good-very-bad-idea/feed/atom/" thr:count="20" />
		<thr:total>20</thr:total>
	<feedburner:origLink>http://hueniverse.com/2010/06/xauth-a-terrible-horrible-no-good-very-bad-idea/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Eran Hammer-Lahav</name>
						<uri>http://hueniverse.com</uri>
					</author>
		<title type="html"><![CDATA[Open vs. Fast, Good vs. Evil, Google vs. Facebook]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Hueniverse/~3/mYJCnph-jsU/" />
		<id>http://hueniverse.com/?p=1315</id>
		<updated>2010-05-28T18:34:02Z</updated>
		<published>2010-05-28T18:34:02Z</published>
		<category scheme="http://hueniverse.com" term="Open Web" /><category scheme="http://hueniverse.com" term="Social Web" />		<summary type="html"><![CDATA[The landscape of the community-engineered social web, the one based on open technologies, has changed dramatically over the past few months. If you took a year off and just came back, you would probably not recognize it at all. The movement that started with protocols such as OpenID, OAuth, and Activity Streams, is now mostly [...]]]></summary>
		<content type="html" xml:base="http://hueniverse.com/2010/05/open-vs-fast-good-vs-evil-google-vs-facebook/">&lt;p&gt;The landscape of the community-engineered social web, the one based on open technologies, has changed dramatically over the past few months. If you took a year off and just came back, you would probably not recognize it at all.&lt;/p&gt;
&lt;p&gt;The movement that started with protocols such as OpenID, OAuth, and Activity Streams, is now mostly gone. All the cool kids got grownup jobs and the market is back again driven by a small number of corporations. In fact, it is so small it can be counted on two fingers. A year ago, a meeting with Chris Messina, David Recordon, Joseph Smarr, Monica Keller, Will Norris, Luke Shepard, and John Panzer represented 7 different organizations or communities &amp;#8211; a well-balanced mix of big and small, corporate and independent.&lt;/p&gt;
&lt;p&gt;Today it&amp;#8217;s just Facebook and Google and that has significant implications. But when examining how these two companies engage in the development of open technologies, the findings are quite surprising. On the product side, Google is famous for their openness while Facebook is notorious for their closed garden. But when it comes to their community engagement, these two giants behave in a rather reverse fashion.&lt;br /&gt;
&lt;span id="more-1315"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;strong&gt;Open technology is slow by definition&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;That&amp;#8217;s assuming you accept my definition of Open Technology:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;span&gt;Developed in the open with full transparency&lt;br /&gt;
Open process for anyone to participate freely&lt;br /&gt;
Everyone is free to implement&lt;br /&gt;
Decisions are made based on technical merit&lt;br /&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Open technology doesn&amp;#8217;t have to happen in a standards body or format open source organization, but important work usually does; because if it&amp;#8217;s important, there are simply too many people collaborating to be successful without a well-defined process and governance. Successful open technology acts very much like a proprietary one &amp;#8211; they both tend to block or delay new innovation. As soon as something becomes successful, it poses high risk to those absent from the process.&lt;/p&gt;
&lt;p&gt;OAuth 1.0 created a myth that it is possible to develop open technology fast. But in reality, &lt;a href="http://hueniverse.com/oauth/guide/history/"&gt;OAuth 1.0 took a little over a year&lt;/a&gt;, and that&amp;#8217;s with a tiny, well-aligned group of people almost exclusively from one town, with very little at stake. The numbers are even less impressive if you include getting to revision A as part of the 1.0 lifecycle.&lt;/p&gt;
&lt;p&gt;OpenID had a very similar experience where version 1.0 (really 1.1) took little time (mostly created by two people) while version 2.0 took a very long time. Deciding what the next version of OpenID looks like seems to take even longer.&lt;/p&gt;
&lt;p&gt;Two years ago I was one of the leaders of this movement. It was the main driving force behind creating the &lt;a href="http://hueniverse.com/2009/03/explaining-the-open-web-foundation-why-a-new-process/"&gt;Open Web Foundation&lt;/a&gt; (i.e. a &lt;a href="http://hueniverse.com/2009/03/explaining-the-open-web-foundation-new-kind-of-legal-framework/"&gt;lightweight legal framework&lt;/a&gt; suited for small, community driven projects). The problem with this approach is that it ignores why and how companies develop open technology, and the real reasons why it takes time.&lt;/p&gt;
&lt;p&gt;People new to standards like to accuse the excessive process and legal framework for the time it takes to produce a standard. But this argument is simply not grounded in reality. For example, XRD 1.0 which is quickly becoming one of the building blocks of the social web took over 2 years to mature from XRDS through XRDS-Simple to XRD. During those 2 plus years, the OASIS process (where the work was done) did not slow us down by more than a week or two. What slowed XRD&amp;#8217;s development was lack of feedback, review, and editorial time. But even these factors were not the primary reason.&lt;/p&gt;
&lt;p&gt;There are two reasons why specifications take time: building consensus and reaching maturity. Consensus time is usually a function of the group size. The bigger the group the longer it takes. Maturity however, is a function of taking intentional breaks during the process to let the technology sink in, and allow time for experimentation. Maturity is what differentiates a useful technology from an essential one.&lt;/p&gt;
&lt;p&gt;If I listened to the many calls to get XRDS-Simple done two years ago because people wanted to ship stuff &amp;#8220;&lt;strong&gt;now&lt;/strong&gt;&amp;#8220;, we would have ended with broken discovery architecture and a complex format that no one really needed. On occasion, these demands for finalizing specifications took the form of subtle threats to develop competing proposals. Getting the right people to read specifications takes time, and it often means waiting for the use cases to catch up with the vision.&lt;/p&gt;
&lt;p&gt;If you compare the &lt;a href="http://hueniverse.com/2009/11/host-meta-aka-site-meta-and-well-known-uris/"&gt;initial proposal of site-meta&lt;/a&gt; with the final &lt;a href="http://hueniverse.com/2010/04/rfc-5785-defining-well-known-uris/"&gt;RFC for Well-Known URIs&lt;/a&gt;, you immediately notice a remarkable transformation which was the result of a yearlong discussion and collaboration across three standards bodies. My discovery work follows the same pattern, from the initial OAuth Discovery work to the current, much simplified host-meta proposal (and the retirement of the LRDD stand-alone specification).&lt;/p&gt;
&lt;p&gt;Like anything else, early adopters have to accommodate this reality, and it can often lead to frustration. The Open Web Foundation is one example for how this frustration with standards bodies materialized into an (&lt;a href="http://hueniverse.com/2009/12/whats-in-a-name-that-which-we-call-the-open-web-foundation/"&gt;unsuccessful&lt;/a&gt;) attempt to create a whole new framework. While the foundation was very successful in creating a useful legal license, it was not significant enough to get new technology out faster. Ironically, it made it much easier for companies to develop new technologies internally, the open them up when done.&lt;/p&gt;
&lt;p&gt;In order to understand the forces that drive the development of open technologies, we must first examine how companies address these issues. There are generally three categories of companies when it comes to interaction with open technology: &lt;em&gt;&lt;strong&gt;conservative, agile, and delayed-open&lt;/strong&gt;&lt;/em&gt;. It is important to understand that these categories are specific to how companies interact with open technology, and are not an indication of how the interact in the marketplace.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Traditional &lt;/strong&gt;&lt;/em&gt;companies are rarely first to adopt new technology, wait for final versions before implementing, and actively participates only when a specification takes a wrong turn. They are usually absent from the process or lurk around, but engage with some form of indirect support (such as sponsoring events or supporting the community). Traditional companies tend to focus on building business relationships with other similar companies and establish back-channel alignment, which enables them to let others represent their interests.  Yahoo! and Twitter are good examples of traditional companies.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Agile &lt;/strong&gt;&lt;/em&gt;companies live on the cutting edge, deploying early drafts and are not afraid to change quickly. They are usually very hands on, often leading the development efforts, and maintain some level of control over the process, which helps reduce risk by having better understanding of the proposal&amp;#8217;s stability. Agile companies are usually very small where being agile provides a necessary edge, or very big where they can afford to take more risk and experiment because of their market dominance. Facebook and (the now defunct) Pownce are good examples of agile companies.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Delayed-open&lt;/strong&gt;&lt;/em&gt; companies are very selective in what they choose to participate in, and are rarely involved in efforts they do not control. The basic strategy of delayed-open companies is to develop as much as possible internally and confidentially. They only share their work when they are ready to ship a product or when they are confident in the stability of the technology. While these technologies end up being open (typically by opening their development to final enhancements, or by contributing them to a standards body), by the time they are opened up, very little can really change. Google and Microsoft are good examples of delayed-open companies.&lt;/p&gt;
&lt;p&gt;Companies looking to engage in the development and utilization of open technologies must find the right balance that fits their culture and market needs. Google and Facebook provide important case studies on how companies approach open technology from opposite ends of a given market. When it comes to social web applications, Facebook is the undisputed market leader, while Google is one of the (hardest trying but) least successful players.&lt;/p&gt;
&lt;p&gt;Both companies recently made high profile hiring moves, grabbing every free-agent open technologist in the space. Facebook hired David Recordon and Monica Keller (joining Luke Shepard and others), while Google hired Chris Messina, Joseph Smarr, and Willl Noris (joining John Panzer, Brad Fitzpatrick, and others). But their reasons for doing so are fundamentally different, dictated by their involvement category.&lt;/p&gt;
&lt;p&gt;Facebook, with time on their side, hired people to help open up their technology and use their market dominance to influence and lead new efforts. Their position allowed them to deploy an early draft of OAuth 2.0 in a highly publicized fashion, and to promise keeping their production code up to date as the specification matures. To accomplish that, their engineers engaged early and intensely, contributing the first draft and running code. The more Facebook invests in open technologies, the longer it takes these technologies to mature (due to their sudden importance and popularity), but with a higher likelihood of maturity.&lt;/p&gt;
&lt;p&gt;Google on the other hand, hired top caliber talent for very different reasons. Google is significantly behind Facebook and cannot afford to take years (or even months) for new technologies to mature. They need to build products and ship them quickly, and that requires much more control than is available in open development. By hiring highly respected individuals like Chris Messina and Joseph Smarr, Google is hoping to get away with doing more work delayed-open. Salmon, PubSubHubbub, WRAP, and their OpenID extensions are all examples of past technologies developed successfully using this method.&lt;/p&gt;
&lt;p&gt;While Facebook shipped an early draft of OAuth 2.0, Google shipped WRAP. Both promised to ship the final OAuth 2.0 protocol.&lt;/p&gt;
&lt;p&gt;It is hard to say which category ends up making the biggest contribution to the development of open technologies. Google is clearly a leader in adopting open technology in general, but the way in which they get comfortable doing so isn’t always the most open or polite. Google&amp;#8217;s style helps get more free technology faster, but it also makes is much harder for other companies to participate when the foundation is established. Google is leading an Open war, and in war, there are often innocent casualties.&lt;/p&gt;
&lt;p&gt;There is a direct correlation between a company&amp;#8217;s ability to control the process and their embrace of the technology. Facebook came in late to the WRAP party, leading them to favor the (at the time) less prominent and less successful OAuth 2.0 effort at the IETF (while Google did their very best to derail the IETF effort). In the same spirit, Google&amp;#8217;s bear hug of HTML5 came only after they guaranteed their strong control over the process by hiring the specification editor (for the sole purpose of getting HTML5 done fast).&lt;/p&gt;
&lt;p&gt;The manifestation of these two approaches is sometimes ironic. Facebook who is not known for their embrace of open protocols and technology, is the one enabling open communities to take their time and spend a little longer to get the details right. On the other hand, Google who is considered the biggest champion of openness is doing their best to push efforts to a quick conclusion, strongly aligned with their immediate needs.&lt;/p&gt;
&lt;p&gt;While this analysis includes a slight bias in favor of the contribution of agile companies, delayed-open companies play an important role in creating alternatives, not possible by purely open means alone. Facebook only turned the page and joined the open community when it felt the open community no longer posed a threat to their dominance, and their behavior depends greatly on the individuals leading the effort. The Facebook influence at the hands of David Recordon (who at this point is by far the most influential voice in advocating open technologies) is an extremely constructive force. However, it is clear that without Google chasing their tail and portraying them as closed, Facebook will be much less motivated to open up.&lt;/p&gt;
&lt;p&gt;It is also important to remember the significant contribution of traditional companies. They provide the final seal of approval for new technologies and are the key to mass adoption. They are also critical in getting enough community sponsorship to allow work to continue.&lt;/p&gt;
&lt;p&gt;At the end we rely on a few individuals to do the right thing. On the Google side, we rely on people like Chris Messina and Joseph Smarr to know where to draw the line between delayed-open and fully-open. Because delayed-open leave very little for the community at large to influence, they must find the right balance between pragmatic time-to-market and forcing their own ideas on the rest of us. When Chris and Joseph joined Google, I &lt;a href="http://www.readwriteweb.com/archives/how_chris_messina_got_a_job_at_google.php"&gt;predicted exactly this kind of shift&lt;/a&gt;. I have confidence that their work will continue to be innovative and inspiring, but the silence and disengagement coming from the Google team over the past six months is a real cause for concern.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Hueniverse/~4/mYJCnph-jsU" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://hueniverse.com/2010/05/open-vs-fast-good-vs-evil-google-vs-facebook/#comments" thr:count="6" />
		<link rel="replies" type="application/atom+xml" href="http://hueniverse.com/2010/05/open-vs-fast-good-vs-evil-google-vs-facebook/feed/atom/" thr:count="6" />
		<thr:total>6</thr:total>
	<feedburner:origLink>http://hueniverse.com/2010/05/open-vs-fast-good-vs-evil-google-vs-facebook/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Eran Hammer-Lahav</name>
						<uri>http://hueniverse.com</uri>
					</author>
		<title type="html"><![CDATA[Introducing OAuth 2.0]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Hueniverse/~3/tcIZROyNnNs/" />
		<id>http://hueniverse.com/?p=1303</id>
		<updated>2010-05-15T07:13:43Z</updated>
		<published>2010-05-15T07:06:38Z</published>
		<category scheme="http://hueniverse.com" term="OAuth" />		<summary type="html"><![CDATA[Two weeks ago, the IETF OAuth Working Group published the first draft of the OAuth 2.0 protocol. OAuth is a security protocol that enables users to grant third-party access to their web resources without sharing their passwords. OAuth 1.0 was published in December 2007 and quickly become the industry standard for web-based access delegation. A [...]]]></summary>
		<content type="html" xml:base="http://hueniverse.com/2010/05/introducing-oauth-2-0/">&lt;p&gt;&lt;a href="http://hueniverse.com/wp-content/uploads/2010/05/OAuth2.png"&gt;&lt;img class="size-full wp-image-1305 alignright" style="margin: 10px;" title="OAuth2" src="http://hueniverse.com/wp-content/uploads/2010/05/OAuth2.png" alt="" width="223" height="223" /&gt;&lt;/a&gt;Two weeks ago, the &lt;a href="http://tools.ietf.org/wg/oauth/"&gt;IETF OAuth Working Group&lt;/a&gt; published the first draft of the &lt;a href="http://tools.ietf.org/html/draft-ietf-oauth-v2"&gt;OAuth 2.0 protocol&lt;/a&gt;. OAuth is a security protocol that enables users to grant third-party access to their web resources without sharing their passwords. &lt;a href="http://oauth.net/core/1.0"&gt;OAuth 1.0&lt;/a&gt; was published in December 2007 and quickly become the industry standard for web-based access delegation. A minor revision (&lt;a href="http://oauth.net/core/1.0a"&gt;OAuth 1.0 Revision A&lt;/a&gt;) was published in June 2008 to fix a security hole. In April 2010, OAuth 1.0 was published as &lt;a href="http://tools.ietf.org/html/rfc5849"&gt;RFC 5849&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;OAuth 2.0 is a completely new protocol&lt;/strong&gt; and is not backwards compatible with previous versions. However, it retains the overall architecture and approach established by the previous versions, and the same introduction (from the Official Guide to OAuth 1.0) still very much applies.&lt;span id="more-1303"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Many luxury cars come with a valet key. It is a special key you give the parking attendant and unlike your regular key, will only allow the car to be driven a short distance while blocking access to the trunk and the onboard cell phone. Regardless of the restrictions the valet key imposes, the idea is very clever. You give someone limited access to your car with a special key, while using another key to unlock everything else.&lt;/p&gt;
&lt;p&gt;As the web grows, more and more sites rely on distributed services and cloud computing: a photo lab printing your Flickr photos, a social network using your Google address book to look for friends, or a third-party application utilizing APIs from multiple services.&lt;/p&gt;
&lt;p&gt;The problem is, in order for these applications to access user data on other sites, they ask for usernames and passwords. Not only does this require exposing user passwords to someone else – often the same passwords used for online banking and other sites – it also provide these application unlimited access to do as they wish. They can do anything, including changing the passwords and lock users out.&lt;/p&gt;
&lt;p&gt;OAuth provides a method for users to grant third-party access to their resources without sharing their passwords. It also provides a way to grant limited access (in scope, duration, etc.).&lt;/p&gt;
&lt;p&gt;For example, a web user (resource owner) can grant a printing service (client) access to her private photos stored at a photo sharing service (server), without sharing her username and password with the printing service.  Instead, she authenticates directly with the photo sharing service which issues the printing service delegation-specific credentials.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;The &lt;a href="http://tools.ietf.org/html/draft-ietf-oauth-v2"&gt;new draft&lt;/a&gt; represents a yearlong &lt;a href="http://www.ietf.org/mail-archive/web/oauth/current/maillist.html"&gt;discussion&lt;/a&gt; around &lt;a href="http://hueniverse.com/2009/11/planning-for-oauth-2-0/"&gt;goals and requirements&lt;/a&gt; for the protocol with participants from a wide range of companies including Yahoo!, Facebook, Salesforce, Microsoft, Twitter, Deutsche Telekom, Intuit, Mozilla, and Google. OAuth has long been the poster-child of rapid open technology adoption, and 2.0 is no exception &amp;#8211; Facebook and Twitter already announced support even before the first draft was officially published.&lt;/p&gt;
&lt;h3&gt;Why a New Version?&lt;/h3&gt;
&lt;p&gt;OAuth 1.0 was largely based on two existing proprietary protocols: Flickr&amp;#8217;s API Auth and Google&amp;#8217;s AuthSub. The result represented the best solution based on actual implementation experience. With over 3 years of experience working with the protocol, the community learned enough to rethink and improve the protocol in three main areas where OAuth 1.0 proved limited or confusing:&lt;/p&gt;
&lt;h4&gt;Authentication and Signatures&lt;/h4&gt;
&lt;p&gt;The majority of failed OAuth 1.0 implementation attempts are caused by the complexity of the cryptographic requirements of the specification. The fact that the original specification was poorly written didn’t help, but even with the newly published &lt;a href="http://tools.ietf.org/html/rfc5849"&gt;RFC 5849&lt;/a&gt;, OAuth 1.0 is still not trivial to use on the client side. The convenient and ease offered by simply using passwords is sorely missing in OAuth.&lt;/p&gt;
&lt;p&gt;For example, developers can quickly write Twitter scripts to do useful things by using their username and password. With the move to OAuth, these developers are now forced to find, install, and configure libraries in order to accomplish what was before possible with a single line of &lt;a href="http://curl.haxx.se/"&gt;cURL&lt;/a&gt; script.&lt;/p&gt;
&lt;h4&gt;User Experience and Alternative Token Issuance Options&lt;/h4&gt;
&lt;p&gt;OAuth includes two main parts: obtaining a token by asking the user to grant access, and using tokens to access protected resources. The methods for obtaining an access token are called &lt;strong&gt;flows&lt;/strong&gt;. OAuth 1.0 started out with 3 flows: web-based applications, desktop clients, and mobile or limited devices. However, as the specification evolved, the three flows were merged into one which (on paper) enabled all three client types. In practice, the flow works fine for web-based applications but provides an inferior experience elsewhere.&lt;/p&gt;
&lt;p&gt;As more sites started using OAuth, especially Twitter, developers realized that the single flow offered by OAuth was &lt;a href="http://hueniverse.com/2009/02/beyond-the-oauth-web-redirection-flow/"&gt;very limited and often produced poor user experiences&lt;/a&gt;. On the other hand, Facebook Connect offered a richer set of flows suitable for web applications, mobile devices, and game consoles.&lt;/p&gt;
&lt;h4&gt;Performance at Scale&lt;/h4&gt;
&lt;p&gt;As large providers started using OAuth, the community realized that the protocol does not scale well. It requires state management across different steps, temporary credentials which are more often than not discarded unused, and typically requires issuing long lasting credentials which are less secure and harder to manage (and synchronize across data centers).&lt;/p&gt;
&lt;p&gt;In addition, OAuth 1.0 requires that the protected resources endpoints have access to the client credentials in order to validate the request. This breaks the typical architecture of most large providers in which a centralized authorization server is used for issuing credentials, and a separate server is used for API calls. OAuth 1.0 requires the use of both set of credentials: the client credentials and the token credentials which makes this separation very hard.&lt;/p&gt;
&lt;h3&gt;So What&amp;#8217;s New?&lt;/h3&gt;
&lt;p&gt;The following is a subset of the new features available in OAuth 2.0:&lt;/p&gt;
&lt;h4&gt;6 New Flows&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;User-Agent Flow&lt;/strong&gt; &amp;#8211; for clients running inside a user-agent (typically a web browser).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Web Server Flow&lt;/strong&gt; &amp;#8211; for clients that are part of a web server application, accessible via HTTP requests. This is a simpler version of the flow provided by OAuth 1.0.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Device Flow&lt;/strong&gt; &amp;#8211; suitable for clients executing on limited devices, but where the end-user has separate access to a browser on another computer or device.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Username and Password Flow&lt;/strong&gt; &amp;#8211; used in cases where the user trusts the client to handle its credentials but it is still undesirable for the client to store the user&amp;#8217;s username and password.  This flow is only suitable when there is a high degree of trust between the user and the client.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Client Credentials Flow&lt;/strong&gt; &amp;#8211; the client uses its credentials to obtain an access token. This flow supports what is known as the 2-legged scenario.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Assertion Flow&lt;/strong&gt; &amp;#8211; the client presents an assertion such as a SAML assertion to the authorization server in exchange for an access token.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Native application support (applications running on a desktop or mobile device) can be implemented using many of the flows above.&lt;/p&gt;
&lt;h4&gt;Bearer tokens&lt;/h4&gt;
&lt;p&gt;OAuth 2.0 provides a cryptography-free option for authentication which is based on existing cookie authentication architecture. Instead of sending signed requests using HMAC and token secrets, the token itself is used as a secret sent over HTTPS. This allows making API calls using cURL and other simple scripting tools without having to canonicalize the request and sign it.&lt;/p&gt;
&lt;h4&gt;Simplified signatures&lt;/h4&gt;
&lt;p&gt;Signature support has been significantly simplified to remove the need for special parsing, encoding, and sorting of parameters. It also uses a single secret instead of two.&lt;/p&gt;
&lt;h4&gt;Short-lived tokens with Long-lived authorizations&lt;/h4&gt;
&lt;p&gt;Instead of issuing a long lasting token (typically good for a year or unlimited lifetime), the server can issues a short-lived access token and a long lived refresh token. This allows clienta to obtain a new access token without having to involve the user again, but keeps access tokens limited. This feature was adopted from Yahoo!’s BBAuth protocol and later its OAuth 1.0 Session Extension.&lt;/p&gt;
&lt;h4&gt;Separation of Roles&lt;/h4&gt;
&lt;p&gt;OAuth 2.0 separates the role of the authorization server responsible for obtaining user authorization and issuing tokens from that of the resource server handling API calls.&lt;/p&gt;
&lt;h3&gt;When is it coming out?&lt;/h3&gt;
&lt;p&gt;OAuth 2.0 is currently in development by the &lt;a href="http://tools.ietf.org/wg/oauth/"&gt;IETF OAuth Working Group&lt;/a&gt;. The &lt;a href="http://tools.ietf.org/html/draft-ietf-oauth-v2"&gt;latest draft&lt;/a&gt; is considered stable but with many features being changed or added. Partial support is already available from Facebook and Twitter. The final specification is expected by the end of the year.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Hueniverse/~4/tcIZROyNnNs" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://hueniverse.com/2010/05/introducing-oauth-2-0/#comments" thr:count="30" />
		<link rel="replies" type="application/atom+xml" href="http://hueniverse.com/2010/05/introducing-oauth-2-0/feed/atom/" thr:count="30" />
		<thr:total>30</thr:total>
	<feedburner:origLink>http://hueniverse.com/2010/05/introducing-oauth-2-0/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Eran Hammer-Lahav</name>
						<uri>http://hueniverse.com</uri>
					</author>
		<title type="html"><![CDATA[JRD, the Other Resource Descriptor]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Hueniverse/~3/byLljp_5Qis/" />
		<id>http://hueniverse.com/?p=1282</id>
		<updated>2010-05-24T23:21:54Z</updated>
		<published>2010-05-14T07:39:55Z</published>
		<category scheme="http://hueniverse.com" term="XRD" />		<summary type="html"><![CDATA[(Yes, that was a LRDD-inspired pun.) XRD 1.0 is the result of 5 years of community development and actual deployment experience. It represents the most concise, yet extensible way to describe web resources using well understood constructs such as links. It uses XML as its extensible backbone, enabling protocols to extend pretty much every element [...]]]></summary>
		<content type="html" xml:base="http://hueniverse.com/2010/05/jrd-the-other-resource-descriptor/">&lt;p&gt;&lt;a href="http://hueniverse.com/wp-content/uploads/2010/05/jrd.png"&gt;&lt;img class="alignright size-full wp-image-1294" title="jrd" src="http://hueniverse.com/wp-content/uploads/2010/05/jrd.png" alt="" width="253" height="85" /&gt;&lt;/a&gt;(Yes, that was a &lt;a href="http://tools.ietf.org/html/draft-hammer-discovery"&gt;LRDD&lt;/a&gt;-inspired pun.)&lt;/p&gt;
&lt;p&gt;&lt;a href="http://hueniverse.com/xrd/"&gt;XRD 1.0&lt;/a&gt; is the result of 5 years of community development and actual deployment experience. It represents the most concise, yet extensible way to describe web resources using well understood constructs such as links. It uses XML as its extensible backbone, enabling protocols to extend pretty much every element as needed. For a long time, XML was the source of XRD&amp;#8217;s (and its predecessor, XRDS&amp;#8217;s) extensibility.&lt;span id="more-1282"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;But XML is no longer what puts the &amp;#8216;X&amp;#8217; in XRD. XRD utilizes the &lt;a href="http://tools.ietf.org/html/draft-nottingham-http-link-header"&gt;Web Linking&lt;/a&gt; framework for accomplishing cross-format interoperability of link relation types, as well as URI-namespaced key-value properties (for both the resource properties and links). XRD 1.0 is extensible without having to define new elements or attributes. It is accomplished simply by using its &amp;lt;Link&amp;gt; and &amp;lt;Property&amp;gt; elements as-is.&lt;/p&gt;
&lt;p&gt;There might be cases where protocols will want to extend the schema, and that is where the XML foundation comes in handy. In addition, XML provides a mechanism for digital signature (which has as many critics as fans), and a clean way to add new elements without name collisions.&lt;/p&gt;
&lt;p&gt;However, XML is a heavy format, and is no longer the format of choice in many new web protocols. &lt;a href="http://json.org/"&gt;JSON&lt;/a&gt;, a simple but powerful serialization format is getting more and more popular. OAuth 2.0 is likely to support JSON, following its adoption by popular services such as Twitter and Facebook as the default format of their APIs.&lt;/p&gt;
&lt;h3&gt;Introducing JRD&lt;/h3&gt;
&lt;p&gt;JRD, pronounced &amp;#8220;Jared&amp;#8221; and stands for JSON Resource Descriptor, is a JSON-formatted XRD document. It takes the XRD schema and converts it to a JSON structure, giving up some XML-based features, but gaining simplicity and adaptability to JSON-centric protocols and applications. JRD is based on a few simple rules:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;XRD is the canonical representation; JRD is meant as an alternative format offered in addition to XRD.&lt;/li&gt;
&lt;li&gt;JRD does not include support for new extension objects (XRD elements); it is meant for cases where the core XRD elements are sufficient.&lt;/li&gt;
&lt;li&gt;XRD can be converted to JRD; a lossless conversion of JRD back to XRD is not always possible.&lt;/li&gt;
&lt;li&gt;Obtaining JRD is designed as a special case request for an XRD using the HTTP Accept header or format request parameter; JRD is available where XRD is available.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In other words, services should continue using XRD as the primary format for their descriptor documents, and XRD should remain the default format for resource descriptors using the XRD schema. However, services may also support obtaining a JRD version of the document by allowing clients to specify a preference for JSON instead.&lt;/p&gt;
&lt;p&gt;JRD supports the following XRD elements: &amp;lt;Subject&amp;gt;, &amp;lt;Alias&amp;gt;, &amp;lt;Expires&amp;gt;, &amp;lt;Property&amp;gt;, &amp;lt;Link&amp;gt;, and &amp;lt;Title&amp;gt;, as well as the attributes of the &amp;lt;Link&amp;gt;, &amp;lt;Property&amp;gt;, and &amp;lt;Title&amp;gt; elements. It does not support digital signatures.&lt;/p&gt;
&lt;p&gt;Since nothing explains formats better than examples, the following fully-featured XRD document:&lt;/p&gt;
&lt;pre class="brush: xml; title: ; notranslate"&gt;

&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;
&amp;lt;XRD xmlns='http://docs.oasis-open.org/ns/xri/xrd-1.0'&amp;gt;

  &amp;lt;Subject&amp;gt;http://blog.example.com/article/id/314&amp;lt;/Subject&amp;gt;
  &amp;lt;Expires&amp;gt;2010-01-30T09:30:00Z&amp;lt;/Expires&amp;gt;

  &amp;lt;Alias&amp;gt;http://blog.example.com/cool_new_thing&amp;lt;/Alias&amp;gt;

  &amp;lt;Property type='http://blgx.example.net/ns/version'&amp;gt;1.2&amp;lt;/Property&amp;gt;
  &amp;lt;Property type='http://blgx.example.net/ns/ext' /&amp;gt;

  &amp;lt;Link rel='author' type='text/html'
        href='http://blog.example.com/author/steve'&amp;gt;
    &amp;lt;Title&amp;gt;About the Author&amp;lt;/Title&amp;gt;
    &amp;lt;Title xml:lang='en-us'&amp;gt;Author Information&amp;lt;/Title&amp;gt;
    &amp;lt;Property type='http://example.com/author/role'&amp;gt;editor&amp;lt;/Property&amp;gt;
  &amp;lt;/Link&amp;gt;

  &amp;lt;Link rel='author' href='http://example.com/author/john'&amp;gt;
    &amp;lt;Title&amp;gt;The other guy&amp;lt;/Title&amp;gt;
  &amp;lt;/Link&amp;gt;

  &amp;lt;Link rel='copyright' href='http://example.com/copyright' /&amp;gt;
&amp;lt;/XRD&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Is represented by the following JRD document:&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate"&gt;

{
 &amp;quot;subject&amp;quot;:&amp;quot;http://blog.example.com/article/id/314&amp;quot;,
 &amp;quot;expires&amp;quot;:&amp;quot;2010-01-30T09:30:00Z&amp;quot;,
 &amp;quot;aliases&amp;quot;:
 [
   &amp;quot;http://blog.example.com/cool_new_thing&amp;quot;
 ],
 &amp;quot;properties&amp;quot;:
 {
   &amp;quot;http://blgx.example.net/ns/version&amp;quot;:&amp;quot;1.2&amp;quot;,
   &amp;quot;http://blgx.example.net/ns/ext&amp;quot;:null
 },
 &amp;quot;links&amp;quot;:
 {
   &amp;quot;author&amp;quot;:
   [
     {
       &amp;quot;type&amp;quot;:&amp;quot;text/html&amp;quot;,
       &amp;quot;href&amp;quot;:&amp;quot;http://blog.example.com/author/steve&amp;quot;,
       &amp;quot;title&amp;quot;:&amp;quot;About the Author&amp;quot;,
       &amp;quot;titles&amp;quot;:
       {
         &amp;quot;en-us&amp;quot;:&amp;quot;Author Information&amp;quot;
       },
       &amp;quot;properties&amp;quot;:
       {
         &amp;quot;http://example.com/author/role&amp;quot;:&amp;quot;editor&amp;quot;
       }
     },
     {
       &amp;quot;href&amp;quot;:&amp;quot;http://example.com/author/john&amp;quot;,
       &amp;quot;title&amp;quot;:&amp;quot;The other guy&amp;quot;
     }
   ],
   &amp;quot;copyright&amp;quot;:
   [
     {
       &amp;quot;href&amp;quot;:&amp;quot;http://example.com/copyright&amp;quot;
     }
   ]
 }
}
&lt;/pre&gt;
&lt;p&gt;JRD does not support extension XRD elements or attributes. Future specification with use cases for extending JRD can define how to avoid name collisions (such as using a public wiki, registry, or namespaces).&lt;/p&gt;
&lt;h3&gt;Obtaining a JRD Document&lt;/h3&gt;
&lt;p&gt;In general, endpoints should not return a JRD representation by default. They should return an XRD document. Clients looking for a JRD representation make their preference known by using the HTTP &amp;#8216;&lt;strong&gt;Accept&lt;/strong&gt;&amp;#8216; header with the &amp;#8216;&lt;strong&gt;application/xrd+json&lt;/strong&gt;&amp;#8216; media type, or include the &amp;#8216;&lt;strong&gt;format&lt;/strong&gt;&amp;#8216; parameter with a value of &amp;#8216;&lt;strong&gt;json&lt;/strong&gt;&amp;#8216; in the request (or both).&lt;/p&gt;
&lt;p&gt;For example, requesting a host-meta using JRD:&lt;/p&gt;
&lt;pre class="brush: xml; title: ; notranslate"&gt;

&amp;gt; GET /.well-known/host-meta?format=json HTTP/1.1
&amp;gt; Host: example.com
&amp;gt; Accept: application/xrd+json
&lt;/pre&gt;
&lt;h3&gt;Updates&lt;/h3&gt;
&lt;p&gt;5/24: Removed extensibility, changed array names to plural, turned links into a hashed list using rel values. Added title and titles object for the simple and complex use cases. Changed mime type to application/xrd+json.&lt;/p&gt;
&lt;p&gt;5/14: Changed &amp;#8216;namespace&amp;#8217; to &amp;#8216;ns&amp;#8217; and &amp;#8216;title&amp;#8217;, &amp;#8216;ns&amp;#8217;, and &amp;#8216;properties&amp;#8217; from array of objects to an object.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Hueniverse/~4/byLljp_5Qis" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://hueniverse.com/2010/05/jrd-the-other-resource-descriptor/#comments" thr:count="22" />
		<link rel="replies" type="application/atom+xml" href="http://hueniverse.com/2010/05/jrd-the-other-resource-descriptor/feed/atom/" thr:count="22" />
		<thr:total>22</thr:total>
	<feedburner:origLink>http://hueniverse.com/2010/05/jrd-the-other-resource-descriptor/</feedburner:origLink></entry>
	</feed>

