溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

反向工程解析QQ掃碼登錄的OAuth2流程

發(fā)布時(shí)間:2020-06-16 14:46:54 來源:網(wǎng)絡(luò) 閱讀:7085 作者:簡單是美美 欄目:安全技術(shù)

1. 引言-與OAuth3有關(guān)

??OAuth 2.0協(xié)議(RFC 6749)被廣泛應(yīng)用于互聯(lián)網(wǎng)應(yīng)用中,最常見的可能就是第三方授權(quán)登錄應(yīng)用了。在許多應(yīng)用網(wǎng)站中用戶登錄時(shí),可以使用支付寶、微信、QQ的已有賬號(hào)進(jìn)行登錄,這些應(yīng)用網(wǎng)站與阿里、騰訊共享了用戶的信息和資源。
??OAuth 2.0協(xié)議的中心思想是讓請(qǐng)求用戶資源的一方(在RFC 6749中被稱為client)向資源擁有方請(qǐng)求訪問權(quán)限,請(qǐng)求訪問權(quán)限的過程不是通過使用用戶在資源擁有方的訪問權(quán)證獲得,而是將用戶引向資源擁有方的授權(quán)服務(wù)器(Authorization Server),通過授權(quán)服務(wù)器授權(quán)后得到。
??在整個(gè)OAuth 2流程中,用戶如果想讓第三方(這里第三方指用戶、用戶注冊(cè)方(支付寶、微信、QQ)之外的第三方)網(wǎng)站使用自己在支付寶、微信、QQ上資源(如賬號(hào)、昵稱、頭像)等信息,就需要參與一個(gè)與支付寶、微信、QQ授權(quán)服務(wù)器交互的授權(quán)過程。
??圖1以RFC 6749中授權(quán)碼方式授權(quán)(Authorization Code Grant)方式描述了第三方網(wǎng)站的授權(quán)流程。
反向工程解析QQ掃碼登錄的OAuth2流程
??我們以用戶在K網(wǎng)站上使用QQ賬號(hào)登錄為例,用一個(gè)典型的開發(fā)流程解釋圖1:
??A. 用戶在已進(jìn)入K網(wǎng)站頁面的瀏覽器上向QQ的授權(quán)服務(wù)發(fā)起用戶資源請(qǐng)求:這里Client Identifier表示K網(wǎng)站在QQ授權(quán)服務(wù)器(Authorization Server,實(shí)際應(yīng)用中QQ可能有多個(gè)服務(wù)器,這里抽象為一個(gè)授權(quán)服務(wù)器)上注冊(cè)的標(biāo)識(shí),Redirection URI表示用戶授權(quán)成功后K網(wǎng)站的重定向URI,K網(wǎng)站使用該URI來接收授權(quán)碼(Authorization Code)。具體的請(qǐng)求參數(shù)和格式可參見RFC 6749。
??B. 瀏覽器跳入QQ授權(quán)服務(wù)器提供的授權(quán)頁面,一般該頁面提供兩種方式供用戶授權(quán)認(rèn)證:用戶名/密碼登錄方式和二維碼掃碼登錄方式。
??C. 在獲取到用戶在步驟B中的授權(quán)認(rèn)證后,QQ授權(quán)服務(wù)器重定向到步驟A中攜帶的重定向URI,并在重定向地址中攜帶授權(quán)碼參數(shù)。
??D. K網(wǎng)站使用獲取的授權(quán)碼向QQ授權(quán)服務(wù)器請(qǐng)求Access Token,請(qǐng)求中帶上的重定向URI要和步驟A中的重定向URI一致。
??E. QQ授權(quán)服務(wù)器對(duì)參數(shù)驗(yàn)證無誤后,向K網(wǎng)站發(fā)送Access Token。
??上面的步驟中,步驟C后向重定向URI進(jìn)行重定向的操作是由瀏覽器完成的,步驟D的操作在K網(wǎng)站的后臺(tái)中完成。K網(wǎng)站的后臺(tái)在步驟C后接收授權(quán)碼的同時(shí),也獲得了瀏覽器的當(dāng)前session(根據(jù)瀏覽器中的Cookie),在步驟E中得到Access Token后,K網(wǎng)站的后臺(tái)向QQ授權(quán)服務(wù)器獲取對(duì)應(yīng)用戶信息(昵稱、頭像等),將用戶信息放入當(dāng)前session中后,然后重定向到K網(wǎng)站的主頁面,這時(shí)主頁面上就顯示QQ用戶的信息了。

2. QQ掃碼登錄流程分析

