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

OpenID4Java的使用

阅读更多

OpenID4Java现在实现了OpenID1.1OpenID2.0规范。但是对于属性交换规范支持的不是很好,不过好像这也不能怪人家OpenID4Java,某些openid provider不按照规矩来(比如google),某些Provider是按照规矩来了,但是现在还处于测试期 (比如yahoo!),属性交换的功能只是提供给有限的几个站点(plaxoJyte)—可怜我捣鼓了两天之后才偶然间发现这个噩耗,呃无语

OpenID4Java现在由code.google.com来维护,可在http://code.google.com/p/openid4java/下载,当前版本是openid4java-0.9.2-bundle.jar。呃...刚想查一下版本号,突然发现怎么有个Deprecated标记,难道夭折了?

不管它了,还是看看OpenID4Java怎么使用比较重要,这才是本文的目的所在不是J

第一步:创建ConsumerManager对象,这个对象是保持与OP端的通信的,所以说在认证会话的整个生命周期中,RP需要保证ConsumerManager是同一个实例化对象。

    if(application.getAttribute("consumermanager") == null){
           ConsumerManager newmgr=new ConsumerManager();
            newmgr.setAssociations(new InMemoryConsumerAssociationStore());
            newmgr.setNonceVerifier(new InMemoryNonceVerifier(5000));
            application.setAttribute("consumermanager",newmgr);
    }

这里我们将对象设置为application范围,目的是将相关密钥保存在同一位置,以免在大量请求到来时,引起性能下降。setAssociations方法设置与OP的关联存放的位置,你可以把它存在内存或者数据库或者xml或者文件中,这个随你喜欢咯,这里我们将它存放在内存。setNonceVerifier方法设置记录response_nonce

的位置。

万事俱备,只欠redirect(如果你不需要什么特殊服务的话J)

现在RP可以将用户重定向到OP,当然你需要设置好return_url,告诉OP认证完成之后返回到哪个URL,我们在那个URL进行后续的处理。

String returnToUrl = "http://xxx.xxx.com/openid_returnurl.jsp";
//比较重要,通过关联句柄以及returnURL准备OP需要的参数以及参数值
AuthRequest authReq = manager.authenticate(discovered, returnURL);
//重定向到OP认证
request.sendRedirect(authReq.getDestinationUrl(true));

以上这三行代码准备好op需要的参数以及参数值,将用户重定向到OP,在OP端,用户输入用户名密码或者其他方式登录系统,OP会询问用户是否同意RP的认证请求。

注意:以上代码只是在RP不需要用户提供其他信息的情况下的代码,如果要求用户提供其他信息,比如emailgenderdate of birthcountry等等需要在重定向之前添加额外的请求参数。比如RP可以要求用户必须提供email,有选择的提供性别,生日,国家等信息:

OpenID协议提供了两种方式获取用户信息:

第一种:

AuthRequest authReq = manager.authenticate(discovered,returnToUrl);
FetchRequest fetch = FetchRequest.createFetchRequest();
fetch.addAttribute("email", "http://axschema.org/contact/email", true);
fetch.addAttribute("gender", " http://schema.openid.net/contact/gender ", false);
fetch.addAttribute("dob", " http://schema.openid.net/contact/language", false);
fetch.addAttribute("country", " http://schema.openid.net/contact/country", false);
authReq.addExtension(fetch);

第二种:

SRegRequest regReq = SRegRequest.createFetchRequest();
regReq.addAttribute("email",true);
regReq.addAttribute("gender",false);
regReq.addAttribute("dob",false);’
regReq.addAttribute("country",false);
authReq.addExtension(regReq);

需要注意的是并不是所有的OP都支持两种方式获取用户信息。通过google提供的OpenID API可以看到google只支持第一种方式,而且要求参数必须是openid.ns.ext1 openid.ext1.modeopenid.ext1.type.emailopenid.ext1.required,可以看到google要求参数名必须是ext1的形式而且查看openid4java的源代码可以看到使用addExtension方法并不是很好所以建议如果需要获取用户信息可以将两种获取信息的方式都加上,而且最好是第一种在前,第二种在后。如果将第一种放在后面,最后提交给OP数就会变成ext0的形式。google就会认为不是合法的请求,所以不提供email(当前google只提供用户的email信息,其他信息暂时无法提供)

