1. 网上找了半天,参考资料很少,好不容易写了一个,记录下来,
package com.jiuqi.crcc.controller;import java.net.URLEncoder;
import java.util.List;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.openid4java.consumer.ConsumerManager;
import org.openid4java.consumer.InMemoryConsumerAssociationStore;
import org.openid4java.consumer.InMemoryNonceVerifier;
import org.openid4java.consumer.VerificationResult;
import org.openid4java.discovery.DiscoveryInformation;
import org.openid4java.discovery.Identifier;
import org.openid4java.message.AuthRequest;
import org.openid4java.message.AuthSuccess;
import org.openid4java.message.MessageExtension;
import org.openid4java.message.ParameterList;
import org.openid4java.message.ax.AxMessage;
import org.openid4java.message.ax.FetchRequest;
import org.openid4java.message.ax.FetchResponse;
import org.openid4java.message.sreg.SRegMessage;
import org.openid4java.message.sreg.SRegResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;/*** * <p>* TODO OpenID认证* (需要填写loginUrl的具体地址,以及完善returnVerify()方法中的认证通过后的处理)* </p>** <p>* Copyright: 版权所有 (c) 2002 - 2008<br>* Company: 久其* </p>** @author* @version */
@Controller
@RequestMapping("/openid")
public class OpenIdSecurity {/** 一些专有名词: EU:End User,用户。 RP:Relying Party ,用来代指OAuth2中的受信任的客户端,身份认证和授权信息的消费方;* * OP:OpenID Provider,有能力提供EU身份认证的服务方(比如OAuth2中的授权服务),用来为RP提供EU的身份认证信息;* * ID-Token:JWT格式的数据,包含EU身份认证的信息。* * UserInfo Endpoint:用户信息接口(受OAuth2保护),当RP使用ID-Token访问时,返回授权用户的信息,此接口必须使用HTTPS*/// openid认证地址(请求地址)private String ENDPOINT = "认证地址";private String loginUrl="填写需要登录的网址";private static final Logger LOGGER = LoggerFactory.getLogger(OpenIdSecurity.class);public final ConsumerManager manager = new ConsumerManager();@RequestMapping("/login")public void login(HttpServletRequest request, HttpServletResponse response) throws Exception {// 创建ConsumerManager对象,这个对象是保持与OP端的通信的if (request.getAttribute("consumermanager") == null) {ConsumerManager newmgr = new ConsumerManager();// setAssociations方法设置与OP的关联存放的位置,这里我们将它存放在内存newmgr.setAssociations(new InMemoryConsumerAssociationStore());// setNonceVerifier方法设置记录response_nonce的位置。newmgr.setNonceVerifier(new InMemoryNonceVerifier(5000));request.setAttribute("consumermanager", newmgr);}// 告诉OP认证完成之后返回到哪个URL// String returnToUrl = "http://https://work.cr23g.com";String returnToUrl = "http://localhost:7007/openid/return";
//      String returnToUrl = "http://jmcauley.ucsd.edu/data/amazon/";// 对用户提供的标识符执行发现List discoveries = manager.discover(ENDPOINT);// 检索一个服务端点进行身份验证DiscoveryInformation discovered = manager.associate(discoveries);// 存储在用户Session中发现的 信息request.getSession().setAttribute("openid-disc", discovered);// 比较重要,通过关联句柄以及returnURL准备OP需要的参数以及参数值// 获取要发送到OpenID提供程序的AuthRequest消息AuthRequest authReq = manager.authenticate(discovered, returnToUrl);// attribute Exchange获取用户信息:FetchRequest fetch = FetchRequest.createFetchRequest();fetch.addAttribute("fullname", "http://openid.net/schema/namePerson/friendly", true);fetch.addAttribute("email", "http://openid.net/schema/contact/internet/email", true);// 将扩展附加到身份验证请求authReq.addExtension(fetch);// 重定向到OP认证  ENDPOINTresponse.sendRedirect(authReq.getDestinationUrl(true));}/*** 验证openid OP便将用户重定向到RP,并发送认证信息给RP,RP需要接受认证信息,检查是否认证通过,获取用户信息,然后进行后续的处理。* * @param request* @param response* @throws Exception void*/@RequestMapping("/return")public void returnVerify(HttpServletRequest request, HttpServletResponse response) {String fullname = null;String email = null;try {// 获取ConsumerManager认证对象ConsumerManager manager = (ConsumerManager) request.getAttribute("consumermanager");// 获取响应参数列表ParameterList params = new ParameterList(request.getParameterMap());DiscoveryInformation discovered = (DiscoveryInformation) request.getSession().getAttribute("openid-disc");StringBuffer url = request.getRequestURL();String query = request.getQueryString();if (query != null && query.length() > 0) {url.append("?").append(query);}// 根据参数列表,关联句柄以及url_query验证是否通过认证VerificationResult verification = manager.verify(url.toString(), params, discovered);Identifier verified = verification.getVerifiedId();if (verified != null) {AuthSuccess authSuccess = (AuthSuccess) verification.getAuthResponse();// 两种获取用户属性的方式处理是不同的,所以在return_url中这两种方式都要考虑到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");fullname = regResp.getAttributeValue("fullname");}} 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);fullname = (String) fetchResp.getAttributeValues("fullname").get(0);}}System.out.println(email + ">>>>>>>>" + fullname);// OpenID中没有提供Email或者姓名信息处理,验证通过跳转页面if(email==null|email.length()==0) {}else if(fullname==null|fullname.length()==0){}else {//进行url编码,防止特殊字符被转义email=URLEncoder.encode(email, "UTF-8");response.sendRedirect(loginUrl + "?email=" + email);}// 后续的处理}} catch (Exception e) {LOGGER.error(e.getMessage(), e);}}}

OpenID使用方法相关推荐

