`
猫不吃的鱼
  • 浏览: 159200 次
  • 性别: Icon_minigender_1
  • 来自: 芜湖市
社区版块
存档分类
最新评论

结合openId身份识别

    博客分类:
  • JAVA
阅读更多
openID是一个分散式身份识别协议,在其基础上实现了网上身份认证系统。可以将您的系统使用openID来作为用户登录,让你的程序支持opendID。我使用的是http://www.openid.org.cn/ 作为openID提供商,使用openid4java库编写openID依赖方。
以下根据openid4java文档写的一个demo

发起openID请求的action
//yuyong 2012-2-10
public class OpenIDLoginAction extends ActionSupport implements ServletRequestAware,ServletResponseAware{
   private ISampleConsumerManager sampleConsumerManager;
	private AuthRequest authReq;
	private String openID=null;
    ActionContext context = ActionContext.getContext();    
    HttpServletRequest request = null;    
    HttpServletResponse response = null;  
    Map<String,Object>pm=null;
    String actionURL;
	public String execute()throws Exception{
		if(openID!=null&&openID.startsWith("http://")){
			openID=openID.replaceAll("http://", "");
		}
		String returnToUrl="http://localhost:8181/SSO/firstPageAction.action";
		ActionContext context = ActionContext.getContext();
		Map params = context.getParameters();
		authReq=sampleConsumerManager.authRequest(openID, returnToUrl,request,response, request.getSession());
		Map<String,Object>pm=authReq.getParameterMap();
		this.pm=pm;
		this.actionURL=authReq.getOPEndpoint();
		request.setAttribute("pm", pm);
		request.setAttribute("actionURL", authReq.getOPEndpoint());
		return SUCCESS;
	}

}


将用户的OpenID帐户和返回url封装成openID请求 AuthRequest
//yuyong 2012-2-10
public class SampleConsumerManager implements ISampleConsumerManager{
	public ConsumerManager manager;
	
	public SampleConsumerManager()throws ConsumerException{
		manager=new ConsumerManager();
		manager.setAssociations(new InMemoryConsumerAssociationStore());
		manager.setNonceVerifier(new InMemoryNonceVerifier(5000));
	}
	
	//将openID,返回url封装为一个openID请求
	public AuthRequest authRequest(String userSuppliedString,
			String returnToUrl, HttpServletRequest httpReq,
			HttpServletResponse httpResp,HttpSession session)
			throws IOException {
		try {
			List discoveries=manager.discover(userSuppliedString);
			DiscoveryInformation discovered=manager.associate(discoveries);
			session.setAttribute("discovered", discovered);
			AuthRequest authReq=manager.authenticate(discovered, returnToUrl);
			httpResp.sendRedirect(authReq.getDestinationUrl(true));
			return authReq;
		} catch (DiscoveryException e) {
			e.printStackTrace();
		} catch (MessageException e) {
			e.printStackTrace();
		} catch (ConsumerException e) {
			e.printStackTrace();
		}
		
		return null;
	}
        //验证openID登录验证的返回
	public Identifier verifyResponse(HttpServletRequest httpReq,
			HttpSession session) throws IOException {
		ParameterList openidResp=new ParameterList(httpReq.getParameterMap());
		DiscoveryInformation discovered=(DiscoveryInformation) session.getAttribute("discovered");
		StringBuffer receivingURL=httpReq.getRequestURL();
		String queryString=httpReq.getQueryString();
		if(queryString!=null&&queryString.length()>0)
			receivingURL.append("?").append(httpReq.getQueryString());
		try {
			VerificationResult verification=manager.verify(receivingURL.toString(), openidResp, discovered);
			Identifier verified=verification.getVerifiedId();
			return verified;
		} catch (MessageException e) {
			e.printStackTrace();
		} catch (DiscoveryException e) {
			e.printStackTrace();
		} catch (AssociationException e) {
			e.printStackTrace();
		}
		
		return null;
	}

}


应用程序验证openID请求验证的返回
//yuyong 2012-2-10
public class FirstPageAction extends ActionSupport implements ServletRequestAware,ServletResponseAware{
	private ISampleConsumerManager sampleConsumerManager=null;
	private HttpServletRequest request=null;
	private HttpServletResponse response=null;
	private HttpSession session=null;
	public String execute()throws Exception{
		if(sampleConsumerManager.verifyResponse(request, session)!=null)
			return SUCCESS;
		else 
			return ERROR;
	}
}


struts.xml
<action name="openIDLoginAction" class="openIDLoginAction">
        <param name="openID">
        	http://yuyongwuhu.openid.org.cn/
        </param>
        	<result name="success">/continue.jsp</result>
</action>
        
<action name="firstPageAction" class="FirstPageAction">
        <result name="success">/success.jsp</result>
        <result name="error">/error.jsp</result>
</action>


continue.jsp 提交封装后的openID请求到openID OP端
<body onload="document.forms['openid-form-redirection'].submit();">
    <form id="openid-form-redirection" action="<s:property value="#request.actionURL"/>">
    	<s:iterator value="#request.pm">
    		<input type="hidden" name="<s:property value="key"/>" value="<s:property value="value"/>" />
    	</s:iterator>
    </form>
</body>


只是为了实现第一个demo,只是为了看到效果,所以代码组织的不太规范。
大致过程是 SampleConsumerManager 通过Discovery进程,根据用户OpenID的帐户
定位到相应的openID提供商,然后将相应参数提交到openID op端的action。
op端提供一个页面输入密码。验证成功后,返回到 returnToUrl ,应用中,在
returnToUrl中的action验证op的response。
1
0
分享到:
评论

相关推荐

    网络游戏-基于计算机网络的身份识别系统.zip

    《网络游戏-基于计算机网络的身份识别系统》是一份深入探讨在线游戏领域中身份验证技术的资料。这份资料的核心在于如何在虚拟世界中确保玩家的真实身份,从而保障网络安全、防止欺诈行为,以及维护游戏环境的公平性...

    java获取微信小程序openid

    OpenID是微信小程序用户身份的一种标识符,它允许应用在遵循微信平台安全策略的同时,识别并管理不同用户。下面我们将深入探讨如何在Java中实现这一功能,并涉及与之相关的其他小程序操作。 首先,你需要注册成为...

    C#获取微信小程序openid等用户信息(前端+asp.net服务器端代码)

    openid是微信为每个小程序用户分配的一个唯一标识,它用于识别用户,而不会泄露用户的微信号。在2018年微信小程序的改版后,为了增强安全性,开发者不能直接在小程序前端调用微信的API获取openid,必须通过自己的...

    转:浅析作用于web2.0安全防范的OpenID和Oauth机制.pdf

    - **身份验证与授权分离**:OpenID负责用户的认证过程,而OAuth则专注于授权管理,两者相辅相成,共同构建起一套完整且安全的身份管理体系。 - **增强隐私保护**:通过OpenID与OAuth的结合使用,用户可以更好地控制...

    .NET 用户身份验证

    4. OAuth和OpenID Connect:现代Web应用常用的第三方身份验证协议,允许用户通过第三方服务(如Google、Facebook等)进行身份验证。 二、Forms身份验证 Forms身份验证是Web开发中最常用的机制,尤其在ASP.NET中。...

    发票识别微信小程序已发布

    openid是微信平台为每个用户生成的唯一标识符,用于保护用户隐私的同时实现用户身份验证,确保只有合法用户可以访问和使用小程序。 OCR识别技术在此处扮演了关键角色。发票通常是图像形式,包含大量文字信息,如...

    网络安全 身份认证技术

    最后,身份认证协议如Kerberos、OAuth、OpenID等,为不同系统和应用之间的身份验证提供了标准和框架。这些协议确保了安全的身份交换,并且通常包括了多重身份验证的元素,提高了整体安全性。 在计算机网络安全领域...

    springboot+微信小程序用codeid换取openid.zip

    OpenID是微信用户在小程序中的唯一标识,用于安全地识别用户身份。 在微信小程序的开发中,当用户授权后,小程序会返回一个code码,这个code是临时的,但它是获取OpenID的关键。开发者需要将这个code发送到自己的...

    身份认证系统 网络安全

    总结来说,一个有效的身份认证系统是网络安全的基础,它结合了多种技术手段和设计理念,以确保用户身份的正确性,并且在保障安全的同时,也要考虑到用户体验和系统可扩展性。通过不断优化和升级,身份认证系统能够在...

    C#获取的企业微信的用户身份

    总之,利用C#和企业微信的API,我们可以轻松地构建一个能够识别和管理企业微信用户身份的应用。通过VS2016的开发环境和SQL2008数据库支持,我们可以构建稳定且功能强大的系统。在这个过程中,理解并熟练掌握C#编程、...

    行业分类-设备装置-基于多元身份的证书签发方法.zip

    1. 身份验证流程的改进:详细说明了如何在证书申请过程中结合多种身份验证手段,可能包括在线与离线验证的结合。 2. 安全策略:如何设置和实施针对不同级别的用户和设备的个性化安全策略。 3. 证书生命周期管理:...

    基于深度学习的情感识别开放平台.pdf

    OpenID则用于身份认证,它允许用户使用一个单一的账户登录多个不同的网站。这种认证和授权机制可以确保用户在使用情感识别服务时的安全性,同时也保护了用户数据的隐私。 该平台的实现和案例研究,验证了平台的可行...

    行业分类-设备装置-基于PaaS平台的身份认证方法以及身份认证设备.zip

    4. 身份认证设备:在PaaS环境中,身份认证可能涉及多种设备,如智能手机、智能卡、硬件安全模块(HSM)、生物识别设备等。这些设备为用户提供便捷的认证方式,同时增强了系统的安全性。 5. PaaS平台上的身份认证...

    08-identity-in-ten-hundred-words.zip

    标题“08-identity-in-ten-hundred-words”似乎是指一个关于身份识别技术的专题,而描述中的“08-identity-in-ten-hundred-words”可能代表这是该系列的第八部分,专注于通过一千个词来简洁地阐述身份识别的主题。...

    行业-电子政务-用于识别特许用户的电子控制系统、方法及其程序.zip

    5. 身份验证服务:利用中央身份管理系统,如OAuth或OpenID Connect,可以集中管理用户身份和访问权限。 电子控制程序的设计则需要考虑系统的易用性、可靠性和可扩展性。这可能涉及到: 1. 安全设计原则:如最小...

    身份验证de

    另外,OpenID Connect是基于OAuth的协议,为身份验证添加了一个层,使得服务提供商能够验证用户身份,而无需直接处理用户密码。这种开放标准促进了跨平台的单点登录(SSO)体验。 身份验证还涉及到会话管理和会话...

    统一身份认证设计方案及对策最终版共35页.pdf.zi

    4. **协议标准**:可能会涉及OpenID Connect、SAML 2.0等身份验证协议,这些协议允许不同系统之间的安全通信和身份验证信息交换。 5. **安全性与隐私**:设计中的安全措施至关重要,包括数据加密、防止中间人攻击、...

    身份认证系统技术方案共23页.pdf.zip

    1. **身份认证的类型**:身份认证通常分为基于知识的认证(如密码)、基于拥有的认证(如智能卡)和基于生物特征的认证(如指纹或面部识别)。方案可能会分析各种类型的优缺点以及在不同场景下的适用性。 2. **多...

Global site tag (gtag.js) - Google Analytics