網頁版微信剛推出時,無數人被它的登入方式驚豔了一下,不需要輸入使用者名密碼,打開手機微信掃一掃,便自動登入。從原理上講,二維碼隻能是一段文本的編碼,如何用它實作快捷登入的呢?
打開網頁版微信,可以看到如下的頁面:

微信掃碼界面
如果你用我查查、支付寶、新浪微網誌等軟體掃碼二維碼,你會發現此二維碼解析出來是如下的網址:
https://login.weixin.qq.com/l/obsbQ-Dzag==
接下來詳細介紹一下掃碼登入具體的每個步驟:
掃碼登入完整流程
①:使用者 A 通路微信網頁版,微信伺服器為這個會話生成一個全局唯一的 ID,上面的 URL 中 obsbQ-Dzag== 就是這個 ID,此時系統并不知道通路者是誰。
②:使用者A打開自己的手機微信并掃描這個二維碼,并提示使用者是否确認登入。
③:手機上的微信是登入狀态,使用者點選确認登入後,手機上的微信用戶端将微信賬号和這個掃描得到的 ID 一起送出到伺服器
④:伺服器将這個 ID 和使用者 A 的微信号綁定在一起,并通知網頁版微信,這個 ID 對應的微信号為使用者 A,網頁版微信加載使用者 A 的微信資訊,至此,掃碼登入全部流程完成
掃碼登入看起來神奇,主要是因為微信 APP 掃自家的碼會做一些普通二維碼軟體不會做的額外的操作,那就是将目前已登入的微信和掃出來的 ID 送出到微信伺服器,類似的應用還有掃碼支付、掃碼加公衆号等功能。
掃碼登入原理
掃碼登入大概的思路是:微信手機用戶端從網頁二維碼裡面得到一些資訊,然後發送給網頁微信的伺服器,網頁伺服器驗證資訊并響應。下面,我們借助火狐浏覽器提供的Firebug工具看看,到底是怎麼一回事兒吧!
1.每次打開微信網頁版的時候,都會生成一個含有唯一uid的二維碼,而且每次重新整理後都會改變。這樣可以保證一個uid隻可以綁定一個賬号和密碼,确定登入使用者的唯一性。可以通過手機上的UC浏覽器提供的掃碼功能檢視二維碼裡面的資訊,但并不會自動打開該位址。
我重新整理三次,掃描結果如下,其中最後面那串數字就是uid:
1)
https://login.weixin.qq.com/l/48e24d66bdbc4f2)
https://login.weixin.qq.com/l/0787fb4fa7ad4c3)
https://login.weixin.qq.com/l/92781a4a7f1c47通過檢視網頁源碼,這個頁面在加載完畢時,已經把很多登入後才需要的相關資源都預先加載進來了,是以登入使用者得到确認後展示使用者資訊的速度很快。
2.除了傳回唯一的uid,實際上打開這個頁面的時候,浏覽器跟伺服器還建立了一個長連接配接,請求uid的掃描記錄。如果沒有,在特定時長後(目前是27秒左右)會接到狀态碼408(請求逾時),表示應該繼續下一次請求;如果接到狀态碼201(伺服器建立新資源成功),表示用戶端掃描了該二維碼。
3.當使用者使用登入後的微信掃描二維碼的時候,會将uid和手機微信産生的token進行綁定,并上傳到伺服器。這個時候,浏覽器通過長輪詢查詢到uid掃描記錄,立即得到201響應碼,然後通知伺服器,用戶端由此也進入一個新的頁面(就是那個要你點确認的按鈕)。在用戶端點選确認後,獲得伺服器授信的令牌,進行随後的資訊互動過程。
結語
總的來說,微信掃碼登入核心過程應該是這樣的:浏覽器獲得一個唯一的、臨時的uid,通過長連接配接等待用戶端掃描帶有此uid的二維碼後,從長連接配接中獲得用戶端上報給伺服器的帳号資訊進行展示。并在用戶端點選确認後,獲得伺服器授信的令牌,進行随後的資訊互動過程。 在逾時、網絡斷開、其他裝置上登入後,此前獲得的令牌或丢失、或失效,對授權過程形成有效的安全防護。
整理參考
www.jianshu.com/p/7f072ac61763 justcoding.iteye.com/blog/2213661
推薦去我的部落格閱讀更多:
1.Java JVM、集合、多線程、新特性系列教程
2.Spring MVC、Spring Boot、Spring Cloud 系列教程
3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程
4.Java、後端、架構、阿裡巴巴等大廠最新面試題
覺得不錯,别忘了點贊+轉發哦!