SpringBoot集成QQ第三方登陸的實(shí)現(xiàn)
一、什么是第三方登錄,第三方登陸平臺(tái)如何選擇
1.簡(jiǎn)介
第三方登錄不得不說(shuō)的一個(gè)優(yōu)勢(shì):那就是本地注冊(cè)和第三方注冊(cè)的選擇。雖然這是一個(gè)不能稱(chēng)之為問(wèn)題的問(wèn)題,其中的心理學(xué)不得不說(shuō):做為一個(gè)app的新用戶(hù),你有兩個(gè)選擇:1.做一個(gè)很受歡迎的用戶(hù),注冊(cè)帳號(hào),完善信息,over。2.選用第三方登錄/注冊(cè),簡(jiǎn)單方便。二者供你選擇,隨心挑選。
2.普通注冊(cè)分多種情況:
1.傳統(tǒng)的注冊(cè)方式,注冊(cè)門(mén)檻較高,易在注冊(cè)頁(yè)面流失用戶(hù)。 2.第三方登錄后,隨機(jī)分配一個(gè)id 3.郵件注冊(cè),id手動(dòng)填寫(xiě)并且不能重復(fù) App開(kāi)發(fā)過(guò)程中登錄的選擇還是視情況而定。
3.用戶(hù)眼中的第三方登陸
第三方登錄簡(jiǎn)單快捷,每天面對(duì)不同的平臺(tái)不同的登錄界面能有一種簡(jiǎn)單登錄的方式再好不過(guò)了。第三方登錄可以將自己在某個(gè)app的動(dòng)態(tài)信息同步到各個(gè)sns平臺(tái),這一功能無(wú)疑攬了一大批“懶”用戶(hù),瀟瀟灑灑一號(hào)走江湖。不免擔(dān)心的是第三方登錄有很多資料信息可以公用,比較保守的人就慎重了,互聯(lián)網(wǎng)時(shí)代,信息也保密不到哪去。
4.本地客戶(hù)端眼中的第三方登錄
簡(jiǎn)化登錄過(guò)程,降低注冊(cè)門(mén)檻,更能獲取海量用戶(hù),在爭(zhēng)搶用戶(hù),提高用戶(hù)轉(zhuǎn)化率注冊(cè)量是不可缺少的重要因素。本地注冊(cè)的穩(wěn)定+第三方登錄的便捷才是最合適的登錄方案。
5.第三方登錄平臺(tái)該如何選擇
謂的第三方登錄,就是利用用戶(hù)在第三方平臺(tái)上已有的賬號(hào)來(lái)快速完成自己應(yīng)用的登錄或者注冊(cè)的功能。而這里的第三方平臺(tái),一般是已經(jīng)有大量用戶(hù)的平臺(tái),如國(guó)內(nèi)關(guān)注度較高的騰訊QQ互聯(lián)平臺(tái) 、百度第三方賬號(hào)登陸,一登人臉登錄等等。更多關(guān)于第三方登錄,第三方登錄平臺(tái),第三方登錄SDK,集成過(guò)程及開(kāi)發(fā)建議可百度“開(kāi)發(fā)者服務(wù)”學(xué)習(xí)。
好了,上面說(shuō)了這么多,也是無(wú)濟(jì)于事,我們開(kāi)始我們的正餐
二、QQ第三方平臺(tái)介紹:
1.基本要求:
我們需要有自己的服務(wù)器
我們需要自己的域名(且已備案)
如果上面的要求沒(méi)有到達(dá),那就趕快去實(shí)現(xiàn)吧。。。。
2.平臺(tái)介紹:
2.1進(jìn)入官網(wǎng)首頁(yè):
https://connect.qq.com/index.html
2.2審核信息:(需要提交信息審核)

2.3創(chuàng)建網(wǎng)站應(yīng)用

2.4創(chuàng)建成功(需要審核通過(guò)后才能使用)

2.5查看信息