??上一節(jié)中,我們描述了一個(gè)典型的基于OAuth3的QQ用戶第三方登錄流程。流程中最核心部分是步驟B,即如何引導(dǎo)用戶向QQ的授權(quán)服務(wù)器提供授權(quán)認(rèn)證。圖2顯示了QQ提供的認(rèn)證登錄頁面。
反向工程解析QQ掃碼登錄的OAuth2流程
??QQ的授權(quán)服務(wù)器提供了兩種授權(quán)認(rèn)證方式:一種是賬號(hào)密碼登錄方式,一種是二維碼掃碼方式。對(duì)于賬號(hào)密碼登錄方式較好理解,因?yàn)橛脩舻氖跈?quán)認(rèn)證操作是在瀏覽器上進(jìn)行的,可由瀏覽器直接和QQ授權(quán)服務(wù)器交互。而二維碼掃碼方式,情況就更復(fù)雜一些,因?yàn)槎嗔艘粋€(gè)角色參與,這個(gè)角色就是用戶手機(jī)。實(shí)際上用戶的授權(quán)認(rèn)證操作是手機(jī)APP(移動(dòng)QQ)上完成的,但是提供二維碼的瀏覽器需要知道用戶手機(jī)的掃描和認(rèn)證結(jié)果,瀏覽器獲取掃描和授權(quán)認(rèn)證結(jié)果的途徑是QQ授權(quán)服務(wù)器。
??反向工程前需要大膽設(shè)想,我們?cè)O(shè)想QQ二維碼掃碼登錄時(shí)的大致流程是這樣的:QQ認(rèn)證登錄頁面獲取QQ授權(quán)服務(wù)器產(chǎn)生的二維碼;用戶手機(jī)APP掃描該二維碼,并在手機(jī)APP上確認(rèn)授權(quán),該授權(quán)信息存儲(chǔ)在QQ授權(quán)服務(wù)器;QQ認(rèn)證登錄頁面獲取QQ授權(quán)服務(wù)器上的本次授權(quán)信息,向授權(quán)服務(wù)器發(fā)送獲取授權(quán)碼請(qǐng)求。
??在這個(gè)流程中,QQ認(rèn)證登錄頁面和手機(jī)APP是分離的兩個(gè)客戶端,這兩個(gè)客戶端之間通過二維碼聯(lián)系在一起并共享二維碼的掃描結(jié)果,QQ認(rèn)證登錄頁面會(huì)使用什么手段從QQ授權(quán)服務(wù)器上獲取手機(jī)APP上的授權(quán)認(rèn)證結(jié)果是需要我們通過反向工程去探索的。

3. 反向工程解析

3.1. 流程分析

??在一個(gè)提供QQ、微信用戶登錄的第三方網(wǎng)站上執(zhí)行QQ用戶掃碼登錄,并采集流程中的HTTP消息,可整理出如圖3所示的消息流程(圖中消息10至11流程根據(jù)OAuth3協(xié)議設(shè)計(jì),非反向工程獲取)。
反向工程解析QQ掃碼登錄的OAuth2流程
??根據(jù)圖3,可描述為如下流程:
??1. 用戶進(jìn)入第三方網(wǎng)站主頁,并通過主頁上的登錄按鈕重定向到QQ認(rèn)證登錄頁面。對(duì)應(yīng)圖3中消息1。
??2. QQ認(rèn)證登錄頁面向QQ授權(quán)服務(wù)器請(qǐng)求生成二維碼,該二維碼有唯一標(biāo)識(shí)。對(duì)應(yīng)圖3中消息2。
??3. 用戶使用手機(jī)APP掃描該二維碼,并在APP中認(rèn)可授予的權(quán)限,該掃描用戶信息與認(rèn)可的授權(quán)信息保存到QQ授權(quán)服務(wù)器。
??4. QQ認(rèn)證登錄頁面根據(jù)二維碼標(biāo)識(shí)不斷輪詢QQ授權(quán)服務(wù)器,看看是否有本次授權(quán)認(rèn)證的信息。對(duì)應(yīng)圖3中消息3。
??5. QQ認(rèn)證登錄頁面在QQ授權(quán)服務(wù)器上獲取到本次已經(jīng)授權(quán)的信息后,獲取由服務(wù)器返回的登錄用戶信息。對(duì)應(yīng)圖3中消息4,5,6。
??6. QQ認(rèn)證登錄頁面根據(jù)QQ授權(quán)服務(wù)器返回的信息向QQ授權(quán)服務(wù)器請(qǐng)求本次OAuth3的授權(quán)碼,QQ授權(quán)服務(wù)器重定向到第三方應(yīng)用注冊(cè)的重定向(回調(diào))URI。對(duì)應(yīng)圖3中消息7,8,9。
??7. 第三方網(wǎng)站后臺(tái)根據(jù)授權(quán)碼向QQ授權(quán)服務(wù)器獲取Access Token,并根據(jù)Access Token獲取用戶信息。對(duì)應(yīng)圖3中消息10,11。需要注意的是:消息10和11流程根據(jù)OAuth3協(xié)議設(shè)計(jì),非反向工程獲取。
??8. 第三方網(wǎng)站后臺(tái)向QQ認(rèn)證登錄頁面返回重定向到第三方網(wǎng)站主頁的請(qǐng)求,QQ認(rèn)證登錄頁面重定向到第三方網(wǎng)站主頁,這時(shí)該主頁中已包含認(rèn)證登錄的QQ用戶信息。

