OpenID4java的验证失败问题
最近在使用OpenID做一个开发,碰到一个问题,就是当RP使用consumerManger.verify验证OP发过来的请求时,出现异常,提示:
java.net.ConnectException: Invalid argument。
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl .java:
333)
at java.net.PlainSocketImpl.connectToAddress
(PlainSocketImpl.java:195)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.j ava:182)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.j ava:366)
at java.net.Socket.connect(Socket.java:519)
网上查了一些资料,有些说是JDK 的bug,有些说是网络的问题,但我一直没有解决这个问题,困扰了好久。
做了个测试,在RP的返回页面中http://myweb/myReturn.jsp中对OP传递过来的值验证时,如果执行verify("http://myweb/myReturn.jsp",requestList,discover),则提示异常;如果将地址改成另外一个随便的地址,比如http://myweb/test.jsp,执行 verify("http://myweb/test.jsp",requestList,discover) ,则没有提示异常,能正常执行,只是验证肯定是不通过的。
感觉就是验证时,在当前页面中对当前的地址进行验证,就出现异常,也不知道为什么会这样,也不知道是不是网络的问题,因为不清楚verify这个函数里面到底是怎样进行验证的。
我的环境是SUSE+tomcat+JDK1.6.0,使用的是OpenID4java包。
若有相关方面的信息,请给我留言,非常感谢!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我也在研究这个东西,可以交流一下:QQ:9526749。
我已经用OpenID4java架了一个RP,可以完成完整的登录验证过程,现在研究怎么架OP服务,遇到一些问,可以互相交流。
在RP发现OP时,有些资料中说使用HTML 代码,在<HEAD>标签中提供:
<link rel="openid2.provider" href="http://openid.com/server/endpoint/url"/>
这一个怎么理解?是不是加入这个link后,consumerManager.discover时就不和OP通讯了,直接认定http://openid.com/server/endpoint/url为OP端的地址?
昨天改了一下,verify验证时出现了这个错误:0x704: I/O transport error
代码基本上和OpenId4java中的例子一样的:
<%@ page session="true" %>
<%@ page import="org.openid4java.discovery.Identifier, org.openid4java.discovery.DiscoveryInformation, org.openid4java.message.ax.FetchRequest, org.openid4java.message.ax.FetchResponse, org.openid4java.message.ax.AxMessage, org.openid4java.message.*, org.openid4java.OpenIDException, java.util.List, java.io.IOException, javax.servlet.http.HttpSession, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, org.openid4java.consumer.ConsumerManager, org.openid4java.consumer.InMemoryConsumerAssociationStore, org.openid4java.consumer.VerificationResult" %>
<%
ConsumerManager manager=(ConsumerManager) pageContext.getAttribute("consumermanager", PageContext.APPLICATION_SCOPE);
try
{
// --- processing the authentication response
// extract the parameters from the authentication response
// (which comes in as a HTTP request from the OpenID provider)
ParameterList responselist =
new ParameterList(request.getParameterMap());
// retrieve the previously stored discovery information
DiscoveryInformation discovered =
(DiscoveryInformation) session.getAttribute("openid-disco");
// extract the receiving URL from the HTTP request
StringBuffer receivingURL = request.getRequestURL();
String queryString = request.getQueryString();
if (queryString != null && queryString.length() > 0)
receivingURL.append("?").append(request.getQueryString());
// verify the response; ConsumerManager needs to be the same
// (static) instance used to place the authentication request
VerificationResult verification = manager.verify(receivingURL.toString(),responselist, discovered);
// examine the verification result and extract the verified identifier
Identifier verified = verification.getVerifiedId();
if (verified != null)
{
AuthSuccess authSuccess =
(AuthSuccess) verification.getAuthResponse();
session.setAttribute("openid", authSuccess.getIdentity());
session.setAttribute("openid-claimed", authSuccess.getClaimed());
response.sendRedirect("."); // success
}
else
{
%>
Failed to login!
<%
}
}
catch (OpenIDException e)
{
// present error to the user
out.println("login error:"+e.getMessage());
}
%>