我個人開發過程一般是和產品說,『你們提業務要求、交互方式、性能要求等就好,技術方案我們會綜合開發時間、系統架構等因素考慮』。
恰好我之前也花過幾個小時做過類似的驗證登錄過程,這里作為探討,把產品同學的回答做個引用,解釋一下其中『不技術』的地方。
1. 每打開一次微信網頁版頁面的時候會隨機生成一個含有唯一 uid 的二維碼,每次刷新頁面都會不一樣(這個可以保證一個 uid 只可以綁定一個賬號和密碼,如果一個 uid 可以綁定多個賬號和密碼,那么很可能你的電腦會登陸別人的微信哦);
確實返回了唯一 id,但目的是為了識別用戶身份,而且實際上打開這個頁面的時候瀏覽器已經和 Server 創建了一個長連接等待確認信息。
查看?http://wx.qq.com?的源碼可以輕易看出來,其實這個頁面加載完畢的同時,也已經把很多登錄后才需要的相關資源都加載進來了,然后會開啟一個長連接等待登錄用戶的信息。
2. 當用戶使用登陸后的微信掃描該二維碼的時候,會將這個 id 和手機上的微信賬號及密碼綁定,并上傳到微信網頁版服務器;
先上個圖:

二維碼樣例:?http://weixin.qq.com/x/ARmFYVvUzczwBl9u6Y1I?,利用我查查之類的二維碼應用可以輕易得到類似這樣的地址,但并不會自動打開該地址,微信實際上針對?http://weixin.qq.com/x/?開頭的地址做了特殊處理,會自動獲取相關信息并提示確認。 在手機版微信訪問這個頁面進行確認時,Server 已經同時獲得了客戶端信息,并通過之前保持的長連接告知瀏覽器。
3.?微信網頁版頁面每隔 1 秒或 2 秒會 get 請求該 id 對應的微信賬號及密碼,如果 id 綁定上了微信賬號和密碼,那么就可以請求到賬號和密碼,就可以自動登陸了。
瀏覽器展示完長連接里包含的用戶信息(頭像等)后,會新開一個長連接等待客戶端的確認操作,其 URL 類似?https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?uuid=794ecedd804f47&tip=1&_=1395748413642?。從安全的角度來說,無論如何都不會讓客戶端獲得微信帳號和密碼,要知道,密碼這玩意騰訊自己都不敢保存(有興趣的同學可以自行了解下 CSDN 明文密碼泄露事件),肯定是不可能返回給瀏覽器的。
而且從體感來看,怎么著都不可能是頁面 1-2 秒 GET 請求的,實際是通過長連接,近乎實時的獲得信息。 對于驗證過程,Open API 一般是通過授權令牌(Token)來解決的,原理是當用戶通過授權后,分配一個限定條件下的令牌(如限制本機訪問、限制授權有效時間、限制同時登錄設備數等),使獲得授權的用戶僅在有限的前提下能訪問相關服務。 像計算機休眠后曾做的授權就自動收回了,這樣就有效的避免了在別人電腦上(尤其是網吧)打開,但忘記關閉或退出這類安全問題了。
同時,整個授權過程的驗證部分在手機端進行,有效杜絕了 PC 上泛濫的各類木馬、『安全工具』的監聽,大大降低了帳號被盜的風險。
整個核心過程是:瀏覽器獲得一個臨時 id,通過長連接等待客戶端掃描帶有此 id 的二維碼后,從長連接中獲得客戶端上報給 server 的帳號信息進行展示,并在客戶端點擊確認后,獲得服務器授信的令牌,進行隨后的信息交互過程。 在超時、網絡斷開、其他設備上登錄后,此前獲得的令牌或丟失、或失效,有效完成了安全防護。
(編輯:小酷)
掃碼添加客服微信
掃碼關注公眾號
酷網(大連)科技有限公司
致力于為客戶品牌提供完善解決方案
統一服務電話:0411-62888851