OKOK,到這一步我們的介紹信息就完成了,起始跟代碼一點(diǎn)關(guān)系還沒(méi)有。
我們前提工作要做哈。基礎(chǔ)搭建好,根基才穩(wěn)。。。:tw-1f38e: :tw-1f38f:
三、實(shí)戰(zhàn)教程
1.基礎(chǔ)配置:
1.1首先還是我們的關(guān)心的POM文件(只添加了QQ的依賴(lài))
<!-- QQ登錄依賴(lài)包 -->
<dependency>
<groupId>net.gplatform</groupId>
<artifactId>Sdk4J</artifactId>
<version>2.0</version>
</dependency>
1.2 application.yml文件:
這里就不用列出來(lái)了,只配置了一個(gè)端口:server.port=80
1.3 qqconnectconfig.properties(qq登陸相關(guān)的配置文件)
app_ID =(這里就是你的應(yīng)用的APPID) app_KEY =(這里就是你的應(yīng)用的APPKEY) redirect_URI =(這里是你設(shè)置的回調(diào)地址) scope = get_user_info,add_topic,add_one_blog,add_album,upload_pic,list_album,add_share,check_page_fans,add_t,add_pic_t,del_t,get_repost_list,get_info,get_other_info,get_fanslist,get_idollist,add_idol,del_ido,get_tenpay_addr(\u8BF7\u4FEE\u6539\u6B64\u5904) baseURL = https://graph.qq.com/ getUserInfoURL = https://graph.qq.com/user/get_user_info accessTokenURL = https://graph.qq.com/oauth2.0/token authorizeURL = https://graph.qq.com/oauth2.0/authorize getOpenIDURL = https://graph.qq.com/oauth2.0/me addTopicURL = https://graph.qq.com/shuoshuo/add_topic addBlogURL = https://graph.qq.com/blog/add_one_blog addAlbumURL = https://graph.qq.com/photo/add_album uploadPicURL = https://graph.qq.com/photo/upload_pic listAlbumURL = https://graph.qq.com/photo/list_album addShareURL = https://graph.qq.com/share/add_share checkPageFansURL = https://graph.qq.com/user/check_page_fans addTURL = https://graph.qq.com/t/add_t addPicTURL = https://graph.qq.com/t/add_pic_t delTURL = https://graph.qq.com/t/del_t getWeiboUserInfoURL = https://graph.qq.com/user/get_info getWeiboOtherUserInfoURL = https://graph.qq.com/user/get_other_info getFansListURL = https://graph.qq.com/relation/get_fanslist getIdolsListURL = https://graph.qq.com/relation/get_idollist addIdolURL = https://graph.qq.com/relation/add_idol delIdolURL = https://graph.qq.com/relation/del_idol getTenpayAddrURL = https://graph.qq.com/cft_info/get_tenpay_addr getRepostListURL = https://graph.qq.com/t/get_repost_list version = 2.0.0.0
我們只需要修改上面的前三個(gè)就可以哦,其他可以不同改動(dòng)。。。
2.代碼實(shí)現(xiàn)
2.1LoginController
我們只需要寫(xiě)好我們的接口就完成了。。。
package com.fc.blog.controller.blog;
import com.qq.connect.QQConnectException;
import com.qq.connect.api.OpenID;
import com.qq.connect.api.qzone.UserInfo;
import com.qq.connect.javabeans.AccessToken;
import com.qq.connect.javabeans.qzone.UserInfoBean;
import com.qq.connect.oauth.Oauth;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Map;
/**
* 用戶(hù)登陸
*/
@Controller
@RequestMapping("fc")
public class LoginController {
private static final Logger LOGGER = LoggerFactory.getLogger(LoginController.class);
/**
* 請(qǐng)求QQ登陸頁(yè)面
* @param request
* @param response
* @return
*/
@GetMapping("qq")
public void loginByQQ(HttpServletRequest request, HttpServletResponse response){
response.setContentType("text/html;charset=utf-8");
try {
response.sendRedirect(new Oauth().getAuthorizeURL(request));
LOGGER.info("請(qǐng)求QQ頁(yè)面中。。。。");
} catch (QQConnectException | IOException e) {
e.printStackTrace();
LOGGER.error("請(qǐng)求QQ頁(yè)面失敗");
}
}
/**
* @Description QQ登錄的回調(diào)方法
* @Author xw
* @Date 11:25 2020/2/21
* @Param [request, response, map]
* @return java.lang.String
**/
@RequestMapping("connection")
public String connection(HttpServletRequest request, HttpServletResponse response, Map<String,Object> map) {
try {
AccessToken accessTokenObj = (new Oauth()).getAccessTokenByRequest(request);
String accessToken = null, openID = null;
long tokenExpireIn = 0L;
if ("".equals(accessTokenObj.getAccessToken())) {
LOGGER.error("登錄失敗:沒(méi)有獲取到響應(yīng)參數(shù)");
return "redirect:/";
} else {
accessToken = accessTokenObj.getAccessToken();
tokenExpireIn = accessTokenObj.getExpireIn();
LOGGER.info("accessToken" + accessToken);
request.getSession().setAttribute("demo_access_token", accessToken);
request.getSession().setAttribute("demo_token_expirein", String.valueOf(tokenExpireIn));
// 利用獲取到的accessToken 去獲取當(dāng)前用的openid -------- start
OpenID openIDObj = new OpenID(accessToken);
openID = openIDObj.getUserOpenID();
UserInfo qzoneUserInfo = new UserInfo(accessToken, openID);
UserInfoBean userInfoBean = qzoneUserInfo.getUserInfo();
if (userInfoBean.getRet() == 0) {
String name = removeNonBmpUnicode(userInfoBean.getNickname());
String imgUrl = userInfoBean.getAvatar().getAvatarURL100();
HttpSession session = request.getSession();
session.setAttribute("openId",openID);
session.setAttribute("name",name);
session.setAttribute("imgUrl",imgUrl);
return "redirect:/";
} else {
LOGGER.error("很抱歉,我們沒(méi)能正確獲取到您的信息,原因是: " + userInfoBean.getMsg());
return "admin/404";
}
}
} catch (QQConnectException e) {
e.printStackTrace();
LOGGER.error("QQ登陸失敗");
return "admin/404";
}
}
/**
* @Description 處理掉QQ網(wǎng)名中的特殊表情
* @Author xw
* @Date 11:26 2020/2/21
* @Param [str]
* @return java.lang.String
**/
public String removeNonBmpUnicode(String str) {
if (str == null) {
return null;
}
str = str.replaceAll("[^\\u0000-\\uFFFF]", "");
if ("".equals(str)) {
str = "($ _ $)";
}
return str;
}
}
2.2代碼講解:
2.2.1 QQ登陸界面: /fc/qq
http://域名/fc/qq
這個(gè)接口是跳轉(zhuǎn)QQ登陸界面------》當(dāng)我們點(diǎn)擊QQ登陸按鈕或者是超鏈接都可以跳轉(zhuǎn)到我們的QQ登陸界面,登陸成功后會(huì)自動(dòng)進(jìn)入到我們的回調(diào)地址進(jìn)行授權(quán)
2.2.2 回調(diào)地址: /fc/connection
這里需要特殊說(shuō)明,這個(gè)回調(diào)地址需要和你的創(chuàng)建應(yīng)用的地址一致

