当我坐下来听Verisign以及East Media的小伙子们讲述
PIP (Personal Identification Provider)和
Rails整合的时候,我就爱上了OpenID这个想法,但是我从来没有真正的花时间来研究它。我是这么想的:“有多个帐号登录有多大事呀?”。对于大多数人来说,答案仍然是“没多大事”。但是我已经看到了OpenID应用的曙光。
昨天,我花了几个小时阅读了使用OpenID登录的细节,并且在
Highrise里面将其实现。这个让我眼界打开。不光是认识到了OpenID作为另外一个登录方式是多么的简单,更重要的,我认识到了这个流程事实上是多么的合乎情理的。
是的,OpenID确实需要重新导向另外一个网站,但是只要你把一个站点的登录信息存储在OpenID里面,而且登录到你本机的PIP里面,你就再也不会看到重新导向了。一开始,这个可能看起来很可怕。不需要输入密码就可以登录到一个网站?但是再次提醒一下,这基本上和我通过
SSHKeychain在世界上任何一个地点来获得我的应用程序服务器的授权,以及所有提供“remember me”选项的网站基本相同。
这里仍然有一些问题需要解决。最主要的就是
phishing的问题。但是聪明人都是在很勤奋工作的,我确定我们肯定会想到更聪明的解决方案。我不认为这个问题和其他的未知性会有足够的理由阻止OpenID的应用。
我们现在需要的就是采纳OpenID.幸运的是,OpenID看起来已经引起了很多新创业公司以及业界巨头的注意。在后面一类里面比较引人注目的就是AOL (美国在线)最近刚刚为每个AIM 用户提供一个OpenID。每个帐号对应的OpenID链接就是
http://openid.aol.com/<screenname>. 这个解决方案的简单性就是让我今天开始实现OpenID功能的部分动力。不需要申请任何新东西就能使用OpenID有很大的作用,最起码方便它的起步。
让它变的简单到什么都不用做一样
现在我们理论上有几百万AIM的用户拥有了OpenID的帐号。太好了。现在他们只需要有一两个地方可以真正用到OpenID.这就是技术起到作用的地方。软件工具箱。也就是“让它变的简单到什么都不用一样”。虽然现在已经有很多为Ruby设计来实现这个功能的生成器,但是我总体上对生成器或者类似的需要学习如何使用或者设置规范的工具不大感冒。我更喜欢试着去找到一个简单到不费吹灰之力就可以使用的智能API。
今天我使用Ruby的第一个尝试被列在下面 (没多久我就会把它封装成一个插件):
class SessionController < ApplicationController
include OpenIdAuthentication
def create
if open_id?(params[:name])
open_id_authentication(params[:name])
else
password_authentication(params[:name], params[:password])
end
end
private
def password_authentication(name, password)
if @current_user =
@account.users.find_by_name_and_password(name, password)
successful_authentication
else
failed_authentication "Sorry, that username/password doesn't work"
end
end
def open_id_authentication(identity_url)
authenticate_with_open_id(identity_url) do |status, identity_url|
case status
when :missing
failed_authentication "Sorry, the OpenID server couldn't be found"
when :canceled
failed_authentication "OpenID verification was canceled"
when :failed
failed_authentication "Sorry, the OpenID verification failed"
when :successful
if @current_user =
@account.users.find_by_identity_url(identity_url)
successful_authentication
else
failed_authentication "Sorry, no user by that identity URL exists"
end
end
end
end
end
你额外需要做的就是实现successful_authentication这个负责创建会话和重新导向到这个应用的过程/函数;以及failed_authentication这个负责弹出提示错误的flash信息和重新导向到登陆界面。params[:name]这个参数既可以是一个常规的用户名,也可以是一个OpenID的用户名。我通过判断输入变量是否看着像URL (以http开头)来决定输入的是哪一种。底层的验证机制被委托给
ruby-openid的类库。
这段代码仍然只是半成品。它只实现了授权的部分,而不是生成新帐号和获得额外属性的部分。但是它毕竟是一个开始,我为之而激动。
我真心相信OpenID有很大的可能性会变的真实而且使用,即使是对那些仅仅听到“授权”这个术语就要打哈欠的人。这个不会一夜就能发生,而且除了我们都加入进来,贡献自己的微薄之力,这一天肯定不会到来。今天这些实现的东西已经开了一个很好的头。同志们,少找借口,多干实事。
如果这还不能打动你,那请考虑Firefox 3将要自动带有对OpenID的支持,而且微软也在同一条船上。突然之间,一个OpenID在所有网站运用的未来变的非常的现实。
原文链接: http://www.loudthinking.com/arc/000604.html