有关google openid api的具体信息可以参考http://code.google.com/intl/zh-CN/apis/accounts/docs/OpenID.html

另外如果不想受两种获取信息方法顺序的限制,还可以有两种办法解决参数问题:

1重写或者重载Message.addExtension(MessageExtension extension)方法修改参数生成规则。

2 regReq.getParameters().set(new Parameter("openid.ext1.required ","email"));直接设置必须的参数。

另外:openid4java-0.9.2(也就是最新版本)中使用的属性交换协议是http://openid.net/srv/ax/1.0-draft,而google要求属性交换协议要求是http://openid.net/srv/ax/1.0需要单独设置,如果设置不正确,仍然不能获取到用户信息。

用户同意RP的认证请求之后,OP便将用户重定向到RP,并发送认证信息给RPRP需要接受认证信息,检查是否认证通过,获取用户信息,然后进行后续的处理。

//获取ConsumerManager认证对象
ConsumerManager manager=(ConsumerManager)application.getAttribute("consumermanager");
//获取响应参数列表
ParameterList params = new ParameterList(request.getParameterMap());
DiscoveryInformation discovered = (DiscoveryInformation)session.getAttribute("discovered");
StringBuffer url = request.getRequestURL();
String query = request.getQueryString();
if(StringUtils.isNotBlank(query)){
	url.append("?").append(query);
}
//根据参数列表,关联句柄以及url_query验证是否通过认证
VerificationResult verification = manager.verify(url.toString(),params,discovered);
Ientifier verified = verification.getVerifiedId();

上面谈到的两种获取用户属性的方式处理是不同的,所以在return_url中这两种方式都要考虑到

if(verified != null){
	String email = null;
	AuthSuccess authSuccess = (AuthSuccess)verification.getAuthResponse();
	if(authSuccess.hasExtension(SRegMessage.OPENID_NS_SREG)){
	MessageExtension ext = authSuccess.getExtension(SRegMessage.OPENID_NS_SREG);
	if(ext instanceof SRegResponse){
		SRegResponse regResp = (SRegResponse)ext;
		email = regResp.getAttributeValue("email");
		}
	}
	else if (authSuccess.hasExtension(AxMessage.OPENID_NS_AX)){
		MessageExtension ext = authSuccess.getExtension(AxMessage.OPENID_NS_AX);
		if (ext instanceof FetchResponse){
		    FetchResponse fetchResp = (FetchResponse) ext;
		    email = (String)fetchResp.getAttributeValues("email").get(0);
		}
	}
	if(StringUtils.isBlank(email));// OpenID中没有提供Email信息
	//后续的处理
} 

以上是RP ConsumerOP的交互过程,这个过程能保证与大部分的OP通信没有问题,但是有少数号称完全遵守规范OpenID2.0OP站点仍然有一些小问题(比如yahoo!),当然使用这段代码还是可以通过认证的,但是yahoo!会给用户一个大大的提示:Warning: This website does not meet Yahoo!'s requirements for website address. Do not share any personal information with this website unless you are certain that it is legitimate.

意思是:你这个站点得按规定来,不然我向用户告密说你可能是欺诈网站,建议用户不要跟你这个站点分享任何信息。这叫我们不能忍受,怎么办呢?怎么做才能去掉这个提示呢。要解释这个需要一篇单独的文章了。想知道的明天请早J

4
0
分享到:
评论

