191119_01 網站集成QQ第三方登錄

網站集成QQ第三方授權登錄

作者:邵發

官網:http://afanihao.cn/java

本文是Java學習指南系列教程的官方配套文檔。

內容介紹如何在網站中集成QQ的第三方授權登錄功能,演示項目基於Java8 + Tomcat8 + Spring5 的開發環境。第三方認證登錄即OAuth(Open Authorization開放認證),常見的有QQ登錄、微博登錄等都屬於第三方認證。本文附帶所用的演示項目源碼。

 

1.  QQ登錄流程演示

點此觀看登錄演示。在登錄頁面下方,放置一個QQ登錄的按鈕鏈接。

點此按鈕,則瀏覽器會跳到qq.com的官方授權頁面。

 

注意此時的地址欄是 graph.qq.com 。用戶在此頁面裏輸入自己的QQ號,登錄成功後,瀏覽器再次跳轉到我們自己的網站 demo.afanihao.cn 。

這便是一個QQ三方登錄的標準過程演示。

 

2.  資質審覈

現在介紹如何給自己的網站添加這樣功能。要實現這樣的登錄過程,是要先取得qq.com的官方審覈的。

點擊進入QQ應用申請頁面,用自己的QQ號登錄,然後按它的提示創建一個網頁應用。示例圖所示。

F:\付費下載\191119_01 網站集成QQ第三方登錄\截圖\添加QQ應用\快照2.jpg

在填寫應用資料時,需要填寫你的網站的域名、接口地址和備案號,這意味着你必須有一個正常的網站(域名已經備案)纔可以通過這一審覈。

示例:

域名: http://demo.afanihao.cn

回調接口: http://demo.afanihao.cn/qq/callback

按要求填完後,提交審覈,一般在1,2個工作日之內便可以通過審覈。

 

3 應用開發

應用審覈完成後,就可以在自己的網站裏集成QQ登錄了。以下代碼演示中,均以demo.afanihao.cn 代表示例網站的域名,你在開發的時候應替換爲自己的網站域名。

3.1 前端,添加一個QQ登錄圖標

點此按鈕的時候,打開 http://demo.afanihao.cn/qq/useOauth

 

3.2 後臺,實現 /qq/useOauth

後臺實現 /qq/useOauth服務,實現一個Redirect,控制瀏覽器跳轉到graph.qq.com進行頁面授權。

@GetMapping("/qq/useOAuth")
public String useOAuth(HttpSession session) throws Exception
{
	// 產生一個隨機碼, 用於鑑別回調的安全性
	int rand = 10000 + new Random().nextInt(10000);
	String qqState = String.valueOf(rand);
	session.setAttribute("qqState", qqState);


	String qqAuthUrl = "https://graph.qq.com/oauth2.0/authorize"
		+"?response_type=code"
		+"&client_id=" + appID
		+"&state=" + qqState
		+"&redirect_uri=" + callbackUrl
	;

	return "redirect:" + qqAuthUrl;
}

在頁面授權成功後,瀏覽器會跳轉回 http://demo.afanihao.cn/qq/callback 地址,將附加一個code參數。

 

3.3 後臺,實現/qq/callback 服務

實現/qq/callback,使用授權碼code,繼續與graph.qq.com交互,取得用戶的信息。注意,此處使用的是後臺間接口調用。

@GetMapping("/qq/callback")
public String callback(HttpSession session
		, HttpServletRequest request
		, HttpServletResponse response
		, String code
		, String state) throws Exception
{

	/* 與QQ後臺交互,取得 AccessToken 。。。*/
	String url2 = "https://graph.qq.com/oauth2.0/token"
		+"?grant_type=authorization_code"
		+"&client_id=" + appID
		+"&client_secret=" + appSecret
		+"&code=" + code
		+"&redirect_uri=http://user.afanihao.cn/qqcallback"
	;

	HTTP http = new HTTP();
	System.out.println("獲取AccessToken: " + url2);
	String reply2 = http.get(url2, null);
	System.out.println("reply2: " + reply2);
	String accessToken = parseAccessToken(reply2);
	if(accessToken == null || accessToken.length()==0)
		throw new Exception("無法解析出accessToken,應答爲: " + reply2);

	/* 獲取用戶的 OpenID */
	String url3 = "https://graph.qq.com/oauth2.0/me"
		+ "?access_token=" + accessToken;
	String reply3 = http.get(url3, null);
	System.out.println("reply3: " + reply3);
	String openid = parseOpenID( reply3);
	System.out.println("用戶的OpenID=" + openid);

	。。。。。。。。

至此,已經取得了當前用戶的openid,此號對應了QQ用戶的一個全局唯一賬戶ID。下面,只需要用這個openid在本網站的數據庫處理一下就行了。

處理起來也簡單:如果系統中沒有這個帳戶,就創建一個新的帳戶;如果系統中有這個帳戶,就取出這個帳戶信息。以下代碼僅爲示意。

// 以openid作爲查詢,先查看本系統中沒有這個用戶
User user = UserDB.i.queryByQQ(openid);
if( user == null)
{
	user = new User();
	user.name = "qq" + openid;
	user.qqid = openid;
	UserDB.i.insert(user);
}

其實還可以進一步取得當前用戶的QQ頭像、暱稱等信息,詳情請參考本示例的項目源碼。最後在校驗完成後,將此用戶的信息放在Session中,登錄完成。

至此,已經完成QQ登錄的集成。本文演示所用的項目源碼在此獲取

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章