1. 程式人生 > 其它 >二維碼掃碼登入的原理

二維碼掃碼登入的原理

二維碼登入的本質

  二維碼登入本質上是一種登入認證方式。主要做了兩件事情:

  1. 告訴系統我是誰

  2. 向系統證明我是誰

  

登入方式對比

  從最開始的賬號密碼登入來解析:賬號的作用是告訴系統當前使用者是誰, 密碼則是向系統證明當前使用者是合法使用者。

  從手機驗證碼登入來解析:手機號就是告訴系統當前使用者是誰,驗證碼則是向系統證明當前使用者是合法使用者。

  那麼從掃碼登入解析則是這樣:

  • 首先,現象是手機端應用掃 PC 端二維碼,手機端確認後,賬號就在 PC 端登入成功了。當然,PC 端登入的賬號肯定與手機端是同一個賬號。不可能手機端登入的是賬號 A,而掃碼登入以後,PC 端登入的是賬號 B。
  • 所以,第一件事情,告訴系統當前使用者是誰。
  • 第二件事情,向系統證明當前使用者是合法使用者。

掃碼登入過程中,使用者並沒有去輸入密碼,也沒有輸入驗證碼,或者其他什麼碼。那是怎麼證明的呢?難道是掃碼過程中把密碼傳到了 PC 端?非也,那樣相當是太不安全,客戶端根本不會儲存密碼。既然手機端 APP 已經登入,那麼手機端是已經通過登入認證。所以掃碼過程中只要向系統表明是當前已經登入的使用者所在的手機操作的,就能間接證明掃碼的是一個合法使用者

條形碼與二維碼

  所謂條形碼,也就是一維碼,超市裡的商品經常會用到條形碼。條形碼儲存的是一串數字,它上面儲存了商品的序列號。

  二維碼與條形碼類似,不過它儲存的不一定是數字,可以是任何的字串,網上有很多線上生成二維碼的工具網站,這些網站可以提供字串與二維碼之間相互轉換的功能。

系統認證機制

  大致介紹一下移動網際網路下的系統認證機制。

  在日常使用過程中,一般情況下只有在APP 下載後,第一次登入時才需要進行賬號密碼登入的操作,之後即使這個應用程序被殺掉,或者手機重啟,都不需要再次輸入賬號密碼。而前面說到,為了安全,手機端不會儲存密碼,其實這背後使用的是一套基於 token 的認證機制。

token認證機制

  1. 賬號密碼登入時,客戶端會將裝置資訊一起傳遞給服務端,

  2. 如果賬號密碼校驗通過,服務端會把賬號與裝置進行一個繫結,存在一個數據結構中,這個資料結構中包含了賬號 ID,裝置 ID,裝置型別等等

    token = {
      acountid:'賬號ID'
    , deviceid:'登入的裝置ID', deviceType:'裝置型別,如 iso,android,pc......', }
  3. 接下來服務端會生成一個 token,用它來對映資料結構再傳遞給客戶端。這個 token 其實就是一串有著特殊意義的字串,它的意義就在於,通過它可以找到對應的賬號與裝置資訊
  4. 客戶端得到 token 後,需要進行本地儲存,每次訪問系統 API 都攜帶上 token 與裝置資訊。
  5. 服務端每次接受請求時都通過 token 找到與它繫結的賬號與裝置資訊,然後把繫結的裝置資訊與客戶端每次傳來的裝置資訊進行比較, 如果相同,那麼校驗通過,返回 API 介面響應資料, 如果不同,則校驗不通過拒絕訪問

  使用 token認證機制,客戶端就不會也沒必要儲存密碼,相反,它是儲存了 token。即使token洩露,因為裝置資訊是唯一的,只要裝置資訊沒有和token一起洩露,驗證也是不通過的。

掃描二維碼登入的一般步驟

  掃碼登入過程中,PC 端是如何獲得屬於自己的 token。手機端的token不可能直接作為 PC 端的token使用。因為token 只能屬於某個客戶端私有,其他人或者是其他客戶端無法使用。

  在分析這個問題之前,有必要先梳理一下,掃描二維碼登入的一般步驟。

掃碼前大概流程分析

  1. 掃碼前,手機端應用是已登入狀態,PC 端顯示一個二維碼,等待掃描

  2. 手機端開啟應用,掃描 PC 端的二維碼,掃描後,會提示"已掃描,請在手機端點選確認"

  3. 使用者在手機端點選確認,確認後 PC 端登入就成功了

二維碼在中間有三個狀態, 待掃描,已掃描待確認,已確認。由此可得:

  1. 二維碼的背後它一定存在一個唯一性的 ID,當二維碼生成時,這個 ID 也一起生成,並且綁定了 PC 端的裝置資訊

  2. 手機掃描這個二維碼

  3. 二維碼切換為“已掃描待確認狀態”, 此時就會將賬號資訊與這個 ID 繫結

  4. 當手機端確認登入時,它就會生成 PC 端用於登入的 token,並返回給 PC 端

步驟一:二維碼準備

  按二維碼不同狀態來看, 首先是等待掃描狀態,使用者開啟 PC 端,切換到二維碼登入介面時。

  1. PC 端向服務端發起請求,告訴服務端,需要生成使用者登入的二維碼,並且把 PC 端裝置資訊也傳遞給服務端

  2. 服務端收到請求後,生成二維碼 ID,並將二維碼 ID 與 PC 端裝置資訊進行繫結

  3. 服務端將二維碼 ID 返回給 PC 端

  4. PC 端收到二維碼 ID 後,生成二維碼(二維碼中肯定包含了 ID)

  5. 為了及時知道二維碼的狀態,客戶端在展現二維碼後,PC 端不斷的輪詢服務端,比如每隔一秒就輪詢一次,請求服務端告訴當前二維碼的狀態及相關資訊

步驟二:掃碼狀態切換

  1. 使用者用手機掃描 PC 端的二維碼,通過二維碼內容取到其中的二維碼 ID

  2. 手機端呼叫服務端 API 將移動端的身份資訊與二維碼 ID 一起傳送給服務端

  3. 服務端接收到後,將身份資訊與二維碼 ID 進行繫結,生成臨時 token。然後返回給手機端

  4. PC 端一直在輪詢二維碼狀態,所以這時候二維碼狀態發生了改變,它就可以在介面上把二維碼狀態更新為已掃描

在步驟二的第三點中返回臨時 token,這一步很重要。臨時 token 與 token 一樣,它也是一種身份憑證,不同的地方在於它只能用一次,用過就失效。為的就是手機端在下一步操作時,可以用它作為憑證。以此確保掃碼,登入兩步操作是同一部手機端發出的,

步驟三:狀態確認

  1. 手機端在接收到臨時 token 後會彈出確認登入介面,使用者點選確認時,手機端攜帶臨時 token 用來呼叫服務端的介面,告訴服務端,我已經確認

  2. 服務端收到確認後,根據二維碼 ID 繫結的裝置資訊與賬號資訊,生成使用者 PC 端登入的 token

  3. 這時候 PC 端的輪詢介面就可以得知二維碼的狀態已經變成了"已確認"。並且從服務端可以獲取到使用者登入的 token

  4. 登入就成功

參考:https://juejin.cn/post/6940976355097985032