相关推荐

    openid4java文档(英文的,html格式)

    openid4java的参考文档,很好的学习openid4java的资料

    OpenID的Java客户端 JOpenID_OpenID_java_

    本文将深入探讨JOpenID库的使用、核心概念以及如何在Java应用中集成OpenID验证。 **一、OpenID简介** OpenID的核心理念是让用户拥有自己的身份,而不是在每个网站上创建独立的账号。它通过URL作为身份标识,用户...

    openid4java-master.zip

    4. **库的使用**:开发者可以使用`openid4java`库来添加OpenID认证功能,这通常涉及设置URL映射、配置库参数以及处理OpenID请求和响应。库提供了`ConsumerManager`和`ServerManager`类,分别用于处理依赖方和身份...

    java微信获取OpenId

    微信开发获取openId

    java后台获取微信用户的openId并返回

    java+Springmvc实现获取微信用户唯一标识openId并返回

    OpenID的Java客户端 JOpenID

    OpenID的Java客户端 JOpenID

    腾讯qq 的openId java版

    下面将详细介绍QQ OpenID在Java中的实现原理、步骤以及关键知识点。 首先,理解OpenID的概念。OpenID是一种开放标准,允许用户使用一个统一的身份(即OpenID)在多个网站上进行身份验证。这种方式减少了用户记住多...

    JAVA源码OpenID的Java客户端JOpenID

    JAVA源码OpenID的Java客户端JOpenID

    java获取微信小程序openid

    在Java编程环境中,获取微信小程序的OpenID是一项关键任务,特别是在构建与微信小程序交互的后端服务时。OpenID是微信小程序用户身份的一种标识符,它允许应用在遵循微信平台安全策略的同时,识别并管理不同用户。...

    小程序通过Code换取OpenId(后台为Java)

    微信小程序的用户信息获取需要请求微信的服务器,通过小程序提供的API在小程序端获取CODE,然后将CODE传入到我们自己的服务器,用我们的服务器来换取session_key和openid。 小程序端比较简单,从教程的API部分把...

    java资源OpenID的Java客户端 JOpenID

    java资源OpenID的Java客户端 JOpenID提取方式是百度网盘分享地址

    openid资料大全

    OpenID是一种开放的身份验证...通过学习这些资源,开发者不仅可以理解OpenID的基本工作流程,还能掌握如何在Java环境中使用openid4java库实现OpenID的身份验证服务,从而提升其在身份管理和安全认证方面的专业技能。

    外文翻译--面向Java-Web应用程序的OpenID.doc

    我们不会手动实现OpenID认证规范,而是使用openid4java库和一个popular OpenID提供商myOpenID来创建一个安全可靠的注册过程。 OpenID是一种去中心化的认证机制。使用OpenID,我可以证明我拥有一个URI,如...

    java源码:OpenID的Java客户端 JOpenID.rar

    Java作为广泛使用的编程语言,自然也有相应的库来支持OpenID的实现,其中JOpenID就是一款成熟的Java客户端库。本文将深入探讨JOpenID库的使用和核心概念,旨在帮助开发者更好地理解和应用OpenID技术。 首先,...

    Java的OpenID服务器 JOIDS

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

    外文文献翻译---面向java-web应用程序的openid-学位论文.doc

    在 Java Web 应用程序中,OpenID 可以使用 openid4java 库来实现身份验证。Openid4java 库提供了一个简洁的 API,允许开发者轻松实现 OpenID 身份验证。 在 Java Web 应用程序中,OpenID 身份验证可以分为三个步骤...

    外文翻译 面向Java Web应用程序的OpenID.doc

    通过使用openid4java库和第三方OpenID提供者,开发者可以轻松地在应用中集成OpenID,提升用户体验。而在文章的第二部分,我们将进一步探讨如何构建自定义的OpenID提供者,从而完全控制认证流程。

    外文文献翻译---面向java-web应用程序的openid本科学位论文.doc

    在本文的第二部分中,我们将介绍如何创建自己的 OpenID 提供商,并指导读者如何使用 openid4java 库来实现 OpenID 认证系统。 OpenID 认证机制可以提高 Java Web 应用程序的安全性和用户体验,而 openid4java 库和 ...

Global site tag (gtag.js) - Google Analytics