<?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-US" 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>2013-04-24T06:00:25Z</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.5.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</name>
						<uri>http://hueniverse.com</uri>
					</author>
		<title type="html"><![CDATA[Hiring Engineers, a Process]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Hueniverse/~3/4op7_-X7ksI/" />
		<id>http://hueniverse.com/?p=1577</id>
		<updated>2013-04-24T06:00:25Z</updated>
		<published>2013-02-22T03:49:00Z</published>
		<category scheme="http://hueniverse.com" term="Work" />		<summary type="html"><![CDATA[Disclaimer: The process outlined in this post reflects my personal approach. Please consider this as a helpful insight into what it takes to get a hiring recommendation from me. As always the law and corporate policy applies. This post has three purposes. First, to save me the need to explain every time how I interview [...]]]></summary>
		<content type="html" xml:base="http://hueniverse.com/2013/02/hiring-engineers-a-process/">&lt;p&gt;&lt;strong&gt;Disclaimer&lt;/strong&gt;: The process outlined in this post reflects my personal approach. Please consider this as a helpful insight into what it takes to get a hiring recommendation from me. As always the law and corporate policy applies.&lt;/p&gt;
&lt;p&gt;This post has three purposes. First, to save me the need to explain every time how I interview and hire people. Second, to inspire others to break away from the conventional and ineffective hiring process most companies use. It’s a process that fails to identify non-conforming great talent. And third, when the time comes for me to look for my next adventure (and no, I’m too happy where I am – I’m trying to hire you!), I can point hiring managers here to know how I’d like to be treated.&lt;/p&gt;
&lt;h3&gt;TL;DR&lt;/h3&gt;
&lt;p&gt;If you don’t have time to read this, we are not a good fit.&lt;/p&gt;
&lt;h3&gt;What Not to Do&lt;/h3&gt;
&lt;p&gt;In 2006 I was looking for a new job on Wall Street. I wasn’t happy at my job, but not yet ready to do my own startup. At the time I was a VP of engineering at Citi managing about 35 people. I was looking for a similar role with a smaller team and more hands-on opportunities. I was not looking for a primarily coding role. I got invited to interview with Credit Swiss for a lead role. When my first interviewer spent half an hour asking me about the order of initialization of static variable in C++, I played along. But when the second guy came in, put a laptop in front of me and said “We’re going to write some code now”, I got up and said “I’m going home now”. I didn’t get that job.&lt;/p&gt;
&lt;p&gt;Later that year, I had an interview at Bloomberg. The interviewer greeted me at the entrance, then purposely walked me through their showy floors and world-famous curved escalator as if that’s going to motivate me. We’ve spent the first 10 minutes going over my financial products experience and then followed with 20 minutes asking me questions specifically about everything I just said I don’t have experience with. The next interviewer asked me about my coding experience which at the time was all C++, then followed up with only C questions. The last interviewer asked a riddle (“4 members of U2 are trying to cross a bridge”) which I’ve spend the entire half hour passive-aggressively not trying to solve. I didn’t get that job.&lt;/p&gt;
&lt;p&gt;In 2009 I was approached by Google at the recommendation of some people I collaborated with. The conversation didn’t go very far when they made it clear that they will not be able to tell me what I will be working on, and more importantly, who I will be working with and for, until I start. I had serious doubts about passing their interview process, or even fitting in at Google, but I was willing to give it a try. What I wasn’t willing to do is consider a job where the only known parameter is the name of the company. I didn’t get that job.&lt;/p&gt;
&lt;p&gt;I’m purposely focusing on companies that got it all wrong. This is not at all about settling scores. Over the years I’ve interviewed at companies like Twitter and Facebook, which resulted in offers I turned down, and companies like Mozilla and LinkedIn which did not result in offers. The point is, I don’t judge the quality of the hiring process based on my personal experience or whether an offer was extended.&lt;/p&gt;
&lt;p&gt;I judge it based on how much I enjoyed the process and respected the people on the other side.&lt;/p&gt;
&lt;h3&gt;I &amp;#8211; Screening&lt;/h3&gt;
&lt;p&gt;The key to a successful hiring process is a good screening filter. I look for at least one of three things when considering engaging a candidate:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a record of open source, standards, or other public work,&lt;/li&gt;
&lt;li&gt;a recommendation from someone I respect, or&lt;/li&gt;
&lt;li&gt;a cold call with an attitude&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I don’t phone screen. I don’t read resumes.&lt;/p&gt;
&lt;p&gt;The first two are self-explanatory but apparently not obvious. Too many people rely on their resume for engineering roles. I don’t care about your resume. What I’m looking for is code to look at, specifications to read, or products to play with. Nothing showcases your skills better than actual code, especially code written to satisfy your own standards and not an employer.&lt;/p&gt;
&lt;p&gt;Without a public record or a recommendation, I’m not likely to have much interest. Which means, you need to find a way to get my attention. Sending a one line email (or a tweet) asking for more information is not going to accomplish much. I’m looking for some attitude. If you want me to spend time learning about you without having easy access to a sample of your work, you need to make it fun for me.&lt;/p&gt;
&lt;p&gt;The obvious ways are to engage me on something I care about. Google me – it’s not hard to figure it out. Send me comments about a blog post or an open source project I published. Tell my why I’m wrong, why my project sucks, how I can make it better, or why you want to work with me. If you put an effort into it, I will do the same.&lt;/p&gt;
&lt;h3&gt;II &amp;#8211; Greeting&lt;/h3&gt;
&lt;p&gt;Great, you got my attention. Now I am going to get yours.&lt;/p&gt;
&lt;p&gt;Our first call or meeting is going to be all about you. My job is to sell you the company, the team, and the role. The sole purpose of our first interaction is to make you want the job. To give you all the information you need to make an educated decision. After all, in the next step I’m going to make you work for it, so it’s only fair you have all the information you need before I waste your time.&lt;/p&gt;
&lt;h3&gt;III – Homework&lt;/h3&gt;
&lt;p&gt;If you made it here, it means your background is exactly what we want, and this is the job you are looking for. Now let’s write some code!&lt;/p&gt;
&lt;p&gt;I suck at writing code on demand. I can’t really code outside my controlled environment. I got my chair, and desk, and big monitor, and IDE, and color scheme, and… you get the idea. I also do my best work when I get to “sleep on” a problem. Some people are great at writing code on a whiteboard. It’s a great interview skill to have. It’s also an idiotic skill to test for. I am also not a fan of pair programming which would be the only valid reason to live code during an interview. So no live coding.&lt;/p&gt;
&lt;p&gt;Instead, I will present you with a few problems the team is working on right now. I’m not going to make shit up. These are all actual problems we need to solve or have solved recently. The advantages are many: you get to experience what the job is really like and we get to work with you on a problem we have been looking at recently. More often than not, these are pending items that we have not solved yet. Looking at our &lt;a href="https://github.com/spumko/hapi/issues"&gt;open issues on GitHub&lt;/a&gt; is a great way to get an idea what you might be tasked with.&lt;/p&gt;
&lt;p&gt;The guidelines are simply – pick a problem and come back with something that best showcases your abilities. It can be code, a pull request, a written proposal, or an email analysis. Whatever you feel is the best way for you to shine. You can use any resources you want – the web, books, friends. You know, just like you do at work. To get an idea what past hires submitted, &lt;a href="https://github.com/spumko/hapi/tree/master/proposals"&gt;check out some of these proposals&lt;/a&gt; (some are actual answers from interviews posted with permission after a successful hire).&lt;/p&gt;
&lt;p&gt;You also get as much time as you want. There is no deadline.&lt;/p&gt;
&lt;p&gt;There is only one catch. Once you send your response back, we’re going to chat about it. We’ll challenge your analysis, your assumptions, your solution. We’ll try to put sticks in your wheels, introducing new constraints or share our experience if we already tried that. In other words, we’ll have an educated discussion about the problem, now that you had as much time as needed to study it. No surprises.&lt;/p&gt;
&lt;p&gt;The homework follow up can be a 30m phone chat or part of the in-person interview. It mostly depends on your location, availability, and how blown away we are with your submission. On occasion we are left speechless.&lt;/p&gt;
&lt;p&gt;Funny story. during my time at Citi, leading a C++ shop, I gave this homework to people: “Build a car in C++”. Most people created a set of classes and put them together to construct a car object with some methods and state. One guy sent this (actual submission!):&lt;/p&gt;
&lt;pre class="brush: cpp; title: ; notranslate"&gt;
class Car {

private:

  void top () {
    printf(&amp;quot;                         ________________________&amp;quot;);
    printf(&amp;quot;                        /             |          \\&amp;quot;);
    printf(&amp;quot;                       /              |           \\&amp;quot;);
    printf(&amp;quot;                      /               |            \\&amp;quot;);
    printf(&amp;quot;                     /                |             \\&amp;quot;);
    printf(&amp;quot;                    /                 |              \\&amp;quot;);
    printf(&amp;quot;                   /                  |               \\&amp;quot;);
    printf(&amp;quot;                  /___________________|________________\\__________&amp;quot;);
    printf(&amp;quot;     ____________/                                                \\&amp;quot;);
    printf(&amp;quot;    /                                                              \\&amp;quot;);
    printf(&amp;quot;   /                                                                \\&amp;quot;);
  };

  void bottom () {
    printf(&amp;quot;  /                                                                  |&amp;quot;);
    printf(&amp;quot; /        ,---------,                     ,-----------,              |=====&amp;quot;);
    printf(&amp;quot;|        /  ______   \\                   /   ________  \\             |=====&amp;quot;);
    printf(&amp;quot;|       /  /      \   \\                 /   /        \\  \\___________/&amp;quot;);
    printf(&amp;quot; \\_____/  /        \   \\_______________/   /          \\&amp;quot;);
    printf(&amp;quot;         /          |                     |            |&amp;quot;);
    printf(&amp;quot;        |           |                     |            |&amp;quot;);
    printf(&amp;quot;        |          /                      \\           /&amp;quot;);
    printf(&amp;quot;        \\         /                        \\         /&amp;quot;);
    printf(&amp;quot;         \\_______/                          \\_______/&amp;quot;);
  };

public:

  void drive () {
    top();
    bottom();
  };
};
&lt;/pre&gt;
&lt;p&gt;Needless to say, he was invited for an interview. He didn’t show.&lt;/p&gt;
&lt;h3&gt;IV – Interview&lt;/h3&gt;
&lt;p&gt;The goal of the in-person interview is to evaluate the following areas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cultural fit&lt;/strong&gt; – are you going to be a good addition to the team and work well with others? Will we enjoy working with you? Will we want to go to a conference with you? Also, as a team with remote members, evaluate your compatibility with our style and process.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Adaptability&lt;/strong&gt; – we work in a mixed environment where we have control over our systems but little control over the services we consume. Working in this environment, with many legacy systems isn&amp;#8217;t for everyone.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Passion&lt;/strong&gt; – everyone should have something they are passionate about. What are you? We’ll try to find yours and chat about it a bit. It doesn&amp;#8217;t have to be super relevant. The goal is to see how deep you dive into topics that excite you. My 2 hours interview at Yahoo! included an hour discussion about water gardens. It was awesome.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The on-site interview is usually 2-3 hours long with 3-5 team members. I usually ask each interviewer to focus on one of the areas above. I also provide them with the following list of do’s and don’ts.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The DOs:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Know what you are interviewing for (you’d be surprised).&lt;/li&gt;
&lt;li&gt;Begin the interview describing your role in the team and allow the candidate to ask questions.&lt;/li&gt;
&lt;li&gt;Ask questions based on actual team experience.&lt;/li&gt;
&lt;li&gt;Focus on architecture, design, and approach to problems more than the fine details of the solution.&lt;/li&gt;
&lt;li&gt;Let the candidate explain the process if their answer isn&amp;#8217;t what you were expecting – a wrong answer can still demonstrate solid thought process.&lt;/li&gt;
&lt;li&gt;Any coding question must be a follow up on the homework submitted.&lt;/li&gt;
&lt;li&gt;Make it fun. Find ways to make the candidate feel at ease and enjoy the conversation.&lt;/li&gt;
&lt;li&gt;Leave at least 5 minutes at the end for them to ask questions and unwind. Ending poorly sets the tone for the next interview.&lt;/li&gt;
&lt;li&gt;Offer them a drink or a restroom break.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;The DON&amp;#8217;Ts:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Don&amp;#8217;t ask those who interviewed the candidate before you what they think. Form your own first impression.&lt;/li&gt;
&lt;li&gt;No whiteboard coding or any live coding during the interview. Some people do well coding on the fly, most don&amp;#8217;t. It is not a skill we care about. It also takes too much time that is better spent talking.&lt;/li&gt;
&lt;li&gt;No riddles, logic, trick questions, or puzzles. This is not the SAT.&lt;/li&gt;
&lt;li&gt;Don&amp;#8217;t ask questions about stuff they claim not to know. This should be obvious but sadly its not to some people. Ask them about what they know and claim to be proficient in.&lt;/li&gt;
&lt;li&gt;Talk, don&amp;#8217;t interrogate.&lt;/li&gt;
&lt;li&gt;Don&amp;#8217;t read their resume during the interview. In fact, don&amp;#8217;t bring their resume to the interview at all. If you did not read it ahead, focus more about technology in general and our work. It is obvious when someone is interviewing you who has no clue who you are.&lt;/li&gt;
&lt;li&gt;Don&amp;#8217;t ask one long question in multiple parts. If they get the first part wrong, it sets a bad tone for the rest of the interview. Give them a chance to reset and start over with another topic. Ask and move on – don&amp;#8217;t get stuck on getting them to reach the right answer.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;V – Decision&lt;/h3&gt;
&lt;p&gt;That’s it. We meet as a team and get everyone’s feedback. We should have an answer the following day.&lt;/p&gt;
&lt;h3&gt;Final Thoughts&lt;/h3&gt;
&lt;p&gt;Like most people, I don’t like going to interviews where I don’t know the team and I am asked to “perform”. The interview should adapt to your level. Architects should not be asked to solve short algorithms, the same way managers should not be asked to write code. Your references and past work is what we should really rely on for verifying your claims. The interview is mostly about personality, compatibility, and due diligence.&lt;/p&gt;
&lt;p&gt;A job interview goes both ways. We interview you, and you interview us. We want great talent and respect is the first step.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Hueniverse/~4/4op7_-X7ksI" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://hueniverse.com/2013/02/hiring-engineers-a-process/#comments" thr:count="35" />
		<link rel="replies" type="application/atom+xml" href="http://hueniverse.com/2013/02/hiring-engineers-a-process/feed/atom/" thr:count="35" />
		<thr:total>35</thr:total>
	<feedburner:origLink>http://hueniverse.com/2013/02/hiring-engineers-a-process/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Eran Hammer</name>
						<uri>http://hueniverse.com</uri>
					</author>
		<title type="html"><![CDATA[hapi hapi joi joi]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Hueniverse/~3/QjTt8M84M-o/" />
		<id>http://hueniverse.com/?p=1570</id>
		<updated>2013-01-18T01:42:12Z</updated>
		<published>2013-01-18T01:42:12Z</published>
		<category scheme="http://hueniverse.com" term="Architecture" /><category scheme="http://hueniverse.com" term="Node.js" /><category scheme="http://hueniverse.com" term="Sled" />		<summary type="html"><![CDATA[Download the slides as a PDF document.]]></summary>
		<content type="html" xml:base="http://hueniverse.com/2013/01/hapi-hapi-joi-joi/">&lt;p&gt;&lt;iframe name="vidly-frame" src="http://s.vid.ly/embeded.html?link=5v5h7o&amp;amp;new=1&amp;amp;autoplay=false&amp;amp;hd=yes" height="360" width="640" allowfullscreen="" frameborder="0"&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;Download the slides as a &lt;a href="http://hueniverse.com/wp-content/uploads/2013/01/hapi-hapi-joi-joi.pdf"&gt;PDF document&lt;/a&gt;.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Hueniverse/~4/QjTt8M84M-o" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://hueniverse.com/2013/01/hapi-hapi-joi-joi/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://hueniverse.com/2013/01/hapi-hapi-joi-joi/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://hueniverse.com/2013/01/hapi-hapi-joi-joi/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Eran Hammer</name>
						<uri>http://hueniverse.com</uri>
					</author>
		<title type="html"><![CDATA[hapi, a Prologue]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Hueniverse/~3/y1oDGCtUsgM/" />
		<id>http://hueniverse.com/?p=1566</id>
		<updated>2012-12-20T08:33:44Z</updated>
		<published>2012-12-20T08:33:30Z</published>
		<category scheme="http://hueniverse.com" term="Architecture" /><category scheme="http://hueniverse.com" term="Node.js" />		<summary type="html"><![CDATA[For the past 2 years I have had the pleasure (and luck) of working with node full time. It’s an amazing technology and a remarkable community. Oh, and it’s crazy fun. My focus this year was rethinking web services at Walmart Mobile, from the business layer all the way down to the tools and process we [...]]]></summary>
		<content type="html" xml:base="http://hueniverse.com/2012/12/hapi-a-prologue/">&lt;p&gt;&lt;a href="https://github.com/walmartlabs/hapi"&gt;&lt;img class="alignright" alt="" src="https://raw.github.com/walmartlabs/hapi/master/images/hapi.png" width="355" height="247" /&gt;&lt;/a&gt;For the past 2 years I have had the pleasure (and luck) of working with &lt;a href="http://nodejs.org"&gt;node&lt;/a&gt; full time. It’s an amazing technology and a remarkable community. Oh, and it’s crazy fun. My focus this year was rethinking web services at Walmart Mobile, from the business layer all the way down to the tools and process we use. A significant part of this effort focused on developing &lt;a href="https://github.com/walmartlabs/hapi"&gt;hapi&lt;/a&gt;, a new web services framework for node.&lt;/p&gt;
&lt;p&gt;But before I write my traditional ‘Introducing’ post, I wanted to first discuss the evolution that led us to build a whole new framework. To truly understand the judge a new framework, it is important to understand the context and objectives leading to its creation.&lt;span id="more-1566"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Walmart, like many big and small companies, is not in the business of creating and maintaining developer tools.&lt;/p&gt;
&lt;p&gt;There is great value in doing open source and participating in the community. But without an active community, developing an open source project can quickly become a liability. When we started, the goal was to take an existing effort and simply enhance it to meet our goals. We didn’t set to build an entire stack from scratch. If you build it and nobody comes, it can get expensive and very isolating.&lt;/p&gt;
&lt;p&gt;I’ve started using node working on &lt;a href="http://hueniverse.com/2011/07/introducing-sled/"&gt;Sled&lt;/a&gt;, a short-lived project at Yahoo! which was open-sourced as &lt;a href="https://github.com/hueniverse/postmile"&gt;Postmile&lt;/a&gt;. Sled had a simple services architecture in which multiple clients communicated with an API server. At the time, the only real framework available was &lt;a href="http://expressjs.com/"&gt;Express&lt;/a&gt;, and for a very early effort, it was quite good.&lt;/p&gt;
&lt;p&gt;But it also required a lot of effort supplementing it with the necessary building blocks for a productive foundation. Most of the effort focused on changing the interaction between Express and the business logic, along with support for authentication, encrypted cookies, input validation, and other small features missing at the time.&lt;/p&gt;
&lt;p&gt;When Sled ended and I moved on to Walmart, I started by extracting the parts of Postmile I liked as the foundation of our new services platform and called it &lt;strong&gt;hapi&lt;/strong&gt; (for &lt;strong&gt;H&lt;/strong&gt;TTP &lt;strong&gt;API&lt;/strong&gt; server). It was still built on top of Express, and wasn’t much more than a bloated Express middleware &amp;#8211; but it was easy to use and much faster to hack services on. It was a good start.&lt;/p&gt;
&lt;p&gt;We used Express for a few months until we hit a wall.&lt;/p&gt;
&lt;p&gt;Some of the features we needed required a cleaner isolation between the node HTTP server, the router (the part matching requests to handlers), and the actual business logic. Express tries to be an unopinionated framework, but in practice, there is no such thing. Every decision made imposes an opinion and a way of working with the framework, and Express comes with a lot of baggage from its Connect roots (req, res, next).&lt;/p&gt;
&lt;p&gt;For example, we were trying to add batch functionality in which a JSON payload includes a list of chained endpoints, some parallel and some serial. Given the cost of round-trips in mobile, this was an important requirement. The problem was, because of Express’ middleware architecture and it’s strong coupling of the router to the node HTTP server, the only clean way of making internal API calls that truly replicate the result of calling each API individually from the outside is to make an actual HTTP call into the server. This gets real messy when using authentication and having to fake client credentials.&lt;/p&gt;
&lt;p&gt;We also had some bad experience with Express’ lack of true extensibility model. Express was a pleasure and easy to use 2 years ago with a limited set of middleware and very little interdependencies among them. But with a long list of chained middleware, we found hard to debug problems when we simply changed the order in which middleware modules were being loaded.&lt;/p&gt;
&lt;p&gt;Goodbye Express, hello &lt;a href="https://github.com/flatiron/director"&gt;Director&lt;/a&gt;, the simple but powerful router from Nodejitsu’s Flatiron project.&lt;/p&gt;
&lt;p&gt;Replacing Express with Director took a day and the result was a cleaner interface between the layers. We enjoyed working with Director and the responsive support from its active community. By this time, there was little resemblance between our higher level framework API and Express&amp;#8217; since we wrapper the entire Express API with our own. We were able to quickly implement batch processing and other features and used Director successfully.&lt;/p&gt;
&lt;p&gt;But as you can guess, that didn’t last long.&lt;/p&gt;
&lt;p&gt;In order to achieve Director’s highly optimized routing tree, it had to make certain choices about how paths are structured and configured. Director offers a particular mix of static routes, parameterized routes, and some forms of wildcards / regular expressions.&lt;/p&gt;
&lt;p&gt;In some ways, Director&amp;#8217;s attempt to accommodation expectations from Express users ends up make it more complex for little gain. Director does not keep track of the path parameter names (only their order) which meant we had to hack that feature back in. We also had to work around Director’s way of providing extensibility hooks via before/after functions. After all, how framework are extended is one of the most significant architectural choices.&lt;/p&gt;
&lt;p&gt;One of the main problems we had with Director was the difficulty in prevent route collisions &amp;#8211; a critical feature when building a modular web services layer where different plugins register their endpoints with a central host. More on that in a followup post.&lt;/p&gt;
&lt;p&gt;We also looked at &lt;a href="https://github.com/mcavage/node-restify"&gt;Restify&lt;/a&gt;, &lt;a href="https://github.com/mikeal/tako"&gt;Tako&lt;/a&gt;, and a few others.&lt;/p&gt;
&lt;p&gt;We didn’t set to create a whole new framework, but at the end of the day, it was easier and more appropriate than trying to make an existing solution work. Framework represent a philosophy encompassing both coding style and engineering process, and it’s hard to impose one on another.&lt;/p&gt;
&lt;p&gt;hapi was created around the idea that &lt;strong&gt;configuration is better than code&lt;/strong&gt;, that &lt;strong&gt;business logic must be isolated from the transport layer&lt;/strong&gt;, and that native node constructs like buffers and stream should be supported as first class objects. But most importantly, it was created to provide a modern, comprehensive environment in which as much of the effort is spent &lt;strong&gt;delivering business value&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;A formal hapi introduction is coming. If you can’t wait, &lt;a href="https://github.com/walmartlabs/hapi"&gt;check it out&lt;/a&gt;.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Hueniverse/~4/y1oDGCtUsgM" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://hueniverse.com/2012/12/hapi-a-prologue/#comments" thr:count="3" />
		<link rel="replies" type="application/atom+xml" href="http://hueniverse.com/2012/12/hapi-a-prologue/feed/atom/" thr:count="3" />
		<thr:total>3</thr:total>
	<feedburner:origLink>http://hueniverse.com/2012/12/hapi-a-prologue/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Eran Hammer</name>
						<uri>http://hueniverse.com</uri>
					</author>
		<title type="html"><![CDATA[#fuckoauth @realtimeconf]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Hueniverse/~3/hBB8VOwWaa4/" />
		<id>http://hueniverse.com/?p=1562</id>
		<updated>2012-11-05T23:44:50Z</updated>
		<published>2012-11-05T23:43:59Z</published>
		<category scheme="http://hueniverse.com" term="OAuth" />		<summary type="html" />
		<content type="html" xml:base="http://hueniverse.com/2012/11/fuckoauth-realtimeconf/">&lt;p&gt;&lt;iframe src="http://player.vimeo.com/video/52882780?badge=0" width="500" height="281" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Hueniverse/~4/hBB8VOwWaa4" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://hueniverse.com/2012/11/fuckoauth-realtimeconf/#comments" thr:count="7" />
		<link rel="replies" type="application/atom+xml" href="http://hueniverse.com/2012/11/fuckoauth-realtimeconf/feed/atom/" thr:count="7" />
		<thr:total>7</thr:total>
	<feedburner:origLink>http://hueniverse.com/2012/11/fuckoauth-realtimeconf/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Eran Hammer</name>
						<uri>http://hueniverse.com</uri>
					</author>
		<title type="html"><![CDATA[On Leaving OAuth]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Hueniverse/~3/sFz2wTOdVQw/" />
		<id>http://hueniverse.com/?p=1547</id>
		<updated>2012-07-30T09:11:31Z</updated>
		<published>2012-07-30T09:02:16Z</published>
		<category scheme="http://hueniverse.com" term="OAuth" /><category scheme="http://hueniverse.com" term="Open Web" />		<summary type="html"><![CDATA[I have to admit, I’ve been surprised by the tone and magnitude of the reaction to my announcement. I’ve been following the reactions on Twitter and every follow-up blog post I could find. I’d like to share some follow-up thoughts about this decision and the reactions to it. First, I didn&#8217;t say &#8216;dead&#8217;, I said [...]]]></summary>
		<content type="html" xml:base="http://hueniverse.com/2012/07/on-leaving-oauth/">&lt;p&gt;I have to admit, I’ve been surprised by the tone and magnitude of the reaction to my &lt;a href="http://hueniverse.com/2012/07/oauth-2-0-and-the-road-to-hell/"&gt;announcement&lt;/a&gt;. I’ve been following the reactions on Twitter and every follow-up blog post I could find. I’d like to share some follow-up thoughts about this decision and the reactions to it. First, I didn&amp;#8217;t say &amp;#8216;dead&amp;#8217;, I said &amp;#8216;bad&amp;#8217;.&lt;span id="more-1547"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;Everything is fine&lt;/h3&gt;
&lt;p&gt;Few people came to the defense of the protocol, the working group, and the IETF. Surprisingly few. In fact, no one has raised the issue on the &lt;a href="http://www.ietf.org/mail-archive/web/oauth/current/maillist.html"&gt;mailing list&lt;/a&gt;. This is not exactly a &lt;a href="http://www.youtube.com/watch?v=d8IBnfkcrsM"&gt;Hy-Brazil moment&lt;/a&gt;, but some of the reactions do make me wonder.&lt;/p&gt;
&lt;p&gt;One response &lt;strong&gt;worth reading&lt;/strong&gt; was from John Bradley in a post titled “&lt;a href="http://www.thread-safe.com/2012/07/the-oauth-2-sky-is-not-falling.html"&gt;The OAuth 2 Sky is NOT Falling&lt;/a&gt;”. John is a past collaborator (XRD) and someone I respect and his post offers a quality reaction from someone on the other side of the issue. As a leading contributor and co-author of the &lt;a href="http://openid.net/connect/"&gt;OpenID Connect&lt;/a&gt; family of specifications, it is easy to understand why John and that community are happy with OAuth 2.0 and the process it followed.&lt;/p&gt;
&lt;p&gt;OpenID Connect is heavily based on OAuth 2.0 &amp;#8211; I personally find it overly complex. Most of the OpenID Connect members joined the OAuth list in order to protest decisions that would have made it too restrictive for OpenID Connect to use OAuth 2.0, and their participation explains a few of the underspecified areas of the specification.&lt;/p&gt;
&lt;p&gt;Another community that has been very satisfied with OAuth 2.0 is &lt;a href="http://kantarainitiative.org/confluence/display/uma/Home"&gt;UMA&lt;/a&gt;. Some of the UMA project leads are people are like and respect, like &lt;a href="http://www.xmlgrrl.com/blog/"&gt;Eve Maler&lt;/a&gt;. In the past I have invited members of the UMA community to share their project with the OAuth community on the mailing list, at IETF meetings, and on this blog. It has been a long time since I read up on UMA but I was always skeptical about its relevancy to the consumer web world I care about. UMA is also based on OAuth 2.0 and relies on many of its extensibility areas to operate. If you want to get an idea of the complexity (and richness) of this world, &lt;a href="http://blogs.forrester.com/eve_maler/12-03-12-a_new_venn_of_access_control_for_the_api_economy"&gt;this is a good place to start&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;One last example of an OAuth 2.0-based work that can help explain and justify the “decisions made” on OAuth 2.0 is &lt;a href="http://oatc.us/Standards/OMAPStandardOverview.aspx"&gt;OMAP&lt;/a&gt; (Online Multimedia Authorization Protocol). OMAP is an enterprise specification dealing with authorizing access to multimedia content and was authored by lead players in the space. I honestly don’t understand the value of basing this work on OAuth 2.0 or how such an extension could be claimed to operate in the same echo-system. It is the perfect example of the real use cases guiding the working group and the real-world application some members of the group were focusing on.&lt;/p&gt;
&lt;p&gt;So, yeah. For some people “the sky is not falling” and OAuth 2.0 is a success. It is easy to see where they are coming from and why they hold this view. If OAuth 2.0 was a contest, they are clearly the winners and they won fair and square by playing by the IETF rules. I just don’t want to lend it my name, whatever it is worth.&lt;/p&gt;
&lt;h3&gt;Eran is an asshole&lt;/h3&gt;
&lt;p&gt;I fully respect the opinions of those who have directly interacted with me in person or online and formed positive or negative opinions about me. My style is aggressive, direct, honest, and often combative. I don’t (and cannot) pretend otherwise. All it takes is reading a small sample of my blog posts or mailing list communications to get a clear and accurate sense of who I am and what I’m like. I am exactly the same way in person.&lt;/p&gt;
&lt;p&gt;But this also means that three years into this effort, to paint my move in negative personal attacks is childish and hypocritical, especially from people who never interacted with me directly (or those who pretended to be my friends).&lt;/p&gt;
&lt;p&gt;In a comment to my announcement, Dick Hardt in a personal attack, points to the fact that I insisted on full editorial control and therefore, can only blame myself. The facts are somewhat different. I was offered to join the editorial team with two others. I declined and said I don’t edit with other people, but happy to let them do the work without me. I was made solo editor. It was all very pleasant. The IETF process makes it trivial for the working group chairs and area director to remove, replace, or supplement an editor at will. &lt;a href="http://www.ietf.org/mail-archive/web/oauth/current/msg09225.html"&gt;They really don’t need any reason&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A few months ago, when I started considering removing my name from the specification, I reach out to Mr. Hardt as a listed co-author on the document. His advice? “&lt;em&gt;I don&amp;#8217;t think it will serve you well. Better to stay the course and be disappointed with result. You can remain editor and blame IETF post editor role process.&lt;/em&gt;”&lt;/p&gt;
&lt;h3&gt;Facebook and Google are doing just fine thank you&lt;/h3&gt;
&lt;p&gt;A quality, respectful, and worthy &lt;a href="http://www.tbray.org/ongoing/When/201x/2012/07/28/Oauth2-dead"&gt;response from Tim Bray&lt;/a&gt; makes the argument that clearly, the existing (and very successful) deployment of OAuth 2.0 on the web tells a different story. I don’t disagree. As I said before, in the right hands, after applying the right security and making some decisions, OAuth 2.0 can be great. Facebook made those decision (one of which was to ignore the last 20-something drafts) and so did Google. However, even Facebook with their vast resources &lt;a href="http://nakedsecurity.sophos.com/2011/02/02/facebook-flaw-websites-steal-personal-data/"&gt;had issues with 2.0&lt;/a&gt; and ended addressing them with proprietary solutions (e.g. a callback signature, login parameters).&lt;/p&gt;
&lt;p&gt;I would have been thrilled if the final result was a documentation of the Google or Facebook implementations and nothing else. That would have been a useful protocol.&lt;/p&gt;
&lt;p&gt;If you are not sure what I am so upset about, it is the total lack of making choices. Given the new architecture and capabilities, OAuth 2.0 should have been much more restrictive and narrow.&lt;/p&gt;
&lt;h3&gt;The IETF is good, the IETF is bad&lt;/h3&gt;
&lt;p&gt;A few reactions focused on the IETF part of the story. No one seemed to offer an actual defense of the organization. Joe Gregorio &lt;a href="https://plus.google.com/u/0/118148240205592032989/posts/Qudedrg7JqJ"&gt;offered one only to immediately take it away&lt;/a&gt;. At best, people pointed to past successes at the IETF as proof the organization is still relevant and effective. The problem is that their examples are all from two decades ago. The second line of defense simply states that standards are hard and that’s just the nature of the beast. OAuth 1.0 proves it doesn&amp;#8217;t have to be.&lt;/p&gt;
&lt;h3&gt;Glee&lt;/h3&gt;
&lt;p&gt;I can live with all the reaction above. Even those dismissing my arguments or calling me an asshole. I expected those. What I didn’t expect was an overwhelming expression of joy and schadenfreude. I didn’t realize just how much this specification was hated among web developers. I knew people were not thrilled about it but never imagined the level of discontent.&lt;/p&gt;
&lt;p&gt;What is actually upsetting is that all these people (and we are talking hundreds of individual posts on Twitter) never bothered to engage. Three years is a long time to hate something this much without sending an email to the mailing list expressing it. If only a fraction of these people showed up, we would not be here today. People actually were paying attention but doing nothing about it.&lt;/p&gt;
&lt;p&gt;Now, that’s just sad and pathetic.&lt;/p&gt;
&lt;p&gt;(As always, comments are welcomed)&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Hueniverse/~4/sFz2wTOdVQw" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://hueniverse.com/2012/07/on-leaving-oauth/#comments" thr:count="23" />
		<link rel="replies" type="application/atom+xml" href="http://hueniverse.com/2012/07/on-leaving-oauth/feed/atom/" thr:count="23" />
		<thr:total>23</thr:total>
	<feedburner:origLink>http://hueniverse.com/2012/07/on-leaving-oauth/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Eran Hammer</name>
						<uri>http://hueniverse.com</uri>
					</author>
		<title type="html"><![CDATA[OAuth 2.0 and the Road to Hell]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Hueniverse/~3/oaUWyZYh-cM/" />
		<id>http://hueniverse.com/?p=1538</id>
		<updated>2012-07-30T09:03:21Z</updated>
		<published>2012-07-26T07:37:23Z</published>
		<category scheme="http://hueniverse.com" term="OAuth" /><category scheme="http://hueniverse.com" term="Open Web" />		<summary type="html"><![CDATA[They say the road to hell is paved with good intentions. Well, that’s OAuth 2.0. Last month I reached the painful conclusion that I can no longer be associated with the OAuth 2.0 standard. I resigned my role as lead author and editor, withdraw my name from the specification, and left the working group. Removing [...]]]></summary>
		<content type="html" xml:base="http://hueniverse.com/2012/07/oauth-2-0-and-the-road-to-hell/">&lt;p&gt;They say the road to hell is paved with good intentions. Well, that’s &lt;a href="http://tools.ietf.org/html/draft-ietf-oauth-v2"&gt;OAuth 2.0&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Last month I reached the painful conclusion that I can no longer be associated with the OAuth 2.0 standard. I resigned my role as lead author and editor, &lt;strong&gt;withdraw my name from the specification&lt;/strong&gt;, and left the working group. Removing my name from a document I have painstakingly labored over for three years and over two dozen drafts was not easy. Deciding to move on from an effort I have led for over five years was agonizing.&lt;span id="more-1538"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;There wasn’t a single problem or incident I can point to in order to explain such an extreme move. This is a case of death by a thousand cuts, and as the work was winding down, I’ve found myself reflecting more and more on what we actually accomplished. At the end, I reached the conclusion that OAuth 2.0 is a bad protocol. WS-* bad. It is bad enough that I no longer want to be associated with it. It is the biggest professional disappointment of my career.&lt;/p&gt;
&lt;p&gt;All the hard fought compromises on the mailing list, in meetings, in special design committees, and in back channels resulted in a specification that fails to deliver its two main goals – security and interoperability. In fact, one of the compromises was to rename it from a protocol to a framework, and another to add a &lt;a href="http://tools.ietf.org/html/draft-ietf-oauth-v2-30#section-1.8"&gt;disclaimer that warns that the specification is unlike to produce interoperable implementations&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;When compared with &lt;a href="http://tools.ietf.org/html/rfc5849"&gt;OAuth 1.0&lt;/a&gt;, the 2.0 specification is more complex, less interoperable, less useful, more incomplete, and most importantly, less secure.&lt;/p&gt;
&lt;p&gt;To be clear, OAuth 2.0 at the hand of a developer with deep understanding of web security will likely result is a secure implementation. However, at the hands of most developers &amp;#8211; as has been the experience from the past two years &amp;#8211; 2.0 is likely to produce insecure implementations.&lt;/p&gt;
&lt;h3&gt;How did we get here?&lt;/h3&gt;
&lt;p&gt;At the core of the problem is the strong and unbridgeable conflict between the &lt;strong&gt;web&lt;/strong&gt; and the &lt;strong&gt;enterprise&lt;/strong&gt; worlds. The OAuth working group at the IETF started with strong web presence. But as the work dragged on (and on) past its first year, those web folks left along with every member of the original 1.0 community. The group that was left was largely all enterprise… and me.&lt;/p&gt;
&lt;p&gt;The web community was looking for a protocol very much in-line with 1.0, with small improvement in areas that proved lacking: simplifying signature, adding a light identity layer, addressing native applications, adding more flows to accommodate new client types, and improving security. The enterprise community was looking for a framework they can use with minimal changes to their existing systems, and for some, a new source of revenues through customization. To understand the depth of the divide &amp;#8211; in an early meeting the web folks wanted a flow optimized for in-browser clients while the enterprise folks wanted a flow using SAML assertions.&lt;/p&gt;
&lt;p&gt;The resulting specification is a &lt;strong&gt;designed-by-committee&lt;/strong&gt; patchwork of compromises that serves mostly the enterprise. To be accurate, it doesn’t actually give the enterprise all of what they asked for directly, but it does provide for practically unlimited extensibility. It is this extensibility and required flexibility that destroyed the protocol. &lt;strong&gt;With very little effort, pretty much anything can be called OAuth 2.0 compliant.&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;Under the Hood&lt;/h3&gt;
&lt;p&gt;To understand the issues in 2.0, you need to understand the core architectural changes from 1.0:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Unbounded tokens&lt;/strong&gt; - In 1.0, the client has to present two sets of credentials on each protected resource request, the token credentials and the client credentials. In 2.0, the client credentials are no longer used. This means that tokens are no longer bound to any particular client type or instance. This has introduced limits on the usefulness of access tokens as a form of authentication and increased the likelihood of security issues.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bearer tokens&lt;/strong&gt;  - 2.0 got rid of all signatures and cryptography at the protocol level. Instead it relies solely on TLS. This means that &lt;a href="http://hueniverse.com/2010/09/oauth-bearer-tokens-are-a-terrible-idea/"&gt;2.0 tokens are inherently less secure as specified&lt;/a&gt;. Any improvement in token security requires additional specifications and as the current proposals &lt;a href="http://openid.net/specs/draft-jones-json-web-token-07.html"&gt;demonstrate&lt;/a&gt;, the group is solely focused on enterprise use cases.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Expiring tokens&lt;/strong&gt; - 2.0 tokens can expire and must be refreshed. This is the most significant change for client developers from 1.0 as they now need to implement token state management. The reason for token expiration is to accommodate self-encoded tokens – encrypted tokens which can be authenticated by the server without a database look-up. Because such tokens are self-encoded, they cannot be revoked and therefore must be short-lived to reduce their exposure. Whatever is gained from the removal of the signature is lost twice in the introduction of the token state management requirement.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Grant types&lt;/strong&gt; - In 2.0, authorization grants are exchanged for access tokens. Grant is an abstract concept representing the end-user approval. It can be a code received after the user clicks ‘Approve’ on an access request, or the user’s actual username and password. The original idea behind grants was to enable multiple flows. 1.0 provides a single flow which aims to accommodate multiple client types. 2.0 adds significant amount of specialization for different client type.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Indecision Making&lt;/h3&gt;
&lt;p&gt;These changes are all manageable if put together in a well-defined protocol. But as has been the nature of this working group, no issue is too small to get stuck on or leave open for each implementation to decide. Here is a very short &lt;strong&gt;sample&lt;/strong&gt; of the working group’s inability to agree:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No required token type&lt;/li&gt;
&lt;li&gt;No agreement on the goals of an HMAC-enabled token type&lt;/li&gt;
&lt;li&gt;No requirement to implement token expiration&lt;/li&gt;
&lt;li&gt;No guidance on token string size, or any value for that matter&lt;/li&gt;
&lt;li&gt;No strict requirement for registration&lt;/li&gt;
&lt;li&gt;Loose client type definition&lt;/li&gt;
&lt;li&gt;Lack of clear client security properties&lt;/li&gt;
&lt;li&gt;No required grant types&lt;/li&gt;
&lt;li&gt;No guidance on the suitability or applicability of grant types&lt;/li&gt;
&lt;li&gt;No useful support for native applications (but lots of lip service)&lt;/li&gt;
&lt;li&gt;No required client authentication method&lt;/li&gt;
&lt;li&gt;No limits on extensions&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On the other hand, 2.0 defines 4 new registries for extensions, along with additional extension points via URIs. The result is a flood of proposed extensions. But the real issues is that the working group could not define the real security properties of the protocol. This is clearly reflected in the security consideration section which is largely an exercise of hand waving. It is barely useful to security experts as a bullet point of things to pay attention to.&lt;/p&gt;
&lt;p&gt;In fact, the working group has also produced a 70 pages document describing the &lt;a href="http://tools.ietf.org/html/draft-ietf-oauth-v2-threatmodel"&gt;2.0 threat model&lt;/a&gt; which does attempt to provide additional information but suffers from the same fundamental problem: there isn’t an actual protocol to analyze.&lt;/p&gt;
&lt;h3&gt;Reality&lt;/h3&gt;
&lt;p&gt;In the real world, Facebook is still running on draft 12 from a year and a half ago, with absolutely no reason to update their implementation. After all, an updated 2.0 client written to work with Facebook’s implementation is unlikely to be useful with any other provider and vice-versa. OAuth 2.0 offers little to none code re-usability.&lt;/p&gt;
&lt;p&gt;What 2.0 offers is a &lt;strong&gt;blueprint&lt;/strong&gt; for an authorization protocol. As defined, it is largely useless and must be profiles into a working solution – and that is the enterprise way.&lt;strong&gt; The WS-* way&lt;/strong&gt;. 2.0 provides a whole new frontier to sell consulting services and integration solutions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The web does not need yet another security framework.&lt;/strong&gt; It needs simple, well-defined, and narrowly suited protocols that will lead to improved security and increased interoperability. OAuth 2.0 fails to accomplish anything meaningful over the protocol it seeks to replace.&lt;/p&gt;
&lt;h3&gt;To Upgrade or Not to Upgrade&lt;/h3&gt;
&lt;p&gt;Over the past few months, many asked me if they should upgrade to 2.0 or which version of the protocol I recommend they implement. I don’t have a simple answer.&lt;/p&gt;
&lt;p&gt;If you are currently using 1.0 successfully, ignore 2.0. It offers no real value over 1.0 (I’m guessing your client developers have already figured out 1.0 signatures by now).&lt;/p&gt;
&lt;p&gt;If you are new to this space, and consider yourself a security expert, use 2.0 after careful examination of its features. If you are not an expert, either use 1.0 or copy the 2.0 implementation of a provider you trust to get it right (Facebook&amp;#8217;s API documents are a good place to start). 2.0 is better for large scale, but if you are running a major operation, you probably have some security experts on site to figure it all out for you.&lt;/p&gt;
&lt;h3&gt;Now What?&lt;/h3&gt;
&lt;p&gt;I’m hoping someone will take 2.0 and produce a 10 page profile that’s useful for the vast majority of web providers, ignoring the enterprise. A 2.1 that’s really 1.5. But that’s not going to happen at the IETF. That community is all about enterprise use cases and if you look at their other efforts like&lt;a href="http://openid.net/connect/"&gt; OpenID Connect&lt;/a&gt; (which too was a super simple proposal turned into almost a dozen complex specifications), &lt;strong&gt;they are not capable of simple&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;I think the OAuth brand is in decline. This framework will live for a while, and given the lack of alternatives, it will gain widespread adoption. But we are also &lt;strong&gt;likely to see major security failures in the next couple of years&lt;/strong&gt; and the slow but steady devaluation of the brand. It will be another hated protocol you are stuck with.&lt;/p&gt;
&lt;p&gt;At the same time, I am expecting multiple new communities to come up with something else that is more in the spirit of 1.0 than 2.0, and where one use case is covered extremely well. OAuth 1.0 was all about small web startups looking to solve a well-defined problem they needed to solve fast. I honestly don’t know what use cases OAuth 2.0 is trying to solve any more.&lt;/p&gt;
&lt;h3&gt;Final Note&lt;/h3&gt;
&lt;p&gt;This is a sad conclusion to a once promising community. OAuth was the poster child of small, quick, and useful standards, produced outside standards bodies without all the process and legal overhead.&lt;/p&gt;
&lt;p&gt;Our standards making process is broken beyond repair. This outcome is the direct result of the nature of the IETF, and the particular personalities overseeing this work. To be clear, these are not bad or incompetent individuals. On the contrary – they are all very capable, bright, and otherwise pleasant. But most of them show up to serve their corporate overlords, and it’s practically impossible for the rest of us to compete.&lt;/p&gt;
&lt;p&gt;Bringing OAuth to the IETF was a huge mistake. &lt;a href="http://hueniverse.com/2009/11/wrap-and-the-demise-of-the-oauth-community/"&gt;Not that the alternative (WRAP) would have been a better outcome&lt;/a&gt;, but at least it would have taken &lt;strong&gt;three less years&lt;/strong&gt; to figure that out. I stuck around as long as I could stand it, to fight for what I thought was best for the web. I had nothing personally to gain from the decisions being made. At the end, one voice in opposition can slow things down, but can&amp;#8217;t make a difference.&lt;/p&gt;
&lt;p&gt;I failed.&lt;/p&gt;
&lt;p&gt;We failed.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://hueniverse.com/wp-content/uploads/2012/07/oauthdead.jpg"&gt;&lt;img class="aligncenter size-full wp-image-1545" title="OAuth 2.0 Dead" src="http://hueniverse.com/wp-content/uploads/2012/07/oauthdead.jpg" alt="" width="400" height="177" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://hueniverse.com/2012/07/on-leaving-oauth/"&gt;Some more thoughts&amp;#8230;&lt;/a&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Hueniverse/~4/oaUWyZYh-cM" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://hueniverse.com/2012/07/oauth-2-0-and-the-road-to-hell/#comments" thr:count="153" />
		<link rel="replies" type="application/atom+xml" href="http://hueniverse.com/2012/07/oauth-2-0-and-the-road-to-hell/feed/atom/" thr:count="153" />
		<thr:total>153</thr:total>
	<feedburner:origLink>http://hueniverse.com/2012/07/oauth-2-0-and-the-road-to-hell/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Eran Hammer</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</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="6" />
		<link rel="replies" type="application/atom+xml" href="http://hueniverse.com/2011/12/sled-yahoo-and-moving-on/feed/atom/" thr:count="6" />
		<thr:total>6</thr:total>
	<feedburner:origLink>http://hueniverse.com/2011/12/sled-yahoo-and-moving-on/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Eran Hammer</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</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</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</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</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</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</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</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</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</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</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</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</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</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</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</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</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</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</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</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</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</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>
	</feed>
