二維碼登錄的本質
二維碼登錄本質上是一種登錄認證方式。主要做了兩件事情:
-
告訴系統我是誰
-
向系統證明我是誰
登錄方式對比
從最開始的賬號密碼登錄來解析:賬號的作用是告訴系統當前用戶是誰, 密碼則是向系統證明當前用戶是合法用戶。
從手機驗證碼登錄來解析:手機號就是告訴系統當前用戶是誰,驗證碼則是向系統證明當前用戶是合法用戶。
那么從掃碼登錄解析則是這樣:
- 首先,現象是手機端應用掃 PC 端二維碼,手機端確認后,賬號就在 PC 端登錄成功了。當然,PC 端登錄的賬號肯定與手機端是同一個賬號。不可能手機端登錄的是賬號 A,而掃碼登錄以后,PC 端登錄的是賬號 B。
- 所以,第一件事情,告訴系統當前用戶是誰。
- 第二件事情,向系統證明當前用戶是合法用戶。
掃碼登錄過程中,用戶並沒有去輸入密碼,也沒有輸入驗證碼,或者其他什么碼。那是怎么證明的呢?難道是掃碼過程中把密碼傳到了 PC 端?非也,那樣相當是太不安全,客戶端根本不會存儲密碼。既然手機端 APP 已經登錄,那么手機端是已經通過登錄認證。所以掃碼過程中只要向系統表明是當前已經登錄的用戶所在的手機操作的,就能間接證明掃碼的是一個合法用戶。
條形碼與二維碼
所謂條形碼,也就是一維碼,超市里的商品經常會用到條形碼。條形碼存儲的是一串數字,它上面存儲了商品的序列號。
二維碼與條形碼類似,不過它存儲的不一定是數字,可以是任何的字符串,網上有很多在線生成二維碼的工具網站,這些網站可以提供字符串與二維碼之間相互轉換的功能。
系統認證機制
大致介紹一下移動互聯網下的系統認證機制。
在日常使用過程中,一般情況下只有在 APP 下載后,第一次登錄時才需要進行賬號密碼登錄的操作,之后即使這個應用進程被殺掉,或者手機重啟,都不需要再次輸入賬號密碼。而前面說到,為了安全,手機端不會存儲密碼,其實這背后使用的是一套基於 token 的認證機制。
token 認證機制
-
賬號密碼登錄時,客戶端會將設備信息一起傳遞給服務端,
-
如果賬號密碼校驗通過,服務端會把賬號與設備進行一個綁定,存在一個數據結構中,這個數據結構中包含了賬號 ID,設備 ID,設備類型等等
token = { acountid:'賬號ID', deviceid:'登錄的設備ID', deviceType:'設備類型,如 iso,android,pc......', }
- 接下來服務端會生成一個 token,用它來映射數據結構再傳遞給客戶端。這個 token 其實就是一串有着特殊意義的字符串,它的意義就在於,通過它可以找到對應的賬號與設備信息
- 客戶端得到 token 后,需要進行本地保存,每次訪問系統 API 都攜帶上 token 與設備信息。
- 服務端每次接受請求時都通過 token 找到與它綁定的賬號與設備信息,然后把綁定的設備信息與客戶端每次傳來的設備信息進行比較, 如果相同,那么校驗通過,返回 API 接口響應數據, 如果不同,則校驗不通過拒絕訪問
使用 token 認證機制,客戶端就不會也沒必要保存密碼,相反,它是保存了 token。即使 token 泄露,因為設備信息是唯一的,只要設備信息沒有和 token 一起泄露,驗證也是不通過的。
掃描二維碼登錄的一般步驟
掃碼登錄過程中,PC 端是如何獲得屬於自己的 token。手機端的 token 不可能直接作為 PC 端的 token 使用。因為token 只能屬於某個客戶端私有,其他人或者是其他客戶端無法使用。
在分析這個問題之前,有必要先梳理一下,掃描二維碼登錄的一般步驟。
掃碼前大概流程分析
-
掃碼前,手機端應用是已登錄狀態,PC 端顯示一個二維碼,等待掃描
-
手機端打開應用,掃描 PC 端的二維碼,掃描后,會提示"已掃描,請在手機端點擊確認"
-
用戶在手機端點擊確認,確認后 PC 端登錄就成功了
二維碼在中間有三個狀態, 待掃描,已掃描待確認,已確認。由此可得:
-
二維碼的背后它一定存在一個唯一性的 ID,當二維碼生成時,這個 ID 也一起生成,並且綁定了 PC 端的設備信息
-
手機掃描這個二維碼
-
二維碼切換為“已掃描待確認狀態”, 此時就會將賬號信息與這個 ID 綁定
-
當手機端確認登錄時,它就會生成 PC 端用於登錄的 token,並返回給 PC 端
步驟一:二維碼准備
按二維碼不同狀態來看, 首先是等待掃描狀態,用戶打開 PC 端,切換到二維碼登錄界面時。
-
PC 端向服務端發起請求,告訴服務端,需要生成用戶登錄的二維碼,並且把 PC 端設備信息也傳遞給服務端
-
服務端收到請求后,生成二維碼 ID,並將二維碼 ID 與 PC 端設備信息進行綁定
-
服務端將二維碼 ID 返回給 PC 端
-
PC 端收到二維碼 ID 后,生成二維碼(二維碼中肯定包含了 ID)
-
為了及時知道二維碼的狀態,客戶端在展現二維碼后,PC 端不斷的輪詢服務端,比如每隔一秒就輪詢一次,請求服務端告訴當前二維碼的狀態及相關信息
步驟二:掃碼狀態切換
-
用戶用手機掃描 PC 端的二維碼,通過二維碼內容取到其中的二維碼 ID
-
手機端調用服務端 API 將移動端的身份信息與二維碼 ID 一起發送給服務端
-
服務端接收到后,將身份信息與二維碼 ID 進行綁定,生成臨時 token。然后返回給手機端
-
PC 端一直在輪詢二維碼狀態,所以這時候二維碼狀態發生了改變,它就可以在界面上把二維碼狀態更新為已掃描
在步驟二的第三點中返回臨時 token,這一步很重要。臨時 token 與 token 一樣,它也是一種身份憑證,不同的地方在於它只能用一次,用過就失效。為的就是手機端在下一步操作時,可以用它作為憑證。以此確保掃碼,登錄兩步操作是同一部手機端發出的,
步驟三:狀態確認
-
手機端在接收到臨時 token 后會彈出確認登錄界面,用戶點擊確認時,手機端攜帶臨時 token 用來調用服務端的接口,告訴服務端,我已經確認
-
服務端收到確認后,根據二維碼 ID 綁定的設備信息與賬號信息,生成用戶 PC 端登錄的 token
-
這時候 PC 端的輪詢接口就可以得知二維碼的狀態已經變成了"已確認"。並且從服務端可以獲取到用戶登錄的 token
-
登錄就成功
參考:https://juejin.cn/post/6940976355097985032