
2016-01-19 | &¶£Ω↓nbsp; 發布者:梁國(guó)芳&nbs• 'p; | &nε±♠₩bsp; 查看(kàn):3320次
app開(kāi)發恰好(hǎo)我之前也(yě)花(huā)過幾個(®©✘♠gè)小(xiǎo)時(shí)做(zuò)過類似的(de)驗證登錄過程♥α,這(zhè)裡(lǐ)作(zuò)為(wèi)探討(tǎo),把±<✔β産品同學的(de)回答(dá)做(zuò)個(gè)引用(yòng),解釋一ε♦↓≠(yī)下(xià)其中『不(bù)技(jì)術(ασ shù)』的(de)地(dì)方。
1. 每打開(kāi)一(yī)次微(wēi↑↓)信網頁版頁面的(de)時(shí)候會¥≥Ω(huì)随機(jī)生(shēng)成一∑£λ(yī)個(gè)含有(yǒu)唯一(yī)₩≥¶φ uid 的(de)二維碼,每次刷新頁面都(d↔ε©βōu)會(huì)不(bù)一(yī)樣(這(zhè)個(gè)可(k₹₹'↕ě)以保證一(yī)個(gè) uid 隻可(kě)以綁定一(yφ≥>ī)個(gè)賬号和(hé)密碼,如(rú×≤ )果一(yī)個(gè) uid 可(kě™₽)以綁定多(duō)個(gè)賬号和(hé)密碼,那(nà)麽很(♠hěn)可(kě)能(néng)你(nǐ)的(de₹€)電(diàn)腦(nǎo)會(huì)登陸别人(ré✔∑n)的(de)微(wēi)信哦);
确實返回了(le)唯一(yī) id,但(dàn)目的(de)是÷♦(shì)為(wèi)了(le)識别用(yòng)戶身(shēn)份,而且實際γ♠∏δ上(shàng)打開(kāi)這(zhè)個(gè)α$頁面的(de)時(shí)候浏覽器(qì)已經和(hé) Server 創建了>↓↔×(le)一(yī)個(gè)長(chángשπ)連接等待确認信息。
查看(kàn) http://wx.qq.com 的(de)源碼可(kě)以輕易看(kàn)出來•≈(lái),其實這(zhè)個(gè)頁面加✘>←載完畢的(de)同時(shí),也(yě)已經把很(hěn)多(÷∞duō)登錄後才需要(yào)的(de)相(xiàng)關資源都(d•♣§ōu)加載進來(lái)了(le),然後會(huì)開¥↕(kāi)啓一(yī)個(gè)長(cháng)連接等待登✘Ω錄用(yòng)戶的(de)信息。
2. 當用(yòng)戶使用(yòng)登£ ₩γ陸後的(de)微(wēi)信掃描該二維碼的(de)時(s∑∏Ωhí)候,會(huì)将這(zhè)個(±♠gè) id 和(hé)手機(jī)上(s≈ ✘hàng)的(de)微(wēi)信賬号及密碼綁定,并™↓ 上(shàng)傳到(dào)微(wēi)信網頁版服務器(qì);
先上(shàng)個(gè)圖:

二維碼樣例: http://weixin.qq.com/x/ARmFYVvU☆λzczwBl9u6Y1I ,利用(yòng)我查查之類的(deδβ™)二維碼應用(yòng)可(kě)以輕易得(de)←®™€到(dào)類似這(zhè)樣的(de)地(dì)址,但(dàn←'β)并不(bù)會(huì)自(zì)動打開(kāi)該地(dì)址₹©× ,微(wēi)信實際上(shàng)針對(duì) ∑×;http://weixin.qq.com ε§/x/ 開(kāi)頭的(de)地(dì)址做(zuò)了(♣γ≠δle)特殊處理(lǐ),會(huì)自(z↔<ì)動獲取相(xiàng)關信息并提示确認。 在手機(jī)∞∑ ×版微(wēi)信訪問(wèn)這(zhè)個(g≥α✘è)頁面進行(xíng)确認時(shí),Server 已經同時(shí)獲得∞¶↔∏(de)了(le)客戶端信息,并通(tōng)過之前保持的(de)長(cháΩ£ ♥ng)連接告知(zhī)浏覽器(qì)。
3. 微(wēi)信網頁版頁面每隔 1 秒(miǎo)或 2 秒(miǎo)會(huì) get 請(q €ǐng)求該 id 對(duì)應的(de <¥<)微(wēi)信賬号及密碼,如(rú)果 id 綁定上(shàng)了(l←₩¥e)微(wēi)信賬号和(hé)密碼,那(nà)麽就(ji♠βφù)可(kě)以請(qǐng)求到(dà$'o)賬号和(hé)密碼,就(jiù)可(kě)以自(zì)α¶動登陸了(le)。
浏覽器(qì)展示完長(cháng)連接裡(lǐ)包含的(de)用ε±€(yòng)戶信息(頭像等)後,會(huì)新開' ↑®(kāi)一(yī)個(gè)長(cháng)連接等待客戶端的(de) §λ©确認操作(zuò),其 URL 類似 https://login.weixin.qq.com/cgi✔←>-bin/mmwebwx-bin/logi'λ✘™n?uuid=794ecedd804f47&tip=1&'>Ω↕_=1395748413642。從(cóng)安全的(de)角度來(lái¶)說(shuō),無論如(rú)何都(dōu)不(bù)會(hu₩←ì)讓客戶端獲得(de)微(wēi)信帳号♦¶和(hé)密碼,要(yào)知(zhī)道(dàoγ§↓),密碼這(zhè)玩(wán)意騰訊自(zì)己≤α都(dōu)不(bù)敢保存(有(yǒu)興趣的(de)同學×π可(kě)以自(zì)行(xíng)了(le)解下(xià) CSDN 明(m↑>γíng)文(wén)密碼洩露事(shì)α↔<件(jiàn)),肯定是(shì)不(bù✔≠ )可(kě)能(néng)返回給浏覽器(qì)的(de)。
而且從(cóng)體(tǐ)感來(lái)看(kàn),怎★πβφ麽著(zhe)都(dōu)不(bù)可(kě)能(néng☆₩)是(shì)頁面 1-2 秒(miǎo) GET 請(qǐn♠₽∞g)求的(de),實際是(shì)通(tσ×<↔ōng)過長(cháng)連接,近(jìn)乎實時(shí)的§≠÷(de)獲得(de)信息。 對(duì)于驗證過程,Open A↓δλPI 一(yī)般是(shì)通(tōng)過授權令牌(Token)來(ε ↔¥lái)解決的(de),原理(lǐ)是(shì)當用(yòng)®✘戶通(tōng)過授權後,分(fēn)配一(yī)個(€×gè)限定條件(jiàn)下(xià)的(de)令牌(如(rú)限制(zhì ÷'↔)本機(jī)訪問(wèn)、限制(zh•"ì)授權有(yǒu)效時(shí)間(jiān)、限制(zhì)同時(shíε€ )登錄設備數(shù)等),使獲得(de)授權的→•(de)用(yòng)戶僅在有(yǒu)限的(de)前提下(xiγ¶ ✘à)能(néng)訪問(wèn)相(xiàng)關服務。 像計(jγ€ì)算(suàn)機(jī)休眠後曾做(zu±♦ò)的(de)授權就(jiù)自(zì)動收回了(le),這(zhα₹✘è)樣就(jiù)有(yǒu)效的(de)避免了(le)在别人γε(rén)電(diàn)腦(nǎo)上(shàng)(尤其是(sh$§∑$ì)網吧(ba))打開(kāi),但(dàn)忘記關閉或退出這(zhè)λδ♠γ類安全問(wèn)題了(le)。
同時(shí),整個(gè)授權過程的(de)"∏₩驗證部分(fēn)在手機(jī)端進行(xíng),有(yǒu↕>)效杜絕了(le) PC 上(shàng)泛濫的(de)各類木(mù)≤©δ馬、『安全工(gōng)具』的(de)監聽(tīng),大( <®Ωdà)大(dà)降低(dī)了(le)帳号被盜的(de)風(fēng)險。
整個(gè)核心過程是(shì):浏覽器(✘γ©qì)獲得(de)一(yī)個(gè)臨時(shí) id,通(tōn±¥∑≈g)過長(cháng)連接等待客戶端掃描帶有(yǒ₽®u)此 id 的(de)二維碼後,從(cóng)長(•≠cháng)連接中獲得(de)客戶端上(shàng)報(↓♣bào)給 server 的(de)帳号信息進行(xíng)展示,并在客≠∞戶端點擊确認後,獲得(de)服務器(qì)βφ✔授信的(de)令牌,進行(xíng)随後的(de)信息交互過程。 ¶•在超時(shí)、網絡斷開(kāi)、其他(tā)設備上(shàng)登σ₽錄後,此前獲得(de)的(de)令牌或丢失、或失效 ♦ ',有(yǒu)效完成了(le)安全防護。
