雅虎支持OpenID,使OpenID用户数目增长了二倍(ZZ)

上周,有传闻Google将加入OpenID 2.0数字认证框架支持。但是,得到证实的却是雅虎将其二亿五千万用户加入OpenID。先前,只有一亿二千万有效OpenID 用户。Yahoo的加入,使OpenID数目增长了二倍。

雅虎表示,该服务将于1月30日进行公开测试,用户使用Yahoo ID将能够登陆超过9000家支持OpenID的网站。雅虎还宣布,届时Plaxo和JanRain将能够通过Yahoo ID登录。雅虎将整合其Sign-In Seal功能,意味着用户可以通过加载图片的方式来验证网站,这种方式被广泛应用于金融机构,以减少钓鱼威胁。

雅虎的相关部门经理Raj Patel 在电话访问中表示,“这只是我们面向OpenID的第一步。”但是他没有透露雅虎是否会进一步加入“relying party”,这将允许用户通过第三方的OpenID登录雅虎。他表示支持OpenID 是雅虎的方向,但没有进一步透露细节。

转载自:http://publish.it168.com/2008/0118/20080118039501.shtml

OpenID使用手册(ZZ)

一篇好的OpenID总结性文章——OpenID使用手册
英文原文链接:Using OpenID

OpenID 2.0协议(翻译)

这是我们组花了时间翻译的协议,在这里: openid_spec_cn_v05.doc

如何开发OpenID Consumer(Java/JSP版)

花了些时间,写了一个OpenID Consumer客户端的例子,同时也发现了一些Joid的bug也一并修改了。

在这里奉献给读者:

一个简单的JSP例子

这是一个zip包,将它改名为war包,放在Tomcat的webapps目录下,就可以发布使用了,本站也安装了这个程序,可以到:点这里看看演示,test.ttgid.com 密码请输入abc

上面的这个包中不含java部分源代码,感兴趣的可以下载:Java源码

这个代码是在Joid基础上修改而成的。

如何开发OpenID Consumer(PHP版)

本例主要使用Janrain, Inc.提供的OpenID consumer and server library和其开发的简单Consumer实例,并对其作了少许修改完善的工作。实例包可于openid.zip下载。
安装使用:
下载后解压到你的apache web文档目录下即可,浏览器中键入http://localhost/openid/consumer/,本例要求输入你的OpenID URL,并返回一些提示信息,如成功与否及成功后返回的响应。你可以查看本网站http://www.ttgid.com/openid/consumer/,了解其效果。
对于使用JanRain OpenID Library构建OpenID Consumer,一般有如下步骤:
主要分为两个部分,前半部分是Consumer发送请求,定向到Provider,后半部分为Provider提供响应并返回Consumer
前半部分
1.提供输入OpenID URL的地方,并且规范化URL;
2.初始化Auth_OpenID_Consumer 类,指定存储方式(Auth_OpenID_FileStore或SQL-based stores的一种);
3.调用Auth_OpenID_Consumer对象的’begin’方法,以OpenID URL为参数,返回一个Auth_OpenID_AuthRequest对象;
4.调用Auth_OpenID_AuthRequest的’redirectURL’ 方法,该方法应该以return_to url,trust_root为参数
后半部分,Provider返回信息后
1.浏览器返回到return_to url,这个url要包含Provider提供的一些参数
2.初始化Auth_OpenID_Consumer类,调用complete方法,解析传回的参数

了解一下XRI

企业在实施身份管理技术的时候往往会面临很多挑战。例如,一家公司可能会根据个人编号、明确的姓名或电子邮件地址来识别其员工。然而,只是识别这些标识符的类型就是一个相当困难的事情,有时根本是不可能的,而且要想为它们提供支持还需要高昂成本。 

