`
tihualong
  • 浏览: 27197 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

OpenID登录之去掉yahoo的欺诈警告

阅读更多

当你花了好几天的时间理解了OpenID协议并写好你的OpenID Consumer的程序进行测试的时候,你是否发现了这个现象:使用你的程序所有的OpenID都可以通过认证并且能获取到用户属性,除了Yahoo!OpenID,而且Yahoo!还出现了下面这段警告。你向你的老板解释:其他的账号都可以认证,只有Yahoo!的账号不行,应该是Yahoo!的服务器出问题了,可能过一段时间就好。然后老板满意的走了,你擦擦头上的汗,晚上加班到深夜去找问题到底出在哪。

Warning: This website has not confirmed its identity with Yahoo! and might be fraudulent. Do not share any personal information with this website unless you are certain it is legitimate.

我可以很负责任的告诉你:这不是Yahoo!的问题,是你的程序出问题了。

不过为什么其他的OpenID可以登录呢?因为其他的OpenID提供者同时支持OpenID1.1OpenID2.0协议,但是Yahoo!的程序员像我们一样不喜欢考虑兼容性的问题。只支持OpenID2.0协议标准。

那么OpenID2.0协议标准有什么特殊的地方呢?

OpenID2.0中提出了一个新的东西叫做OpenID Relying Party discovery的,我们的问题就出在这个OpenID Relying Party discovery

先解释一下这个OpenID Relying Party discovery是什么东西。

当你重定向到OpenID提供者站点去请求认证的时候,OpenID提供者会使用这个叫做OpenID Relying Party discovery的机制自动验证return_toURL处于指定的范围内,并且与OP通过realm参数获取到的XRDS文档中获取到的return_toURL相同。

我是这么理解的:我的Consumer程序告诉了OP我的return_to地址是什么,但是OP不信任我,要通过我的realm参数(注意:这个地方是OPRP发出的请求,所以要求你realm参数的url必须是外网的ip地址或者能通过外部的DNS查找到的域名)查找一个基于yadis协议的XRDS文档中的return_to地址,两个return_to地址相比较,如果相同,好,我相信你了,放行。(不知道这样理解有没有问题,我觉得应该没问题吧J)

好,原理理解了。下面我们要做的就是:

1 编写一个XRDS文档保存到你的网站上,存放成什么扩展名的没什么关系,但是你要保证Yahoo或者其他OP获取到这个文档的Content-Type是” application/xrds+xml”,不然他们会认为这个文档不是他们要找的文档。

2 将你第一步编写的XRDS文档的地址公布在你网站的首页,或者你的openid.realm参数指定的页面上(建议)

我们先来编写XRDS文档:(起名xrds.jsp)

<%response.setContentType("application/xrds+xml");%>
<?xml version="1.0" encoding="UTF-8"?> 
<xrds:XRDS xmlns:xrds="xri://$xrds" xmlns:openid="http://openid.net/xmlns/1.0" xmlns="xri://$xrd*($v*2.0)">
	<XRD>
		<Service xmlns="xri://$xrd*($v*2.0)">
			<Type>http://specs.openid.net/auth/2.0/return_to</Type>
			<URI>http://xxx.xxx.xxx.xxx/openid_returnurl.jsp</URI>
		</Service>
	</XRD>
</xrds:XRDS>

 

或者你也可以这样:

<%@page import="java.io.PrintWriter"%>
<%
	response.setContentType("application/xrds+xml");
	String xrd = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <xrds:XRDS xmlns:xrds=\"xri://$xrds\" xmlns:openid=\"http://openid.net/xmlns/1.0\" xmlns=\"xri://$xrd*($v*2.0)\">\n"
			+ "<XRD>\n"
			+ "<Service xmlns=\"xri://$xrd*($v*2.0)\">\n"
			+ "<Type>http://specs.openid.net/auth/2.0/return_to</Type>\n"
			+ "<URI>http://uop.wecoo.com/home/openid_returnurl.jsp?login=true</URI>\n"
			+ "</Service>\n" + "</XRD>\n" + "</xrds:XRDS>";
	PrintWriter writer = response.getWriter();
	writer.write(xrd);
%>

 

你的任务就是将URI标签中的URL改成你的return_url

好了,第二步:(将你编写的XRDS文档的地址公布在openid.realm指定的页面或者首页,建议单独写一个页面维护,然后设置openid.realm参数为你创建的这个页面)

在你创建的页面(起名realm.jsp)编写如下代码:

<%response.setHeader("X-XRDS-Location","http:// xxx.xxx.xxx.xxx/xrds.jsp");%>
<html>
	<head>
		<meta http-equiv="X-XRDS-Location" content="http://xxx.xxx.xxx.xxx/xrds.jsp"/>
	</head>
</html>

 

也就是设置responseheader或者在<head>标签中设置meta,参数名需要是X-XRDS-Location参数值就是你的xrds文档的地址。这里我们设置双保险。因为Yahoo不认识<meta>,难保别的网站不认识response header

在重定向认证之前将openid.realm的值设置为authReq.set("openid.realm","http://xxx.xxx.xxx.xxx /realm.jsp");

注意:如果你将X-XRDS-Location设置在其他页面,这个页面唯一要注意的是不能有重定向,不然OpenID服务提供者会获取不到XRDS文档。这个,费那么大劲做了等于没做,所以我们建议单独做一个网页

好了,现在试试还有没有欺诈警告提示。不要告诉我还有哦,呵呵。但是问题又来了,警告是没有了,但是还是获取不到用户属性啊,为什么呢?Yahoo!的这一功能还是处于测试期,现在只有Plaxo,Jyte两个网站能使用这一功能,所以暂时不要考虑这个东西了,回家吧,不用因为这个加班了。

 

5
0
分享到:
评论
2 楼 xxian2012 2013-04-24  
这么多年过去了,这篇文章仍然有用  
1 楼 linkerlin 2010-08-16  
最近也在用openid哎。
我用的也是openid4java.
python和c++的实现都太不靠谱了。

相关推荐

    tp微信获取openid并登录的demo

    tp框架获取openid并登录的demo,并且成功,分享给大家

    uniapp微信h5授权获取用户openId的方法和步骤,用于用户登录和注册

    微信h5授权获取用户openId的方法和步骤,用于用户登录和注册,代码已经封装好,下载就能用

    OpenID的Java客户端 JOpenID_OpenID_java_

    当用户尝试登录支持OpenID的网站时,网站会重定向用户到其选择的OpenID提供者进行身份验证,之后提供者会将验证结果返回给网站,完成身份验证过程。 **二、JOpenID库的核心功能** 1. **身份解析**:JOpenID库能够...

    php-openid-2.1.3

    用户只需要注册一个OpenID提供商(通常称为OP),然后可以使用这个提供商的URL作为身份标识,在支持OpenID的网站上进行登录。这样,用户不再需要记住每个网站的用户名和密码,减少了密码管理的复杂性,并降低了因...

    php-微信公众号联合登录&微信小程序获取openid&头条获取openid

    php-微信公众号联合登录&微信小程序获取openid&头条获取openid,遇到问题可以@我

    java微信获取OpenId

    微信开发获取openId

    openid资料大全

    开发者可以利用这个库在自己的Java应用程序中集成OpenID功能,让用户能够使用他们的OpenID登录。 这个压缩包可能包含以下内容: 1. **OpenID协议文档**:这些文档详细解释了OpenID协议的工作原理,包括认证流程、...

    微信公众号网页授权登录获取openID.zip

    微信网页授权登录,获取用户openID,开发人员可以将获取到的用户openID作为用户名保存到数据库,作为登录凭据

    OpenID简介及与struts2_spring_hibernate框架集成

    OpenID 的主要作用在于简化身份验证过程,减轻用户的记忆负担,并且提高了安全级别,因为用户的登录信息只存储在他们选择的OpenID提供者那里,而不是分散在各个使用OpenID的网站。 3. **OpenID是什么** OpenID ...

    微信小程序获取OpenID +php后端完整源代码

    总的来说,这个压缩包提供的是一套完整的微信小程序获取OpenID的解决方案,包含前后端代码,适合初学者快速了解和实践微信小程序的登录授权流程。开发者只需按照说明配置好自己的AppID和AppSecret,即可在自己的环境...

    Python库 | plone.app.openid-2.1.0.zip

    plone.app.openid-2.1.0库是Plone社区对这一标准的实现,使得Plone平台可以支持OpenID登录,提高了用户体验,同时也简化了网站管理员的管理任务。 此库的核心功能包括: 1. **OpenID消费者实现**:plone.app....

    OpenID教程 项目集成

    这个教程将深入探讨如何将OpenID集成到您的项目中,帮助您为用户提供更加方便、安全的身份验证体验。 一、OpenID基础 1. **OpenID原理**:OpenID的核心思想是用户拥有自己的身份URL(Uniform Resource Identifier...

    C#获取openid(详解)

    本代码作用于前后端分离获取微信openId,调用说明:在api中新建一个Default.aspx页面,复制文件中代码到页面中,修改appid,key,webAddr值。部署api;前端跳转url:api地址+“/efault.aspx?reurl="+前端页面地址;如果...

    openID sample server

    根据提供的文件信息,我们可以从中提炼出关于OpenID的相关知识点,主要围绕着OpenID的基本概念、工作原理以及示例代码中的具体实现来进行详细说明。 ### OpenID 概念 OpenID 是一种开放标准协议,用于在网络上进行...

    PHP获取微信公众号用户的Openid

    PHP如何获得Openid,微信公众号通过appid和appsecret获取Openid,该类实现了从微信公众平台获取code、通过code获取openid和access_token、

    php获取微信code.openid.名字和头像

    在PHP开发中,微信API是常见的接口之一,用于实现微信用户与网站的交互。本文将详细解释如何使用PHP获取微信用户的code、openid、名字和头像。这些信息对于构建微信登录、用户授权等功能至关重要。 首先,我们需要...

    Java的OpenID服务器 JOIDS

    Java的OpenID服务器JOIDS(Java OpenID Server)是一个基于Java开发的身份验证解决方案,它实现了OpenID协议,允许用户在不共享个人详细信息的情况下,在不同的网站之间进行身份验证。OpenID是一种分散式身份验证...

    获取微信openid工具类

    在IT行业中,微信OpenID是一种标识用户在微信生态系统中的唯一标识符。这个工具类的目的是帮助开发者方便地、静默式地获取用户的OpenID,从而实现与微信平台的无缝对接。静默式获取意味着用户无需进行额外的操作,...

    腾讯qq 的openId java版

    总的来说,这个Java版的QQ OpenID实现是一个简化流程,让开发者能快速集成QQ登录功能,避免了自行解析复杂协议的困扰。通过这个开源项目,开发者可以参考代码结构,了解每个步骤的实现细节,从而更好地理解和应用...

Global site tag (gtag.js) - Google Analytics