3.2. 消息分析

??通過上一節(jié)的消息流程分析,我們重點(diǎn)關(guān)注一下QQ掃碼登錄的相關(guān)消息。
??a) QQ認(rèn)證登錄頁面請(qǐng)求,對(duì)應(yīng)圖3中消息1。請(qǐng)求格式如下:

GET /oauth3.0/show?which=Login&display=pc&client_id=xxx&redirect_uri=xxx&response_type=code&scope=get_user_info%2Cadd_share HTTP/1.1

??b) 二維碼請(qǐng)求,對(duì)應(yīng)圖3中消息2。
??請(qǐng)求格式如下:

GET /ptqrshow?appid=xxxxxx&e=2&l=M&s=3&d=72&v=4&t=0.27689339003885305&daid=383&pt_3rd_aid=101372833

??該請(qǐng)求的回應(yīng)中會(huì)設(shè)置cookie,作為該二維碼的唯一標(biāo)識(shí),在后面的二維碼狀態(tài)查詢中會(huì)用到。如下所示:

set-cookie: qrsig=Ht-tcKP8HsOucEnJLNd4RdqfbCwooJgQ3Z2Qjp5QApi0UoDGCIgPYu8VvQ6dAE8q;Path=/;Domain=ptlogin2.qq.com;

??c) 查詢二維碼掃描授權(quán)狀態(tài),對(duì)應(yīng)圖中消息3,4。
??請(qǐng)求格式如下:

    GET /ptqrlogin?u1=https%3A%2F%2Fgraph.qq.com%2Foauth3.0%2Flogin_jump&ptqrtoken=1441332869&ptredirect=0&h=1&t=1&g=1&from_ui=1&ptlang=2052&action=1-0-1533114559274&js_ver=10276&js_type=1&login_sig=EJ7zhLYsxLLTzyvFt57te*RfFnoefvlyL5EPQtIynibZvYDVTFwqp73mYhBZrw15&pt_uistyle=40&aid=716027609&daid=383&pt_3rd_aid=101372833&

??請(qǐng)求中cookie信息如下:

cookie: pt_login_sig=EJ7zhLYsxLLTzyvFt57te*RfFnoefvlyL5EPQtIynibZvYDVTFwqp73mYhBZrw15; pt_clientip=78f767d654ee2f3d; pt_serverip=612d0af17164d8cd; pt_local_token=55538618; uikey=a295803bda0158cc66a043eadd466549793036cdc18cf00adc324fe62c3dfdbb; pt_guid_sig=f1fb580c215810be91bdc81c31b0dbbf864e8530ff5bbe12a752ec79aa84096f; pgv_pvi=4603649024; pgv_si=s8250232832; _qpsvr_localtk=0.6218837724703585; qrsig=Ht-tcKP8HsOucEnJLNd4RdqfbCwooJgQ3Z2Qjp5QApi0UoDGCIgPYu8VvQ6dAE8q

??cookie中的pt_login_sig和qrsig作為查詢參數(shù),保證一次生成的二維碼只綁定一個(gè)賬號(hào)。
??請(qǐng)求的結(jié)果中包含當(dāng)前二維碼的狀態(tài),如下所示:

    ptuiCB('67','0','','0','二維碼認(rèn)證中。(1759531849)', '')

??如果用戶已經(jīng)在手機(jī)APP上授權(quán)認(rèn)證,請(qǐng)求的回應(yīng)中會(huì)返回用戶本次的登錄授權(quán)標(biāo)識(shí),放在頭部的set-cookie中,如下所示(其中出現(xiàn)了掃描用戶的QQ號(hào)):