在這里我們的代碼就完成了,是不是很簡(jiǎn)單呢,是的,那些方法都是封裝好了的,我們只需要調(diào)用就是了。。。。
四、最后補(bǔ)充
1.實(shí)現(xiàn)這個(gè)QQ登陸操作需要把項(xiàng)目上傳到我們的服務(wù)器上運(yùn)行
2.可能你們?cè)O(shè)置的回調(diào)帶有端口,那么就需要在服務(wù)器上安裝Nginx,反向代理到我們的回調(diào)方法
到此這篇關(guān)于SpringBoot集成QQ第三方登陸的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)SpringBoot集成QQ第三方登陸內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot使用Graylog日志收集的實(shí)現(xiàn)示例
- SpringBoot集成Druid配置(yaml版本配置文件)詳解
- springboot集成springsecurity 使用OAUTH2做權(quán)限管理的教程
- SpringBoot集成Swagger構(gòu)建api文檔的操作
- 詳解Springboot集成sentinel實(shí)現(xiàn)接口限流入門(mén)
- springboot整合sentinel的方法教程
- Springboot集成JUnit5優(yōu)雅進(jìn)行單元測(cè)試的示例
- SpringBoot 集成 activiti的示例代碼
- Springboot集成graylog及配置過(guò)程解析
相關(guān)文章
JWT在OpenFeign調(diào)用中進(jìn)行令牌中繼詳解
Feign是一個(gè)聲明式的Web Service客戶(hù)端,是一種聲明式、模板化的HTTP客戶(hù)端。而OpenFeign是Spring Cloud 在Feign的基礎(chǔ)上支持了Spring MVC的注解,如@RequesMapping等等,這篇文章主要給大家介紹了關(guān)于JWT在OpenFeign調(diào)用中進(jìn)行令牌中繼的相關(guān)資料,需要的朋友可以參考下2021-10-10
java 使用poi動(dòng)態(tài)導(dǎo)出的操作
這篇文章主要介紹了java 使用poi動(dòng)態(tài)導(dǎo)出的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12
Java開(kāi)發(fā)Spark應(yīng)用程序自定義PipeLineStage詳解
這篇文章主要為大家介紹了Java開(kāi)發(fā)Spark應(yīng)用程序自定義PipeLineStage詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02

