Federated Login has been
closely examined by so
many parties that I'm surprised there isn't a published guide on best practices. There is still so much left to do in the arena that trying to implement a flexible and just "better" authentication and signup system gets frustrating.
Standing on the shoulders of giants that are pontificating doesn't get you anything but a nosebleed.
I have a work (as in, the day job that pays the bills) task to improve cohesion, retention and reduce confusion. Sounds like a job for a more robust login system to me. When I think of a more robust login system, I immediately think of Federated Login and making use of OpenID and other methodologies to increase cohesion.
I launched Roostermatic with OpenID support, with the intention of experimenting with some ideas there on a smaller codebase and then hopefully expanding those offerings into a more robust solution for work. The problem is that it isn't quite so analogous as I had hoped.
Work has membership ID numbers (to register for most events, you have to purchase a membership), the current legacy identity token is email which isn't so great because amongst non-tech users email changes and they continue to login with their email address. Which isn't valid anymore, because they never told us their new email.
What inevitably happens is they simply create a new account and buy a membership, then we lose their history (which is important when dealing with things like racing licenses).
This is why I think the dialog that says, quite directly, "Do you already have a password?" helps. Then the option of "No, help me login" makes more sense. However, it doesn't address the point that "identity" is increasingly variable.
With OpenID and other auth solutions in the mix (Google Auth, Facebook, etc) now the identity itself becomes confusing.
At this point, I think that we're going to see a natural decentralization of web applications and the idea of Federated Login is simply a growing pain in that direction.
To clarify what I mean by natural decentralization of web applications is a tendancy to be built using RESTful principles and various APIs, which are then exposed based on context. So, perhaps rather than decentralization think of it more in terms of "
Contextual Web Applications".
Now, I do mean something subtly different in the two terms and I'll hope to clarify the distinctions.
Decentralization means that the applications themselves are decentralized. You can see this already happening with Dashboard widgets (Google Homepage, etc) and even to a lesser extent with Facebook applications.
Applications are context-aware, but even more importantly they're beginning to have different front-ends that talk to the same backends. It's a refinement from a foundational application that doesn't have a user-facing interface. Instead, it has web-services interface that talks to a refinement stack that then serves the application based on context.
This is where the Contextual Web meets Decentralization. It is perfectly feasible for an application to join several applications and splice them together based on context. To further the point, I'll bring back my work example.
I manage the application stack for an event management and registration system. This handles users who need to purchase a membership, manage their competition licenses, and finally register for events. It also allows the individuals who host the races to setup the race information, scheduling, and specific items.
It obviously is a case of a singular application, right? I'm not so sure anymore. Why should our application care about event scheduling? There is a great deal of code that goes into tracking the dates that is pointless. If we stored a reference to another application that handled the scheduling, we would end up with less code and offset a lot of responsibility. The hidden gain is that our events would be broadcasted to a larger audience.
The work would be simple, too. Create an event object, which has a relationship to a Google Calendar entry that tracks the dates, stores the location and description. We would have a very simple event object at this point, that only serves as a conduit from our application stack to Google Calendar. And, the next step is tracking the individual racing groups that can be purchased. This is where our application requires explicit trust, since we deal with money.
I have, however, reduced our application space down significantly by using a different application to store the scheduling information.
This is how I view decentralization. To move on to Contextual Web piece, this is the front-end applications. An application should be aware of who the user is, and through what environment the application is being used.
This means that if a user authenticates through Facebook, consider redirecting to a built-in facebook view (if possible). Or, assume a user enters through a Google Calendar link to the site, support Google Auth and attempt to pull in authentication information from Google Auth. All of these things will require action on the end-users part (accepting that the site wants to use OpenID, Facebook Auth, Google Auth, etc) but the experience can be mostly seamless I believe. Especially if context is preserved. Our events don't require our full-fledged application to be used for registration, just that we control the connection. By this, we could have an iframe view inside of Facebook so if a user wants to register for an event a friend has registered for, they could do it without ever leaving Facebook. Only on the users first time inside the application would we require them to associate their membership with their Facebook account, and that check would be simple because we'd just have to ask if they had a membership previously. If they did not, we just add that into the shopping cart and they check out entirely on Facebook.
We email them the receipt, they get their purchase history available to them, and we invite them to create a password on the main site. The membership ID number or Facebook authentication mechanism will be associated at the time of creation, or, when they provide their membership number to register for the event. This would, of course, require a change to the registration page to allow them to input (and verify) their membership ID.
We do have a bit of an advantage over other sites because our members come to see us in person, so our fraud rates are ridiculously low. People also can't really try anything bad, because our accounting is easily able to be audited and verified.
I'm still thinking of how to do these things on more general purpose applications, but I fully believe this is the way forward for web applications. I hope, anyway.