结构化数据标准促进组织(OASIS)开发了一种统一的标识符方案,可帮助企业解决今天越来越棘手的身份管理互用性问题。可扩展资源标识符(XRI)规范建立了一种互操作的框架,可以实现标识符的表达和解析,并且在标识符与任何资源类型之间建立对应关系,其中包括个人、应用、网络设备和企业资产等资源类型。 

XRI建立于无处不在的统一资源标识符(URI)和国际化资源标识符(IRI)标准之上。XRI已经广泛应用于各种身份管理解决方案中。针对类型、语言和日期等特性的表达,XRI定义了一系列标准的方法。基于轻型HTTP和XML的XRI解析框架使请求能够迅速、方便地发现这些资源的元数据,例如,可更好地应用在本地身份管理系统中。 

XRI

        元数据不仅限于选择性的识别符。我们可以设想,一个XRI识别出的资源是一套技术手册,以PDF或Word文档的形式出现,并且可通过多种协议在各种镜像网络位置中检索出来。从广义上来说,无论该手册在任何位置,如何检索或以什么格式呈现,它都是同一个文档。XRI是在抽象层识别资源的理想方式,因为解析过程使请求能够根据需要在可用的选项中选择最佳的网络位置、恢复方式和文件格式。 

和URI一样,XRI也包含权限部分和路径部分。XRI解析可将一个XRI的权限部分和路径部分转换成一份称为XRIDescriptor的XML文档。XRIDescriptor用于描述已经识别的资源和该资源数据表现形式的检索方式。通过提供为一个资源的实际范例提供一个额外的层次, XRI可提供永久性的、牢不可破的参考,并依靠它来建立一种稳定的商业关系。 

为了使XRI技术得到广泛的采用, OpenXRI.org提供了一个免费的、可再发布的开放源代码工具集。该工具集可以集成到企业、ISP或软件厂商的架构中。工具集中包含客户端解析程序和高性能解析服务器。 

OpenXRI.org将负责该工具集的发布和维护,帮助企业在尽量不对其内部系统构成影响的情况下解决互用性问题。通过为所有类型的识别符提供一种通用的表达、解析和映射框架, XRI使企业能够提前验证其在身份管理解决方案中的投资,同时还可以尽可能地利用其现有的基础设施。

OpenXRI.org规定该工具集以Apache 2.0授权的方式发布。OpenXRI.org希望这种平民化的、可再授权的客户端和服务器软件能够促进政府和企业市场中的各类机构了解XRI在解决身份互用性问题方面的优势。

关于XRDS

这篇不是原创,主要内容摘自http://yangming.info/wordpress/2007/04/21/%e9%80%9a%e8%a1%8c%e8%af%81%e7%bb%ad%e4%ba%8c/
在强调身份管理的环境下,标识问题成为矛盾焦点。例如,一家公司可能会根据个人编号、姓名或电子邮件地址来识别其员工。然而,识别这些标识符的类型是一个相当困难的事情,有时根本是不可能的,而且要想为它们提供支持还需要高昂成本。显然,我们需要的是一种将标识和资源的对应关系建立起来的机制。

XRI

OASIS在2004年早些时候提出了XRI(eXtensible Resource Identifier),可扩展资源标识符。可扩展资源标识符规范建立了一种互操作的框架,来实现标识符的表达和解析,并且在标识符与任何资源类型之间建立对应关系,包括但不限于个人、应用、网络设备和企业资产等资源类型。XRI建立于URI和IRI标准之上。XRI针对类型、语言和日期等特性的表达,定义了一系列标准的方法。基于轻型HTTP和XML的XRI解析框架使请求能够迅速、方便地发现这些资源的元数据。

i-name

让我们来看看XRI应用的具体例子。Drummond——就是我在上篇中提到的那位,是OASIS的核心成员之一。他的其中一个i-name是=drummond。如果你使用的是带FoXRI插件的FF,在地址栏输入=drummond,那么你将接下来看到:

xri://=drummond