set-cookie: pt_guid_sig=ad3f568b9d1d721593fde21261e9110921367f8e918ee573d0290ddde03fe5a9;Expires=Fri, 31 Aug 2018 09:06:36 GMT;Path=/;Domain=ptlogin2.qq.com;
set-cookie: uin=o0545602528;Path=/;Domain=qq.com;
set-cookie: skey=@Xb8aQtVvd;Path=/;Domain=qq.com;
set-cookie: superuin=o0545602528;Path=/;Domain=ptlogin2.qq.com;
set-cookie: pt2gguin=o0545602528;Expires=Tue, 19 Jan 2038 03:14:07 GMT;Path=/;Domain=qq.com;
set-cookie: superkey=iXw-EiDFksitURyqw9dWBfOH7OIowHjqdYZPbu2U2iQ_;Path=/;Domain=ptlogin2.qq.com;HttpOnly;
set-cookie: pt_recent_uins=a82cd26c99dc9b53af5f945be98ce71176658eb32199788d1c479b025d8b0f7a7872d4e9cf761581865bdcff1157eae7684374b9637a77f2;Expires=Fri, 31 Aug 2018 09:06:36 GMT;Path=/;Domain=ptlogin2.qq.com;HttpOnly;
set-cookie: ETK=;Path=/;Domain=ptlogin2.qq.com;
set-cookie: RK=jcDM6tiRa/;Expires=Tue, 19 Jan 2038 03:14:07 GMT;Path=/;Domain=qq.com;
set-cookie: ptnick_545602528=e88b8fe5b79ee7a791e8bebe2de5bca0e587af;Path=/;Domain=ptlogin2.qq.com;
set-cookie: ptcz=cc528e09239038601ee0ab4b7665c65404e847c2963a19d71a266c628029ee22;Expires=Tue, 19 Jan 2038 03:14:07 GMT;Path=/;Domain=qq.com;
set-cookie: ptcz=;Expires=Thu, 01 Jan 1970 00:00:00 GMT;Path=/;Domain=ptlogin2.qq.com;
set-cookie: airkey=;Expires=Thu, 01 Jan 1970 00:00:00 GMT;Path=/;Domain=qq.com;
set-cookie: supertoken=3346071835;Path=/;Domain=ptlogin2.qq.com;

??d) 更新頁面上的cookie,對(duì)應(yīng)圖3中消息5,6。返回的請(qǐng)求頭中包含了一系列的set-cookie與登錄用戶有關(guān),這里就不貼出來了。
??e) 向QQ授權(quán)服務(wù)器獲取授權(quán)碼,對(duì)應(yīng)圖3中消息7,8。
??請(qǐng)求格式如下:

POST /oauth3.0/authorize

??請(qǐng)求中表單數(shù)據(jù)如下:

response_type: code
client_id: xxxxxxxxx
redirect_uri: http://www.XXX.com/oauth/callback/type/qq.html
scope: get_user_info,add_share
state: 
switch: 
from_ptlogin: 1
src: 1
update_auth: 1
openapi: 80901010
g_tk: 1934165869
auth_time: 1533114565802
ui: EBF619C8-8BF2-4882-9D8D-8D7E6C0D05E1

??包含的cookie信息如下:

Cookie: ui=EBF619C8-8BF2-4882-9D8D-8D7E6C0D05E1; pgv_pvi=4603649024; pgv_si=s8250232832; _qpsvr_localtk=0.6218837724703585; pt2gguin=o0545602528; uin=o0545602528; skey=@Xb8aQtVvd; RK=jcDM6tiRa/; ptcz=cc528e09239038601ee0ab4b7665c65404e847c2963a19d71a266c628029ee22; p_uin=o0545602528; pt4_token=kME-OHaPJ3rFmtsksNxnUcWYTP6JEWRvd2EX8DHyfAE_; p_skey=oA8SEkIxHh7-2v-XneForJ9gUH4PTgROUPCQ6YdpUzI_

??QQ授權(quán)服務(wù)器根據(jù)請(qǐng)求中表單和cookie中的標(biāo)識(shí)確定本次掃描確認(rèn)結(jié)果,返回授權(quán)碼?;貞?yīng)消息格式如下:

HTTP/1.1 302 Moved Temporarily
Server: tws
Date: Wed, 01 Aug 2018 09:06:37 GMT
Content-Type: text/html
Content-Length: 0
Connection: keep-alive
Keep-Alive: timeout=50
Content-Encoding: gzip
Location:http://www.XXX.com/oauth/callback/type/qq.html?code=653D0AAEA1EF7D12A4AF99AD4CDC4D41

4. 小結(jié)

??我們通過反向工程結(jié)合OAuth3流程分析了在第三方網(wǎng)站上使用QQ掃碼登錄的功能,分析了消息流程與相關(guān)消息,明確了大致的實(shí)現(xiàn)思路。消息中有些參數(shù)(如cookie中的一些鍵值)是QQ特有的,含義也無法根據(jù)流程推斷出來,這就需要騰訊的兄弟去給大家解釋了。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI