網頁登陸是微信4.2以后版本提供的一種全新的登陸方式。用戶只需要用手機掃一掃微信網頁中的二維碼,就能馬上實現微信網頁登陸。
這種登陸方式雖然炫酷,但是多少有些違背直覺:
- 網頁端是怎么知道是哪個微信賬號掃它的呢?
- 前后兩個事件是如何聯系起來的呢?
- 這種登陸方式安全么?
- 為什么微信選擇這種驗證方式呢?
- 這種登陸方式還可以延伸到其他應用場景么?
出於對這些問題的好奇,我和隔壁老王做了一番探索~
實現機制
今天隔壁老王在剛買的筆記本上體驗了一把網頁微信。他是這么做的:
- 在網頁打開https://wx.qq.com/,這時網頁顯示的是一個二維碼。
- 用手機打開微信,使用掃一掃功能掃描屏幕上的二維碼。
- 掃描成功后,手機微信詢問是否確認登陸網頁版微信,點擊確認后網頁微信登陸成功。
讓我們慢鏡頭重放這個過程:
當老王訪問 https://wx.qq.com/,他在網頁中得到一個二維碼。
在這個過程中,老王的瀏覽器和微信服務器之間建立了一個阻塞的長鏈接,同時服務器還專門為老王新開了一個有獨立UID為SWJNSjNJblBJQT09的Session,並把這個UID嵌入到二維碼中返回。
注意,這個UID只是一個隨機不重復數,並不是Session ID。
老王看到二維碼后,使用手機微信中的掃一掃功能讀取了二維碼中的UID。手機微信把具有老王身份信息的token A和這個SWJNSjNJblBJQT09的UID打包並做一些特殊的處理后,發給微信服務器進行確認。
隔壁老王: 我們可以使用其他二維碼掃描軟件來登陸嗎?
Cosmo: 二維碼的轉碼規則是統一的。任何二維碼掃描軟件都可掃除里面包含的信息。比如上圖掃出的結果是https://login.weixin.qq.com/l/IbMJ3InPIA==。但是只有微信app能夠把包含用戶身份信息的token和這個掃描結果做處理,然后與微信服務器通信,告知它是老王掃了這個二維碼。所以,重要的不是掃描二維碼中的信息,而是誰掃描了這個信息。
當微信服務器通過確認時,它已經同時獲得了用戶老王和UID為SWJNSjNJblBJQT09的網頁端的信息,並知道老王將要通過UID為 SWJNSjNJblBJQT09的Session來訪問微信服務。因為老王是一個真實的用戶,所以微信服務器就給UID為SWJNSjNJblBJQT09的Session分配一個token B,讓老王能夠在一定限定條件下訪問微信服務。由於網頁在加載時候已經把大部分相關資源都預先加載進來了,這個長鏈接得到確認信息后,網頁端只需要加載用戶列表,所以響應速度很快,也不需要手動刷新。
隔壁老王: 限定條件是什么呢?
Cosmo: 具體條件要問騰訊才知道,但是這些限定不外乎限定訪問時間、限定同時登陸設備數、電腦休眠后Toekn自動收回等等。
現在,老王理論上算是登陸成功了。但是為了不顯得突兀,微信服務器貼心地給老王手機發個確認登陸網頁版微信的信息,讓老王做最后一個確認操作。
隔壁老王: 這種登陸方式安全嘛?
Cosmo: 由於整個驗證過程在手機和服務器這個閉環中運行的,有效杜絕了電腦端泛濫的木馬和病毒,並且二維碼的生成和訪問都通過SSL安全通道完成,這種登陸方式在現階段來說應該是安全的。當然,要保管好手機。
至此為止,老王成功登陸了網頁微信啦!
背后原因
酷炫爽說
張小龍多次提到“營銷的目的是讓用戶覺得‘爽’。口碑傳播的基礎是‘好玩’。爽是體驗,體驗比功能更易傳播。” “趣味性大於功能,用戶要的是‘爽’。” 所以,這種登陸方式的提出是微信的一種基於“爽”字的營銷手段。
入口爭奪說
張小龍曾強調“PC的入口在搜索框,手機上的入口在二維碼”。所以二維碼掃描登陸時微信搶占手機入口的重要一環,日后微信將通過這個入口變革我們的登陸方式,最終變成我們的移動身份證。現成的一個例子就是通過掃描智能電視上的二維碼登陸賬號。
借鑒說
有一派說法是,微信這個二維碼登陸借鑒自日本的Line。有趣的是,目前Line已經關閉這項服務。所以這就是日本人精於戰術疏於戰略的例子?
移動核心說
這樣的設計突出了移動O2O核心,突出了微信是為移動而生的理念。
陰謀論說
微信對騰訊某部門沖擊太大,受到限制?(瞎猜的)
總結
引用知乎黃良懿的回復作為微信二維碼登陸的總結:
所以說,核心過程應該是:瀏覽器獲得一個臨時 id,通過長連接等待客戶端掃描帶有此 id 的二維碼后,從長連接中獲得客戶端上報給 server 的帳號信息進行展示。 並在客戶端點擊確認后,獲得服務器授信的令牌,進行隨后的信息交互過程。 在超時、網絡斷開、其他設備上登錄后,此前獲得的令牌或丟失、或失效,對授權過程形成有效的安全防護。