类似于URI,这是一个完整形式的XRI。xri://告诉我们这个资源标识的类型是XRI。而实际上,XRI本身就已经通过开头的字符(=、@、+、!等)告诉我们这是个怎样的资源,所以xri://是不需要的。这里我们已经看到了真正的XRI,那个以等号开头的字符串,一个有效的XRI。

在呈现出的页面上,我们可以看到这个标识提供了那些资源,有OpenID、contact page、forwarding,甚至还有Skype。接下来:

http://xri.net/=drummond

这是一个在目前所有浏览器下都工作的连接。xri.net代理会解析这个XRI,查询XRDS文档,一般情况下,把你带到contact page:

http://2idi.com/contact/=drummond

我们看到了Drummond的自我介绍,和一个可以用来发送消息的区域。contact page是i-name的一个重要功能,它可以让你向全世界公开你的联系方式,却不会被垃圾邮件所困扰。i-name的第二个功能是单点登录,2.0版本的OpenID标准将XRI包含了进去,你可以用你的i-name登录任何支持OpenID的网站。

为什么i-name

contact page的概念或许并没有那么激动人心,那么OpenID呢?如果你是一个OpenID的支持者,那么你一定有好几个来自不同IDP的OpenID,至少你该有一个MyOpenID的,你可以用他们横行所有支援OpenID的网站,自定义你的个人注册信息,管理受信任的站点,这些IDP全部都是免费的。

而i-name竟然是付费的。这意味着,你必须购买一个i-name来作为OpenID使用。个人i-name每年需要20美刀,组织的则要50刀。一定有个傻逼以为大家都会去买i-name来当OpenID用,可是所有的IDP都提供完全相同的OpenID功能,一分钱也不要。

那么人们到底为什么需要i-name呢?为了搞清楚这个问题,我于是买了一个i-name。不同于域名注册的火热,i-name注册商——我们称之为i-broker——少之又少,而且相关的文档评论几乎没有。我最后选择了2idi,原因是主要的i-name鼓吹者都是从那买的,比如Drummond。我的i-name是=my。

登录2idi后,首先在服务列表中找到contact page,简单的设置了一下,激活我的contact page

http://xri.net/=my

然后是SSO,就是OpenID,发现里面除了服务介绍别的一概没有。从Jyte登录试了一下,Jyte在寻找信任的时候跳转到了2idi,登录2idi,转回Jyte,一切正常。相比而言,MyOpenID就要强大的多了,他们可以让你轻松的管理你的标识和信任,调节安全系数。在这点上,2idi或许正在观望和试探性的开发,希望如此。按道理,XRI本身应该可以选择不同的资源,xri://=my中关于OpenID的一节

Type: http://openid.net/signon/1.0
URI(s):
http://2idi.com/openid/
https://2idi.com/openid/

这是指向2idi的,应该可以改为所希望的IDP,但我没有找到在哪改,又或者有别的方法?

除了contact page和OpenID,i-name目前第三个主要的应用是forwarding。类似于URL forwading,在XRI中,我们可以定义子键,让任何对子键的访问自动转向我们希望的地址,子键以“+”开头。如访问

=my/+blog 或 http://xri.net/=my/(+blog)

将转到我的博客,而

=my/+photos 或 http://xri.net/=my/(+photos)

则是我的Flickr相册。

到底为什么

和domain name解析出的ip类似的,i-name背后也有个数字化标识,称作i-number。在后台,服务其实是以识别i-number作为基础的。i-name是可以变化的而i-number则相对固定。可以这么理解ip与某个地理位置关联,而i-number与某个人关联。当我们以i-name去访问各种服务的时候,计算机记录的是我们的i-number,我们可以失去i-name、更换i-name甚至注册多个i-name,但由于i-number的固定性,我们不会丢失属于自己的各种服务。这是一个非常重要的特性,很好的解决了身份识别标识稳定性的问题,否则我们仍然逃脱不了注册一大堆帐号的命运。

