掃碼登錄操作過程
- 瀏覽器輸入:https://wx.qq.com/?lang=zh_CN
- 手機(jī)登錄微信,利用“掃一掃”功能掃描網(wǎng)頁(yè)上的二維碼
- 手機(jī)掃描成功后,提示“登錄網(wǎng)頁(yè)版微信”;網(wǎng)頁(yè)上顯示“成功掃描 請(qǐng)?jiān)谑謾C(jī)點(diǎn)擊確認(rèn)以登錄”
- 手機(jī)端點(diǎn)擊“登錄網(wǎng)頁(yè)版微信”,網(wǎng)頁(yè)跳轉(zhuǎn)到用戶的微信操作界面
整個(gè)掃碼登錄的操作過程還是挺簡(jiǎn)單的,而且交互地實(shí)時(shí)性比較好,如果網(wǎng)絡(luò)不是非常阻塞,整個(gè)過程還是非??斓?。
掃碼登錄原理
掃碼登錄大概的思路是:微信手機(jī)客戶端從網(wǎng)頁(yè)二維碼里面得到一些信息,然后發(fā)送給網(wǎng)頁(yè)微信的服務(wù)器,網(wǎng)頁(yè)服務(wù)器驗(yàn)證信息并響應(yīng)。下面,我們借助火狐瀏覽器提供的Firebug工具看看,到底是怎么一回事兒吧!
1.每次打開微信網(wǎng)頁(yè)版的時(shí)候,都會(huì)生成一個(gè)含有唯一uid的二維碼,而且每次刷新后都會(huì)改變。這樣可以保證一個(gè)uid只可以綁定一個(gè)賬號(hào)和密碼,確定登錄用戶的唯一性??梢酝ㄟ^手機(jī)上的UC瀏覽器提供的掃碼功能查看二維碼里面的信息,但并不會(huì)自動(dòng)打開該地址。我刷新三次,掃描結(jié)果如下,其中最后面那串?dāng)?shù)字就是uid:
1) https://login.weixin.qq.com/l/48e24d66bdbc4f
2) https://login.weixin.qq.com/l/0787fb4fa7ad4c
3) https://login.weixin.qq.com/l/92781a4a7f1c47
通過查看網(wǎng)頁(yè)源碼,這個(gè)頁(yè)面在加載完畢時(shí),已經(jīng)把很多登錄后才需要的相關(guān)資源都預(yù)先加載進(jìn)來了,所以登錄用戶得到確認(rèn)后展示用戶信息的速度很快。
2.除了返回唯一的uid,實(shí)際上打開這個(gè)頁(yè)面的時(shí)候,瀏覽器跟服務(wù)器還創(chuàng)建了一個(gè)長(zhǎng)連接,請(qǐng)求uid的掃描記錄。如果沒有,在特定時(shí)長(zhǎng)后(目前是27秒左右)會(huì)接到狀態(tài)碼408(請(qǐng)求超時(shí)),表示應(yīng)該繼續(xù)下一次請(qǐng)求;如果接到狀態(tài)碼201(服務(wù)器創(chuàng)建新資源成功),表示客戶端掃描了該二維碼。
請(qǐng)求超時(shí):返回408
掃碼成功:返回201
function _poll(_asUUID) {
// ....
$.ajax({
type: "GET",
url: "https://login." + _sBaseHost + "/cgi-bin/mmwebwx-bin/login?uuid=" + _asUUID + "&tip=" + show_tip,
dataType: "script",
cache: false,
timeout: _nAjaxTimeout,
success: function(data, textStatus, jqXHR) {
switch (_aoWin.code) {
case 200:
// ....
break;
case 201:
// ....
break;
case 408:
// ....
break;
case 400:
case 500:
// ....
break;
}
},
error: function(jqXHR, textStatus, errorThrown) {
// ....
}
});
}
3.當(dāng)用戶使用登錄后的微信掃描二維碼的時(shí)候,會(huì)將uid和手機(jī)微信產(chǎn)生的token進(jìn)行綁定,并上傳到服務(wù)器。這個(gè)時(shí)候,瀏覽器通過長(zhǎng)輪詢查詢到uid掃描記錄,立即得到201響應(yīng)碼,然后通知服務(wù)器,客戶端由此也進(jìn)入一個(gè)新的頁(yè)面(就是那個(gè)要你點(diǎn)確認(rèn)的按鈕)。在客戶端點(diǎn)擊確認(rèn)后,獲得服務(wù)器授信的令牌,進(jìn)行隨后的信息交互過程。瀏覽器獲得一個(gè)唯一的、臨時(shí)的uid,通過長(zhǎng)連接等待客戶端掃描帶有此uid的二維碼后,從長(zhǎng)連接中獲得客戶端上報(bào)給服務(wù)器的帳號(hào)信息進(jìn)行展示。并在客戶端點(diǎn)擊確認(rèn)后,獲得服務(wù)器授信的令牌,進(jìn)行隨后的信息交互過程。 在超時(shí)、網(wǎng)絡(luò)斷開、其他設(shè)備上登錄后,此前獲得的令牌或丟失、或失效,對(duì)授權(quán)過程形成有效的安全防護(hù)。

