qq 第三方登录 前后端实现
微信扫一扫关注个公众号。谢谢各位
第一步:https://connect.qq.com/去此网站进行授权(需要用到域名,域名需要备案通过)
审核通过后。拿到appid
第二步:前端定义个按钮,为按钮绑定好事件(client_id==appid)
window.location.href ="https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=******&state=register&redirect_uri="+encodeURI("http://zhdydet.xyz:8085/api/qqLogin");//http://zhdydet.xyz:8085/api/qqLogin===>回调地址(qq第三方)
第三步:编写后台回调代码
//具体此代码要根据业务来。我这边用的是shiro权限框架。回调后。默认进行shiro登录授权,以及根据openid进行添加和修改用户信息
@RequestMapping("/qqLogin")
public void qqLoginAfter(HttpServletResponse response, HttpServletRequest request) {try{HttpSession session = request.getSession();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 Exception("QQ,state错误");}}//Step2:通过Authorization Code获取Access TokenString url = "https://graph.qq.com/oauth2.0/token?grant_type=authorization_code"+"&client_id=" + QQHttpClient.APPID +"&client_secret=" + QQHttpClient.APPKEY +"&code=" + code +"&redirect_uri=" + QQHttpClient.CALLBACK;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;User user = userService.selectByOpenId(openid);JSONObject jsonObject = QQHttpClient.getUserInfo(url);String avatarImg = jsonObject.getString("figureurl_qq");String nickname = jsonObject.getString("nickname");String gender = jsonObject.getString("gender");User user1 = new User();Subject subject = SecurityUtils.getSubject();if(user == null){user1.setRealName(nickname);user1.setPicture(avatarImg);user1.setOpenID(openid);user1.setUserName(openid);String salt = getSalt();user1.setSalt(salt);String password = MD5Utils.MD5Encode(openid+"_"+salt+"_"+"123456","utf-8");user1.setPassword(password);user1.setRoleId(5);user1.setAddTime(new Date());this.userService.insertUser(user1);UsernamePasswordToken info = new UsernamePasswordToken(openid, "123456");subject.login(info);// response.sendRedirect("/api/index");}else{user1.setRealName(nickname);user1.setPicture(avatarImg);user1.setOpenID(openid);user1.setUserName(openid);user1.setId(user.getId());user1.setUpdateTime(new Date());this.userService.updateUser(user1);UsernamePasswordToken info = new UsernamePasswordToken(openid, "123456");subject.login(info);}redisTemplate.opsForValue().set("user:info"+":"+subject.getSession().getId(),user1,1L, TimeUnit.HOURS);response.sendRedirect("/api/index");response.setStatus(200);}catch (IOException e){}
}
QQHttpClient类
需要用到的maven依赖
<!--httpclient-->
<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.6</version>
</dependency>
package com.bus.utils;import com.alibaba.fastjson.JSONObject;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;import java.io.IOException;/*** @author wwz* @date 2019-07-24* @descrption:*/
public class QQHttpClient { //QQ互联中提供的 appid 和 appkeypublic static final String APPID = "**********";public static final String APPKEY = "*********";public static final String CALLBACK = "http://zhdydet.xyz:8085/api/qqLogin";private static JSONObject parseJSONP(String jsonp){int startIndex = jsonp.indexOf("(");int endIndex = jsonp.lastIndexOf(")");String json = jsonp.substring(startIndex + 1,endIndex);return JSONObject.parseObject(json);}public static String getAccessToken(String url) throws IOException {CloseableHttpClient client = HttpClients.createDefault();String token = null;HttpGet httpGet = new HttpGet(url);HttpResponse response = client.execute(httpGet);HttpEntity entity = response.getEntity();if(entity != null){String result = EntityUtils.toString(entity,"UTF-8");if(result.indexOf("access_token") >= 0){String[] array = result.split("&");for (String str : array){if(str.indexOf("access_token") >= 0){token = str.substring(str.indexOf("=") + 1);break;}}}}httpGet.releaseConnection();return token;}public static String getOpenID(String url) throws IOException {JSONObject jsonObject = null;CloseableHttpClient client = HttpClients.createDefault();HttpGet httpGet = new HttpGet(url);HttpResponse response = client.execute(httpGet);HttpEntity entity = response.getEntity();if(entity != null){String result = EntityUtils.toString(entity,"UTF-8");jsonObject = parseJSONP(result);}httpGet.releaseConnection();if(jsonObject != null){return jsonObject.getString("openid");}else {return null;}}public static JSONObject getUserInfo(String url) throws IOException {JSONObject jsonObject = null;CloseableHttpClient client = HttpClients.createDefault();HttpGet httpGet = new HttpGet(url);HttpResponse response = client.execute(httpGet);HttpEntity entity = response.getEntity();if(entity != null){String result = EntityUtils.toString(entity,"UTF-8");jsonObject = JSONObject.parseObject(result);}httpGet.releaseConnection();return jsonObject;}
}
感谢观看,可以在微信搜索公众号 威信交流,以后准备在 公众号更新一些文章
qq 第三方登录 前后端实现相关推荐
- 微信第三方登录前后端分离实现思路
微信第三方登录前后端分离实现思路 前端实现 这里说一下前后端的思路,页面加载时声明一个变量state='时间戳+6位随机数', 前端路径生成二维码, 其中有个state参数需要我们传递,这个参数你传什 ...
- facebook第三方登录前后端分离
facebook第三方登录三种实现方式:第三种我认为方便简单 1.js sdk 直接在官网看文档 直接调用他的sdk 官网:https://developers.facebook.com/docs/f ...
- python实现QQ第三方登录
应用接入前,首先需进行申请,获得对应的appid与appkey,以保证后续流程中可正确对网站与用户进行验证与授权.http://wiki.connect.qq.com/__trashed-2 QQ登录 ...
- Vue + Java 实现QQ第三方登录授权
一.前言 Vue 实现QQ第三方登录授权需要获取到 APP_ID和回调域地址,关于这2个的获取方式可以参考小编的另外一篇文章 Java 实现QQ第三方登录 温馨小提示: 本文基于springboot+ ...
- QQ第三方登录-QQ互联开发者申请的坑(个人接入,时间:2019-6-3)
本人博客全部迁至个人博客,柒情博客:http://www.ityw.club ,后续所有博客将在柒情博客上进行更新. 前阵子项目准备使用QQ第三方登录,需要使用QQ第三方登录的话需要申请QQ互联认证, ...
- web实现QQ第三方登录
web实现QQ第三方登录 开放平台-web实现QQ第三方登录 应用场景 web应用通过QQ登录授权实现第三方登录. 操作步骤 1 注册成为QQ互联平台开发者, http://connect.qq.c ...
- 公司网站如何让用户使用QQ第三方登录
我们做了一个中农物联网系统,为了简化用户使用门槛,并保证用户资料安全,准备在自身的用户管理基础上加入第三方登录,主要是QQ登录.微信二维码扫描登录.手机微信登录等. QQ第三方登录,用的是QQ ...
- JavaWeb实现QQ第三方登录
在开发过程中需要使用QQ第三方登录,但发现网上的资料都有点不同,很多还有些误导,这里就详细说下具体的实现吧! 1.在QQ互联上申请成为开发者 网址:https://connect.qq.com/ind ...
- QQ第三方登录报错error=-1
qq 第三方登录报错error=-1 再次实例化qc类.
最新文章
- “深度学习一点也不难!”
- JAR软件转APK,在线转换器
- python算法与数据结构-快速排序算法(36)
- CodeForces 839D - Winter is here | Codeforces Round #428 (Div. 2)
- Windows7下Docker的安装
- 分治算法兵乓球比赛日程(java)
- 使用TensorFlow.js的AI聊天机器人六:生成莎士比亚独白
- U 盘无法拷贝大于 4GB 文件的解决方法
- mysql主从复制延迟问题的相关知识与解决方案
- [TJOI 2015] 线性代数
- 测试了几款mysql监控工具
- qt在linux下编译资源文件,linux下Qt qrc文件的编写与应用
- 人机工程学产品设计案例_专业解读——产品设计
- Linux-tftp、tftpd-pha安装、使用、配置教程
- Joplin使用坚果云WebDAV同步存在的问题以及解决办法
- NameNode作用
- [Fourier]傅里叶级数中虚数部分j去了哪里
- 坪山体育中心体育馆全景不同高度展示
- 第一章 略说中医的学习与研究(4)
- 真正解决Could not transfer artifact org.springframework.bootspring-boot-starter-parentpom
热门文章
- 【Mybatis+spring整合源码探秘】--- mybatis整合spring事务原理
- ICS与NAT上网结构
- 清华学生“边骑车边用电脑”走红,被封“学堂路车神”!本人回应
- 华为不能设置默认闹钟铃声
- 淇℃伅 Tomcat日志乱码的办法
- 67-套接字超时(select)
- 2012时刻保持一颗感恩的心
- [CISCN2020]-rceme
- 消费新品周报 | 李宁推出超轻16代跑鞋;天梭表发布11款全新腕间时计作品
- xp系统无线配置服务器,TP-Link无线路由器上网设置(XP 系统)