同时,尽管i-name是可变的,但相对普通的网络帐号来说,仍然具备很强的稳固性。例如,我的i-name是=my,当我在风驰霓达上班的时候,你可以通过=my@fons-nitta与我进行联络——这里@fons-nitta也是i-name,就是我们上面说到的属于组织的50刀每年的标识,当我不幸被Google挖走的时候,我马上就拥有了=my@google,不需注册,没有繁琐的变更流程。

当我成家后,我的妻子除了她自己的i-name,你还可以从=my*wife看到相关联的信息。在那个时候没有计划生育了,于是我们生了两个=my*son,一个=my*son*foo,一个=my*son*bar(啊,我承认这名字起的不怎么样),同时,他们也拥有=foo和=bar,以及@RedStarSeniorSchool*foo和@RedStarSeniorSchool*bar。在这背后,所有的i-number都是固定的、唯一的、有涵义的,资源被合理而恰当的整合起来。

未来

比起我们所涉及到的这一点内容,XRI有着自己严密的规范,更多开发中的应用。有一天,或许我们就可以把自己的i-name(或者别的某种标识)印在名片上,其他人一看到,就心知肚明,知道如何去使用它。在那个时候,这种个人记号是通用的、易读的、富含信息的,并且公开的、免费的。

中国虽然不喜欢从技术底层对一种新应用进行开发完善,但确实有些实用主义的东西在慢慢成长。比如上次我们说到的身份通,其企图将个人辨识贯穿于整个社会体系中的想法,是相当勇敢和有创建性的。而在一些城市,诸如市民卡这样的区域性通行证也在逐渐推广中。杭州市民卡集个人信息、医疗保险、消费信贷、交通体系、公园娱乐等于一体,到能完全实现的那一天,一定会很有趣,很值得期待。

phpbb作为openid consumer的编码问题

在openid provider与consumer交互时遇到这样一个问题,当用户nickname是中文时,返回值即consumer页面

显示乱码,针对该问题作如下几个方面的排查:
1.provider提供url中参数,这些参数的编码最好是utf-8,而apache也不会像tomcat一样,将get方法得到的

参数默认iso-8859-1编码,这一步编码没有问题.
2.数据库编码
在mysql中有几个编码分别是 server collation client connection,可以通过修改my.cnf(my.ini,视版本而

定)设置,这几个设置最好都是utf8,保证从数据库中取出的字符为utf-8编码.
关于mysql编码问题,参考以下文档
http://imysql.cn/?q=node/20
http://hi.baidu.com/ly6cyh/blog/item/fa0d8d355893791390ef39a4.html
3.程序取数据
存入DB的openid nickname是utf8,而phpbb中文页面显示的编码是gb2312,所以要用mb_convert_encoding方

法转一次码才能正常显示,当然应该也可以设置页面编码为utf-8,同时存储文件时候选择格式为utf-8(如不

选择安装操作系统默认格式存储),由于phpbb页面数众,这里没有尝试这种方式.
程序转码请参考
http://www.uuzone.com/blog/uu_1082269/108011.htm

openid 协议(ZZ)

openid.png
1: User submits Identity URL
1:用户提交身份地址
The consumer uses a form with GET or POST to allow the user to enter their OpenID url.
应用服务器通过GET或者POST方法获得用户提交他们的OpenId地址(身份地址)
2: Consumer fetches Identity URL
2:应用服务器取得身份验证服务器
The consumer parses the HTML content and looks for a tag:

应用服务器解吸用户提交的地址的数据中的HTML标签:(其中the server 就是身份验证服务器)
3: Consumer associates with server (option 1)
3:应用服务器与身份验证服务器交互(选项1)
In order to communicate securely with the server, the consumer gets an association with the server discovered in step 2, using an existing association if it is available, otherwise visiting the server and using Diffie Hellman to negotiate a shared secret with which to sign communication. A consumer unable to store state uses “dumb mode” which does not perform this step, and instead uses step 7.
为了能够与身份验证服务器安全的通信,应用服务器需要向(从第2步获取的)身份验证服务器请求一个协议。如果有现成的可以使用的协议,则用现有的协议,否则,通过Diffie Hellman的方法获得一个共享密匙,静默模式(dumb mode)下的应用服务器不需要这一步,而是使用第7步的操作。
4: Consumer redirects the user to the server
4:应用服务器将用户重定向到身份验证服务器
The OpenID server URL accepts a query, containing all the information the server needs to check the user’s identity and redirect the user back to the consumer. The server checks the authentication of the user. If the user is signed in (has an auth cookie) and has already authorized sending their identity to the consumer, step 5 may be skipped.
OpenId服务器接受一个包含所有应用服务器需要用来验证用户的信息,如果用户已经登陆(有COOKIE)并且他已经同意发送他的身份信息给应用服务器的话,第5步可以跳过。
5: User Authenticates to server
5:用户鉴别是否是自己访问的服务
The user authenticates to the server with a cookie or a username and password, and the server asks the user for permission to send their identity information to the consumer.
通过COOKIE或者用户名+密码验证当前用户是否登陆,并且询问当前用户是否允许应用服务器获得自己的身份信息。
6: Server redirects the user back to the consumer
6: 身份验证服务器重定向用户到应用服务器
The consumer parses the servers response (which is appended to the return-to URL the consumer sent) and verifies it using the association, or in the case of dumb mode proceeds to step 7.
应用服务器使用获得的身份验证服务器的协议,校验并解析所返回的数据。如果在静默模式(dumb mode)下,继续第7步。
7: Consumer verifies the response with the server (option 2)
7:应用服务器通过身份验证服务器校验接收到的信息(选项2)
Communicating directly with the server, the dumb mode consumer checks the response received via the User Agent in the redirect.
应用服务器直接连接身份验证服务器校验接受到的信息,在静默模式下的应用服务器使用重定向的方法通过身份地址(User Agent)核对接受到的信息。
Trackback: http://tb.donews.net/TrackBack.aspx?PostId=1085110

用我们的OpenID Provider登录loopo.cn遇到问题

问题的现象,用我们提供的OpenID: http://www.ttgid.com/IdPages/test 登录http://www.loopo.cn/login?from=/ 遇到问题,不能进入本站的登录页面就报错: ERROR:Cannot find OpenID Server TAG on Identity page. 但使用http://test.ttgid.com/ 作为OpenID登录却可以进入本站的登录页面,但在返回时(URL为http://www.loopo.cn/plugins/openid/openid.php?openid.signed=assoc……)报同样的错:ERROR:Cannot find OpenID Server TAG on Identity page.

猜测一:我们在测试前曾有过失败的经历,是不是loopo的服务器将这些错误缓存了.

猜测二:难道是我们用了服务端的重定向会影响consumer服务器的判断?这种可能性应该不大

经过艰苦的跟踪,终于找到了问题的原因,是与猜测二相关的

当我用http://www.ttgid.com/IdPages/test作为ID登录loopo.cn时,服务端自动在我提供的URL地址后面加了一个”/”字符,我这边的服务器就将这个解释成一个路径而不是文件,这样重定向时就会发生错误。详细说一下,我们的IDPage中写的是
<link rel=”openid.server” href=”http://www.ttgid.com/OpenId/login” />
Loopo访问的是http://www.ttgid.com/OpenId/login/,注意最后加了一个字符。服务器在作检查之后要转向登录页面应该是http://www.ttgid.com/OpenId/login.jsp  而这里服务器错误地将它解释为http://www.ttgid.com/OpenId/login/login.jsp  当然就出错了。

知道原因了,问题就好解决了。将末尾带“/”字符的作一下特殊处理就行了!

只是这个问题曾经困惑了我很久!我猜,还有一个Openid Provider网站signon.com与Loopo配合不起来也可能是同样的原因。