IM掃碼登陸技術專題(三):通俗易懂,IM掃碼登陸功能詳細原理一篇就夠

本文引用了做者「大古同窗」的「二維碼掃碼登陸是什麼原理」一文的主要內容,爲了更好的理解和閱讀,即時通信網收錄時有修訂和改動,感謝原做者的分享。html

一、引言

自從微信的PC端使用掃碼登錄認證邏輯後,這種方式彷佛在愈來愈多的IM中看到(雖然我我的認爲這種登陸方式很酷,但並不方便,尤爲手機不大身邊的時候)。android


▲ 上圖微信PC端的掃碼登陸界面
最近恰好看到一個二維碼的技術原理講解視頻,正好藉此機會將掃碼登陸的詳細技術原理梳理並總結一下,方便自已回顧,也但願能幫助到想在IM裏開發相似功能的同行們。git

補充說明:本文所涉及的掃碼登錄原理並非僅僅針對IM系統,一樣適用於IM以外的其它系統。github

學習交流:算法

  • 即時通信/推送技術開發交流5羣:215477170 [推薦]
  • 移動端IM開發入門文章:《新手入門一篇就夠:從零開發移動端IM》
  • 開源IM框架源碼:https://github.com/JackJiang2...

(本文同步發佈於:http://www.52im.net/thread-35...數據庫

二、專題目錄

本文是系列文章的第3篇,總目錄以下:後端

《IM掃碼登陸技術專題(一):微信的掃碼登陸功能技術原理調試分析》
《IM掃碼登陸技術專題(二):市面主流的掃碼登陸技術原理調試分析》
《IM掃碼登陸技術專題(三):通俗易懂,IM掃碼登陸功能詳細原理一篇就夠》(* 本文)

三、二維碼登陸的本質

3.1 掃碼登陸安全嗎?
在2維碼掃碼登陸的過程當中,你們可能會有疑問:這二維碼安全嗎?會不會泄漏個人我的信息?個人im系統敢不敢也搞一個掃碼登陸呢?安全

針對這些顧慮,咱們須要瞭解一下二維碼掃碼登陸背後的技術和邏輯本質。微信

3.2 掃碼登陸的技術本質
二維碼掃碼登陸本質上也是一種登陸認證方式。網絡

既然是登陸認證,要作的也就兩件事情:

1)告訴系統我是誰;
2)向系統證實我是誰。
舉個實際的例子來理解一下:

好比帳號密碼登陸:帳號就是告訴系統我是誰, 密碼就是向系統證實我是誰;
好比手機驗證碼登陸:手機號就是告訴系統我是誰,驗證碼就是向系統證實我是誰。
那麼掃碼登陸是怎麼作到這兩件事情的呢?

以微做的掃碼登陸爲例:手機端應用掃PC端二維碼,手機端確認後,帳號就在PC端登陸成功了!這裏,PC端登陸的帳號確定與手機端是同一個帳號。不可能手機端登陸的是帳號A,而掃碼登陸之後,PC端登陸的是帳號B。

因此,第一件事情——「告訴系統我是誰」,是比較清楚的!

PS:經過掃描二維碼,把手機端的帳號信息傳遞到PC端,至於具體是怎麼傳的,咱們後面再說。

第二件事情:「向系統證實我是誰」。掃碼登陸過程當中,用戶並無去輸入密碼,也沒有輸入驗證碼,或者其餘什麼碼。那是怎麼證實的呢?

有些同窗會想到,是否是掃碼過程當中,把密碼傳到了PC端呢?

但這是不可能的。由於那樣太不安全的,客戶端也根本不會去存儲密碼。

咱們仔細想一下,其實手機端APP它是已經登陸過的,就是說手機端是已經經過登陸認證。所說只要掃碼確認是這個手機且是這個帳號操做的,其實就能間接證實我誰。

四、認識二維碼

那麼如何作掃碼登錄的確認呢?咱們後面會詳細說明,在這以前咱們須要先認識一下二維碼! 在認識二維碼以前咱們先看一下一維碼!

▲ 這就是一維碼

所謂一維碼,也就是條形碼,條形碼實際上就是一串數字,以平時生活中的商品爲例,它上面的一維碼存儲的就是商品的編號。

二維碼其實與條形碼相似,只不過它存儲的不必定是數字,還能夠是任何的字符串,你能夠認爲,它就是字符串的另一種表現形式。

在搜索引擎中搜索二維碼,你能夠找到不少在線生成二維碼的工具網站,這些網站能夠提供字符串與二維碼之間相互轉換的功能,好比 草料二維碼網站。

▲ 輸入一段字符串就能生成二維碼

在左邊的輸入框就能夠輸入你的內容,它能夠是文本、網址,文件........。而後就能夠生成表明它們的二維碼。

▲ 這是二維碼(已經將內容模糊處理)

你也能夠把二維碼上傳,進行」解碼「,而後就能夠解析出二維碼錶明的含義。

五、傳統系統是如何登錄認證的?

認識了二維碼,咱們瞭解一下移動互聯網下的傳統登陸認證機制。

前面咱們說過,爲了安全,手機端它是不會存儲你的登陸密碼的。 可是在平常使用過程當中,咱們應該會注意到,只有在你的應用下載下來後,第一次登陸的時候,才須要進行一個帳號密碼的登陸, 那以後呢 即便這個應用進程被殺掉,或者手機重啓,都是不須要再次輸入帳號密碼的,它能夠自動登陸。

其實這背後就是一套基於token的認證機制,咱們來看一下這套機制是怎麼運行的。

如上圖所示:

1)帳號密碼登陸時,客戶端會將設備信息一塊兒傳遞給服務端;
2)若是帳號密碼校驗經過,服務端會把帳號與設備進行一個綁定,存在一個數據結構中,這個數據結構中包含了帳號ID、設備ID、設備類型等等。
const token = {

acountid: '帳號ID',

deviceid: '登陸的設備ID',

deviceType: '設備類型,如 iso,android,pc......',

}

而後服務端會生成一個token,用它來映射數據結構,這個token其實就是一串有着特殊意義的字符串,它的意義就在於,經過它能夠找到對應的帳號與設備信息。

具體是:

1)客戶端獲得這個token後,須要進行一個本地保存,每次訪問系統API都攜帶上token與設備信息;
2)服務端就能夠經過token找到與它綁定的帳號與設備信息,而後把綁定的設備信息與客戶端每次傳來的設備信息進行比較, 若是相同,那麼校驗經過,返回AP接口響應數據, 若是不一樣,那就是校驗不經過拒絕訪問。
從前面這個流程,咱們能夠看到,客戶端不會也不必保存你的密碼,相反,它是保存了token。

可能有些同窗會想,這個token這麼重要,萬一被別人知道了怎麼辦。

實際上:知道了也沒有影響, 由於設備信息是惟一的,只要你的設備信息別人不知道, 別人拿其餘設備來訪問,驗證也是不經過的。

能夠說,客戶端登陸的目的,就是得到屬於本身的token。

限於篇幅,這方面的文章,能夠詳細讀一下如下幾篇:

《IM開發基礎知識補課(一):正確理解前置HTTP SSO單點登錄接口的原理》

《IM開發基礎知識補課(四):正確理解HTTP短鏈接中的Cookie、Session和Token》

《IM開發基礎知識補課(七):主流移動端帳號登陸方式的原理及設計思路》(推薦)

那麼在掃碼登陸過程當中,PC端是怎麼得到屬於本身的token呢?不可能手機端直接把本身的token給PC端用!token只能屬於某個客戶端私有,其餘人或者是其餘客戶端是用不了的。

在分析這個問題以前,咱們有必要先梳理一下,掃描二維碼登陸的通常步驟是什麼樣的。這能夠幫助咱們梳理清楚整個過程。

六、掃碼登陸的詳細技術步驟

6.1 大概流程

如上圖所示:

1)掃碼前,手機端應用是已登陸狀態,PC端顯示一個二維碼,等待掃描;
2)手機端打開應用,掃描PC端的二維碼,掃描後,會提示「已掃描,請在手機端點擊確認」;
3)用戶在手機端點擊確認,確認後PC端登陸就成功了。
能夠看到,二維碼在中間有三個狀態:待掃描、已掃描待確認、已確認。

那麼能夠想象:

具體解釋就是:

1)二維碼的背後它必定存在一個惟一性的ID,當二維碼生成時,這個ID也一塊兒生成,而且綁定了PC端的設備信息;
2)手機去掃描這個二維碼;
3)二維碼切換爲 已掃描待確認狀態, 此時就會將帳號信息與這個ID綁定;
4)當手機端確認登陸時,它就會生成PC端用於登陸的token,並返回給PC端。
好了,到這裏,基本思路就已經清晰了,接下來咱們把整個過程再具體化一下。

6.2 二維碼準備
按二維碼不一樣狀態來看, 首先是等待掃描狀態,用戶打開PC端,切換到二維碼登陸界面時。

如上圖所示:

1)PC端向服務端發起請求,告訴服務端,我要生成用戶登陸的二維碼,而且把PC端設備信息也傳遞給服務端;
2)服務端收到請求後,它生成二維碼ID,並將二維碼ID與PC端設備信息進行綁定;
3)而後把二維碼ID返回給PC端;
4)PC端收到二維碼ID後,生成二維碼(二維碼中確定包含了ID);
5)爲了及時知道二維碼的狀態,客戶端在展示二維碼後,PC端不斷的輪詢服務端,好比每隔一秒就輪詢一次,請求服務端告訴當前二維碼的狀態及相關信息。
二維碼已經準好了,接下來就是掃描狀態。

6.3 掃描狀態切換

如上圖所示:

1)用戶用手機去掃描PC端的二維碼,經過二維碼內容取到其中的二維碼ID;
2)再調用服務端API將移動端的身份信息與二維碼ID一塊兒發送給服務端;
3)服務端接收到後,它能夠將身份信息與二維碼ID進行綁定,生成臨時token。而後返回給手機端;
4)由於PC端一直在輪詢二維碼狀態,因此這時候二維碼狀態發生了改變,它就能夠在界面上把二維碼狀態更新爲已掃描。
那麼爲何須要返回給手機端一個臨時token呢?

臨時token與token同樣,它也是一種身份憑證,不一樣的地方在於它只能用一次,用過就失效。

在上圖中的第三步驟中返回臨時token,爲的就是手機端在下一步操做時,能夠用它做爲憑證。以此確保掃碼,登陸兩步操做是同一部手機端發出的。

6.4 狀態確認
最後就是狀態的確認了。

如上圖所示:

1)手機端在接收到臨時token後會彈出確認登陸界面,用戶點擊確認時,手機端攜帶臨時token用來調用服務端的接口,告訴服務端,我已經確認;
2)服務端收到確認後,根據二維碼ID綁定的設備信息與帳號信息,生成用戶PC端登陸的token;
3)這時候PC端的輪詢接口,它就能夠得知二維碼的狀態已經變成了"已確認"。而且從服務端能夠獲取到用戶登陸的token;
4)到這裏,登陸就成功了,後端PC端就能夠用token去訪問服務端的資源了。
掃碼動做的基礎流程都講完了,有些細節尚未深刻介紹。

好比二維碼的內容是什麼?

1)能夠是二維碼ID;
2)能夠是包含二維碼ID的一個url地址。
在掃碼確認這一步,用戶取消了怎麼處理? 這些細節都留給你們思考。

七、本文小結

通俗地總結一下本文的掃碼登錄邏輯就是:

掃碼登陸的本質就是:

  • 1)告訴系統我是誰;
  • 2)向系統證實我誰。

在這個過程當中,咱們先簡單講了兩個前提知識:

  • 1)一個是二維碼原理;
  • 2)一個是基於token的認證機制。

而後咱們以二維碼狀態爲軸,分析了這背後的邏輯: 經過token認證機制與二維碼狀態變化來實現掃碼登陸。

須要指出的是,前面的講的登陸流程,它適一樣用於同一個系統的PC端,WEB端,移動端。

平時咱們還有另一種場景也比較常見,那就是經過第三方應用來掃碼登陸,好比極客時間/掘金 均可以選擇微信/QQ等掃碼登陸,那麼這種經過第三方應用掃碼登陸又是什麼原理呢?

感興趣的同窗能夠思考研究一下,歡迎在評論留下你的看法。

附錄:更多IM開發熱門知識

