網(wǎng)站接入QQ登錄功能的實(shí)現(xiàn)
來源 | https://github.com/Dream4ever/Knowledge-Base/issues/76
說明
注冊(cè)開發(fā)者
創(chuàng)建網(wǎng)站應(yīng)用
流程概述
按照要求訪問指定網(wǎng)址,會(huì)顯示QQ登錄界面,選擇QQ賬號(hào)進(jìn)行登錄之后,會(huì)向之前所填寫的 網(wǎng)站回調(diào)域 發(fā)起回調(diào),回調(diào)URL中包含Authorization Code(授權(quán)碼)。 網(wǎng)站回調(diào)域 用這個(gè)Authorization Code(授權(quán)碼),結(jié)合其它數(shù)據(jù),向指定的地址發(fā)送請(qǐng)求,接收到的響應(yīng)中包含Access Token(訪問令牌)。 網(wǎng)站回調(diào)域 再用Access Token(訪問令牌) 向指定的地址發(fā)送請(qǐng)求,接收到的響應(yīng)中包含所登錄QQ賬號(hào)的 OpenID(不涉及用戶隱私)。 網(wǎng)站回調(diào)域 拿到用戶的OpenID之后,結(jié)合前面獲取到的Access Token以及其它數(shù)據(jù),就可以調(diào)用QQ的接口,實(shí)現(xiàn)特定的功能了。比如可以調(diào)用get_user_info接口,獲取登錄用戶的昵稱、頭像、性別,用來顯示在前端頁(yè)面中。
一、獲取Authorization Code
https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=${appId}&redirect_uri=${redirectUrl}&state=${state}&scope=${scope}
上面的地址中,appId為網(wǎng)站應(yīng)用的APP ID,redirectUrl為網(wǎng)站應(yīng)用的網(wǎng)站回調(diào)域,state為用戶自定義的字符串,scope為向用戶所請(qǐng)求的授權(quán)列表。
scope之外的參數(shù)均為必填項(xiàng),scope如果不寫,則默認(rèn)只請(qǐng)求對(duì)接口get_user_info進(jìn)行授權(quán),獲取用戶最基本的幾項(xiàng)信息:QQ昵稱、QQ頭像、性別。
發(fā)起請(qǐng)求之后,會(huì)將用戶導(dǎo)向到QQ官方的登錄頁(yè)面,用戶在這個(gè)頁(yè)面上選擇需要登錄的QQ號(hào),點(diǎn)擊“登錄”,網(wǎng)站回調(diào)域就會(huì)收到的騰訊服務(wù)器所發(fā)起的回調(diào)。
比如之前所填寫的 網(wǎng)站回調(diào)域 為a.com/api/getauthcode 的話,騰訊服務(wù)器就會(huì)向 網(wǎng)站回調(diào)域 發(fā)送如下請(qǐng)求:
GET /getauthcode?code=F91C6110********
在上面接收到的這個(gè)請(qǐng)求中,URL查詢字符串里,code= 后面的字符串,就是騰訊服務(wù)器發(fā)來的Authorization Code。
二、獲取Access Token
拿到Authorization Code,結(jié)合其它數(shù)據(jù),請(qǐng)求如下地址:
https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&client_id=${appId}&client_secret=${appKey}&code=${authCode}&state=${state}&redirect_uri=${redirectUrl}
網(wǎng)站回調(diào)域 會(huì)收到如下響應(yīng):
access_token=FF3A****&expires_in=7776000&refresh_token=2516****
其中就包含了Access Token,并且這個(gè)Access Token有90天的有效期,但并不會(huì)按照官方文檔所說的,用戶再次登錄時(shí)自動(dòng)刷新,而是短時(shí)間(一天內(nèi))連續(xù)多次登錄都不會(huì)刷新。
對(duì)于這個(gè)Access Token,官網(wǎng)建議開發(fā)者將其進(jìn)行保存,以便后續(xù)調(diào)用OpenAPI訪問和修改用戶信息時(shí)使用。
三、獲取OpenID
有了Access Token之后,就可以用它來獲取當(dāng)前所登錄QQ賬號(hào)的OpenID了。請(qǐng)求如下地址:
https://graph.qq.com/oauth2.0/me?access_token=${accessToken}
網(wǎng)站回調(diào)域 會(huì)收到如下響應(yīng):
callback( {"client_id":"appId","openid":"openId"} );
上面的響應(yīng)中包含了 APP ID 和 OpenID,APP ID 可用來確認(rèn)是否為合法的網(wǎng)站請(qǐng)求,OpenID 自然就是所登錄QQ賬號(hào)的 OpenID 了。
四、調(diào)用接口訪問數(shù)據(jù)
有了第二步獲取到的獲取Access Token,和第三部獲取到的 OpenID,就可以拿來訪問QQ的接口,獲取用戶的相關(guān)信息了。
比如以下面的方式請(qǐng)求 get_user_info 接口,就能夠獲取到用戶昵稱、QQ頭像等信息。
https://graph.qq.com/user/get_user_info?access_token=${accessToken}&oauth_consumer_key=${appId}&openid=${openId}
學(xué)習(xí)更多技能
請(qǐng)點(diǎn)擊下方公眾號(hào)
![]()