  1. 公众号h5获取手机号权限_微信公众号h5获取用户openId的方法和步骤

    微信h5静大享上.是发了概开程态间些告人屏果会区.默.非静默授权获取用户openId的方法和步骤微和二第说,班.都年很过过事发工开宗定据发指互数个遍前互就: 一.openId是什么? openId享. ...

  2. 最新小程序获取个人信息头像名称openid等方法

    最新小程序获取个人信息头像名称openid等方法 一.利用标签显示头像和用户名(用于展示微信开放的数据) <open-data type="userNickName"> ...

  3. 微信公众号h5获取用户openId的方法和步骤

    微信h5静默.非静默授权获取用户openId的方法和步骤: 一.openId是什么? openId是用户在当前公众号下的唯一标识('身份证'),就是说通过这个openId,就能区分在这个公众号下具体是 ...

  4. 微信h5静默、非静默授权获取用户openId的方法和步骤

    微信h5静默.非静默授权获取用户openId的方法和步骤: 一.openId是什么? openId是用户在当前公众号下的唯一标识('身份证'),就是说通过这个openId,就能区分在这个公众号下具体是 ...

  5. 微信OPENID授权方法

    今天搞了下微信授权, 总结了下微信的授权规则与步骤 先来几个关键字 Openid  微信ip(属于唯一指向公众号的id) redirect_uri  授权回调地址 State 回调地址带参数 Appi ...

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

    微信公众号的配置和专业名词就不介绍了,不懂的问度娘,我就直接上代码  点击下载完整demo 先说一下我的demo放的位置: 微信H5授权登录分两种: ① 静默授权:snsapi_base,没有弹窗,只 ...

  7. 微信公众号和微信小程序获取OPENID的方法

    无论是微信小程序还是微信公众号获取OPENID都需要先获取code 获取code String url = "https://open.weixin.qq.com/connect/oauth ...

  8. code换取微信openid_关于PHP如何获取微信的openID教程

    使用微信接口,无论是自动登录还是微信支付我们首先需要获取的就是openid,获取openid的方式有两种,一种是在关注的时候进行获取,这种订阅号就可以获取的到,第二种是通过网页授权获取,这种获取需要的 ...

  9. 微信oauth2接口获取用户的openid

    当微信的菜单类型是view型时,就需要通过"网页授权获取用户基本信息"接口来获取了,具体接口使用大家自己到微信公众平台去查看文档吧.这里只简述我的方法吧 如果大家view的设置链接 ...

最新文章

  1. kali linux samba,Kali Linux 渗透测试:SMB、SMTP扫描工具(14)
  2. 优化XCode的编译速度
  3. 没学过python、但是还是有公司要-扎心!“我学了半年 Python,还是找不到工作”...
  4. 文巾解题 17. 电话号码的字母组合
  5. java 存放大数字_我可以使用什么变量类型在java中保存大量数字(30位数)?
  6. html选择器_css的9个常用选择器
  7. 图像傅里叶变换频谱分析
  8. 50-000-040-配置-MAC 安装MySQL my.cnf配置文件
  9. eclips3.4.2 添加 tomcat6.0不可用解决——重新搞
  10. POJ 1741 Tree(树的点分治)
  11. 感染暴风一号u盘病毒的解决办法
  12. 网络时代课堂教学模式整合的探索
  13. 全球传统证券外汇交易商进军区块链数字资产·统计(一)
  14. Spring IoC 详解(下篇)
  15. 自己DIY word2010脚注和尾注没有的格式
  16. OpenGL绘制旋转六面体并纹理贴图
  17. 南极大冒险/零下八度/南极物语/8只雪橇犬
  18. 和女友一起学技术,她去了字节,我去了华为
  19. 用速腾16线激光雷达跑gmapping
  20. 风影ASP.NET基础教学 6用户控件

热门文章

  1. 仓库管理用什么软件?哪些仓库管理软件适合中小商户?
  2. Release Notes
  3. 高速差分信号AC交流耦合电容
  4. 火力全开2不显示服务器,火力全开2搜不到服务器怎么办 需要root吗
  5. 西恩科技冲刺深交所:半年营收10.7亿 赵志安部分股权被冻结
  6. 波士顿动力又有黑科技:两足轮式机器人这样搬箱子
  7. Vuex固化插件下载
  8. ADS-B原理及ADS-B OUT功能验证测试概述
  9. gpio引脚编号计算 GPIO1_20,那么引脚编号就可能等于 1 x 32 + 20 = 54。
  10. HPE向服务器新增故障保护的NVDIMM技术