《新手入門一篇就夠:從零開發移動端IM》
《移動端IM開發者必讀(一):通俗易懂,理解移動網絡的「弱」和「慢」》
《移動端IM開發者必讀(二):史上最全移動弱網絡優化方法總結》
《從客戶端的角度來談談移動端IM的消息可靠性和送達機制》
《現代移動端網絡短鏈接的優化手段總結:請求速度、弱網適應、安全保障》
《騰訊技術分享:社交網絡圖片的帶寬壓縮技術演進之路》
《小白必讀:閒話HTTP短鏈接中的Session和Token》
《IM開發基礎知識補課:正確理解前置HTTP SSO單點登陸接口的原理》
《移動端IM中大規模羣消息的推送如何保證效率、實時性?》
《移動端IM開發須要面對的技術問題》
《開發IM是本身設計協議用字節流好仍是字符流好?》
《請問有人知道語音留言聊天的主流實現方式嗎?》
《IM消息送達保證機制實現(一):保證在線實時消息的可靠投遞》
《IM消息送達保證機制實現(二):保證離線消息的可靠投遞》
《如何保證IM實時消息的「時序性」與「一致性」?》
《一個低成本確保IM消息時序的方法探討》
《IM單聊和羣聊中的在線狀態同步應該用「推」仍是「拉」?》
《IM羣聊消息如此複雜,如何保證不丟不重?》
《談談移動端 IM 開發中登陸請求的優化》
《移動端IM登陸時拉取數據如何做到省流量?》
《淺談移動端IM的多點登陸和消息漫遊原理》
《徹底自已開發的IM該如何設計「失敗重試」機制?》
《通俗易懂:基於集羣的移動端IM接入層負載均衡方案分享》
《微信對網絡影響的技術試驗及分析(論文全文)》
《即時通信系統的原理、技術和應用(技術論文)》
《開源IM工程「蘑菇街TeamTalk」的現狀:一場虎頭蛇尾的開源秀》
《QQ音樂團隊分享:Android中的圖片壓縮技術詳解(上篇)》
《QQ音樂團隊分享:Android中的圖片壓縮技術詳解(下篇)》
《騰訊原創分享(一):如何大幅提高移動網絡下手機QQ的圖片傳輸速度和成功率》
《騰訊原創分享(二):如何大幅壓縮移動網絡下APP的流量消耗(上篇)》
《騰訊原創分享(三):如何大幅壓縮移動網絡下APP的流量消耗(下篇)》
《如約而至:微信自用的移動端IM網絡層跨平臺組件庫Mars已正式開源》
《基於社交網絡的Yelp是如何實現海量用戶圖片的無損壓縮的?》
《騰訊技術分享:騰訊是如何大幅下降帶寬和網絡流量的(圖片壓縮篇)》
《騰訊技術分享:騰訊是如何大幅下降帶寬和網絡流量的(音視頻技術篇)》
《字符編碼那點事:快速理解ASCII、Unicode、GBK和UTF-8》
《全面掌握移動端主流圖片格式的特色、性能、調優等》
《子彈短信光鮮的背後:網易雲信首席架構師分享億級IM平臺的技術實踐》
《IM開發基礎知識補課(五):通俗易懂,正確理解並用好MQ消息隊列》
《微信技術分享:微信的海量IM聊天消息序列號生成實踐(算法原理篇)》
《自已開發IM有那麼難嗎?手把手教你自擼一個Andriod版簡易IM (有源碼)》
《融雲技術分享:解密融雲IM產品的聊天消息ID生成策略》
《IM開發基礎知識補課(六):數據庫用NoSQL仍是SQL?讀這篇就夠了!》
《適合新手:從零開發一個IM服務端(基於Netty,有完整源碼)》
《拿起鍵盤就是幹:跟我一塊兒徒手開發一套分佈式IM系統》
《適合新手:手把手教你用Go快速搭建高性能、可擴展的IM系統(有源碼)》
《IM裏「附近的人」功能實現原理是什麼?如何高效率地實現它?》
《IM開發基礎知識補課(七):主流移動端帳號登陸方式的原理及設計思路》
《IM開發基礎知識補課(八):史上最通俗,完全搞懂字符亂碼問題的本質》
《IM「掃一掃」功能很好作?看看微信「掃一掃識物」的完整技術實現》
《IM的掃碼登陸功能如何實現?一文搞懂主流應用的掃碼登陸技術原理》
《IM要作手機掃碼登陸?先看看微信的掃碼登陸功能技術原理》
《IM消息ID技術專題(一):微信的海量IM聊天消息序列號生成實踐(算法原理篇)》
《IM消息ID技術專題(二):微信的海量IM聊天消息序列號生成實踐(容災方案篇)》
《IM消息ID技術專題(三):解密融雲IM產品的聊天消息ID生成策略》
《IM消息ID技術專題(四):深度解密美團的分佈式ID生成算法》
《IM消息ID技術專題(五):開源分佈式ID生成器UidGenerator的技術實現》
《IM消息ID技術專題(六):深度解密滴滴的高性能ID生成器(Tinyid)》
《IM開發寶典:史上最全,微信各類功能參數和邏輯規則資料彙總》
《IM開發乾貨分享:我是如何解決大量離線消息致使客戶端卡頓的》
《零基礎IM開發入門(一):什麼是IM系統?》
《零基礎IM開發入門(二):什麼是IM系統的實時性?》
《零基礎IM開發入門(三):什麼是IM系統的可靠性?》
《零基礎IM開發入門(四):什麼是IM系統的消息時序一致性?》
《IM開發乾貨分享:如何優雅的實現大量離線消息的可靠投遞》
《IM開發乾貨分享:有贊移動端IM的組件化SDK架構設計實踐》
《一套億級用戶的IM架構技術乾貨(下篇):可靠性、有序性、弱網優化等》

更多同類文章 ……

本文已同步發佈於「即時通信技術圈」公衆號。

▲ 本文在公衆號上的連接是:點此進入。同步發佈連接是:http://www.52im.net/thread-35...

相關文章
相關標籤/搜索