前期准备工作1.云服务器
2.备案的域名
3.本地调试需要修改hosts文件 , 将域名映射到127.0.0.1
申请QQ互联 , 并成为开发者申请QQ互联创建应用时需要备案域名 , 所以建议提前准备备案域名 。
QQ互联:https://connect.qq.com/index.html
登录后 , 点击头像 , 进入认证页面 , 填写信息 , 等待审核 。
文章插图
审核通过后创建应用
文章插图
应用创建通过审核后 , 就可以使用App ID 和 APP Key
文章插图
前期工作就这些了 , 后面可以开始写代码了 。
项目结构:
文章插图
properties或者yml配置文件(这里就是简单的配置了一下 , 可以自行添加数据库等配置)
server.port=80server.servlet.context-path=/ #qq互联qq.oauth.http:QQ互联中申请填写的网站地址
文章插图
在pom中添加依赖
<!--httpclient--><dependency><groupId>org.Apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.6</version></dependency><!--阿里 JSON--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.47</version></dependency>
发送QQ登录请求定义全局变量获取配置文件中的网站地址
@Value("${qq.oauth.http}")private String http;
定义登录回调地址(可以用网站地址拼接或者直接写)//QQ互联中的回调地址String backUrl = http + "/index";
文章插图
登录请求方法代码
【Java如何实现QQ第三方登录】
@GetMapping("/qq/login")public String qq(HttpSession session) throws UnsupportedEncodingException {//QQ互联中的回调地址String backUrl = http + "/index";//用于第三方应用防止CSRF攻击String uuid = UUID.randomUUID().toString().replaceAll("-","");session.setAttribute("state",uuid);//Step1:获取Authorization CodeString url = "https://graph.qq.com/oauth2.0/authorize?response_type=code"+"&client_id=" + QQHttpClient.APPID +"&redirect_uri=" + URLEncoder.encode(backUrl, "utf-8") +"&state=" + uuid;return "redirect:" + url;}
正确返回示例:JSON示例:
Content-type: text/html; charset=utf-8{"ret":0,"is_lost":0,"nickname":"Peter","gender":"男","country":"中国","province":"广东","city":"深圳","figureurl":"http://imgcache.qq.com/qzone_v4/client/userinfo_icon/1236153759.gif","is_yellow_vip":1,"is_yellow_year_vip":1,"yellow_vip_level":7,"is_yellow_high_vip": 0}
错误返回示例Content-type: text/html; charset=utf-8{"ret":1002,"msg":"请先登录"}
用户资料的接口文档:https://wiki.open.qq.com/wiki/v3/user/get_info请求成功 , 用户确认登录后回调方法
@GetMapping("/index")public String qqcallback(HttpServletRequest request, HttpServletResponse response) throws Exception {HttpSession session = request.getSession();//qq返回的信息String code = request.getParameter("code");String state = request.getParameter("state");String uuid = (String) session.getAttribute("state");if(uuid != null){if(!uuid.equals(state)){throw new QQStateErrorException("QQ,state错误");}}//Step2:通过Authorization Code获取Access TokenString backUrl = http + "/index";String url = "https://graph.qq.com/oauth2.0/token?grant_type=authorization_code"+"&client_id=" + QQHttpClient.APPID +"&client_secret=" + QQHttpClient.APPKEY +"&code=" + code +"&redirect_uri=" + backUrl;String access_token = QQHttpClient.getAccessToken(url);//Step3: 获取回调后的 openid 值url = "https://graph.qq.com/oauth2.0/me?access_token=" + access_token;String openid = QQHttpClient.getOpenID(url);//Step4:获取QQ用户信息url = "https://graph.qq.com/user/get_user_info?access_token=" + access_token +"&oauth_consumer_key="+ QQHttpClient.APPID +"&openid=" + openid;//返回用户的信息JSONObject jsonObject = QQHttpClient.getUserInfo(url);//也可以放到redis和MySQL中 , 只取出了部分数据 , 根据自己需要取session.setAttribute("openid",openid);//openid,用来唯一标识qq用户session.setAttribute("nickname",(String)jsonObject.get("nickname")); //QQ名session.setAttribute("figureurl_qq_2",(String)jsonObject.get("figureurl_qq_2")); //大小为100*100像素的QQ头像URL//响应重定向到home路径return "redirect:/home";}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Java线程池原理解析
- 漏洞利用复现,看看黑客如何入侵服务器
- Spring Boot 如何解决项目启动时初始化资源
- MySQL读写分离?MySQL主从复制原理?如何解决主从同步延时?
- CentOS 7集群间实现NFS文件共享
- 系统内置工具,macOS如何屏幕共享?
- 苹果电脑 Mac如何个性化设置文件图标?
- 微信如何进行有效的宣传?
- win7电脑桌面便签内容被误删怎么办?该如何恢复?
- 上等的菊花茶应如何挑选