Jack Jiang

          我的最新工程MobileIMSDK:http://git.oschina.net/jackjiang/MobileIMSDK
          posts - 499, comments - 13, trackbacks - 0, articles - 1

          1、引言

          在即時通訊網經常能看到各種高大上的高并發、分布式、高性能架構設計方面的文章,平時大家參加的眾多開發者大會,主題也都是各種高大上的話題——什么5G啦、AI人工智能啦、什么阿里雙11分分鐘多少萬QPS高并發等等。

          但實際上,對于普通的開發者(包括IM開發人員)來說,多數公司、多數團隊也都是干著默默無聞、平淡無奇的產品開發,并沒有那么多高并發、高大上的事情可以做。

          就拿一個IM系統來說,無論你的架構設計考慮了多少分布式、高吞吐、高可用,所有這些事情只要落地,那編碼的第一件事情就是要實現幾乎所有信息系統都要面對的任務——如何設計賬號登錄功能?

          本文將分享幾種典型的移動端賬號登陸方式的技術原理,以及設計思路,理解后,完全可以快速實施于你的各種應用系統(并不限于IM系統)中。本文閱讀對像主要為剛入門的開發人員,請程序老司機們嘴下留情哦。

           

          通過本篇文章, 你可以學到:

          1)主流賬號登陋技術方案細節;

          2)相應的表設計;

          3)相應的流程設計。

          通過本篇文章, 你無法學到:

          與其他原理性的文章一樣,本篇不涉及具體代碼實現細節(對于程序員來說,只要思路搞通,代碼咋寫都不會太爛,大家應該都有體會)。

          學習交流:

          - 即時通訊/推送技術開發交流5群:215477170[推薦]

          - 移動端IM開發入門文章:《新手入門一篇就夠:從零開發移動端IM

          (本文同步發布于:http://www.52im.net/thread-2863-1-1.html

          2、IM開發干貨系列文章

          本文是系列文章中的第20篇,總目錄如下:

          IM消息送達保證機制實現(一):保證在線實時消息的可靠投遞

          IM消息送達保證機制實現(二):保證離線消息的可靠投遞

          如何保證IM實時消息的“時序性”與“一致性”?

          IM單聊和群聊中的在線狀態同步應該用“推”還是“拉”?

          IM群聊消息如此復雜,如何保證不丟不重?

          一種Android端IM智能心跳算法的設計與實現探討(含樣例代碼)

          移動端IM登錄時拉取數據如何作到省流量?

          通俗易懂:基于集群的移動端IM接入層負載均衡方案分享

          淺談移動端IM的多點登陸和消息漫游原理

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

          IM開發基礎知識補課(二):如何設計大量圖片文件的服務端存儲架構?

          IM開發基礎知識補課(三):快速理解服務端數據庫讀寫分離原理及實踐建議

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

          IM群聊消息的已讀回執功能該怎么實現?

          IM群聊消息究竟是存1份(即擴散讀)還是存多份(即擴散寫)?

          IM開發基礎知識補課(五):通俗易懂,正確理解并用好MQ消息隊列

          一個低成本確保IM消息時序的方法探討

          IM開發基礎知識補課(六):數據庫用NoSQL還是SQL?讀這篇就夠了!

          IM里“附近的人”功能實現原理是什么?如何高效率地實現它?

          IM開發基礎知識補課(七):主流移動端賬號登錄方式的原理及設計思路》(本文)

          3、最經典的用戶名密碼注冊登陸方式

          一個典型的用戶名密碼注冊登陸功能類似于下面這樣:

           

          這種賬號登陸方式很經典也很常用,先注冊、再進行登錄,尤其在老一點的CMS系統、網站系統、聊天應用中都能找到這個影子。

          它的技術原理流程圖如下:

           
           

          如上圖所示,詳細的流程說明如下:

          • 1)前端將用戶名、密碼發送到服務器,服務器進行常規的判斷,判斷用戶名、密碼長度是否滿足,用戶名是否重復等條件,條件不通過直接返回對應錯誤碼給到前端,這里密碼字段,為了防止傳輸過程中被截胡,建議加密再上傳,我們的傳輸密碼默認都是會進行一個md5加密,然后記錄到數據庫再進行一層加密,就算是脫庫也沒事,密碼不要明文存儲。
          • 2)校驗通過后,就將用戶名密碼寫入數據庫,并進行后面積分發放等操作,這里不展開。
          • 3)現在進行登錄,前端將用戶名,密碼發送給到服務端,服務端首先會校驗登錄次數是否超過設置的閾值,如果超過只能繼續等待被關小黑屋。
          • 4)如果未超過繼續登錄邏輯,判斷用戶名、密碼是否正確,不正確密碼則進行閾值的判斷,如果超過則關小黑屋,記住小黑屋必須設置過期時間,要不然就會永久關上了,這個可以用redis的過期來做。
          • 5)登錄成功后進行后續的一切后置邏輯,比如加積分。。。等操作。

          這種經典的注冊登陸方式,具體怎么設計就不在這里贅述了,誰都懂。

          4、現今最主流的手機號注冊登陸方式

          4.1 基本原理

          典型的手機號注冊登陸功能類似于下圖:

           

          典型的手機號注冊技術原理流程圖如下:

           
           

          如上圖所示,詳細的流程說明如下:

          • 1)首先輸入手機號:然后發送到服務端,服務端將手機號記錄在我們數據庫中,然后生成隨機驗證碼,并將手機號和驗證碼綁定到一個redis里面,然后記錄過期時間,這個過期時間一般是10分鐘左右,這就是我們一般手機驗證碼的有效期;
          • 2)手機接收到手機短信后:那么就在界面填寫驗證碼發送服務端,服務端收到驗證碼后就會在redis里面查詢到這個手機號對應的驗證碼,失敗就返回錯誤碼。
          • 3)成功后:就進行登錄操作。

          這里看起來沒有明確的注冊登錄操作,其實在發送手機號碼就可以認為是一個常規的注冊,然后后面的驗證碼輸入就是一個登陸操作。

          但這種區別于常見的用戶名密碼注冊方式,是沒有密碼的的。

          問: 那我要密碼咋辦?

          答: 在后續產品里面增加一個手機號碼密碼補錄的功能即可,這也是現在很常規的手法,但是現在移動互聯網大爆炸時代,密碼已經顯得不是那么重要了,反正我從來記不住密碼,如果手機號碼能操作的app,絕對不用密碼來操作。

          4.2 具體的數據庫設計

          表結構: 

          說明:

          這里只是單純說明需要用到的數據,沒有擴展具體場景,這個表結構能夠滿足上面兩個方案的設計。

          5、一種輔助的登陸方式:第3方賬號登陸

          5.1 基本原理

          現在很多應用為了降低新用戶的使用門檻,都會對接第3方賬號進行登陸(比如:用微信號登陸、QQ號登陸、微博賬號登陸等)。

          這里我以QQ的開放平臺登錄邏輯為例進行講解。

          某團外賣的QQ賬號登陸功能如下圖:

           

          我們先來一波時序圖:

           
           

          時序流程詳細說明:

          • 1)客戶端自己調起登錄的界面,進行輸入用戶名、密碼,這里的是第三方的用戶名,密碼,登錄成功后,會返回access_token openid expire_in,這過程會使用到oauth2.0,不過在sdk里面進行內置回調獲取了,后面我們會說明我們自身實現的oauth2.0;
          • 2)客戶端拿到access_token、openid、login_type(qq、wechat...)請求應用服務器,應用服務器拿到這些數據后就會根據對應的login_type去對應的用戶中心進行access_token和openid進行校驗。校驗不通過則返回對應錯誤碼;
          • 3)校驗通過后就會判斷本地是否有這個login_type和openid是否存在,不存在則進行獲取遠程的用戶名、頭像等基礎信息來作為本地基礎數據,并且返回code值;
          • 4)如果已經存在,那就是進行登錄操作,返回code值;
          • 5)客戶端拿到code值后進行token值的換取,這個完全遵照oauth2.0的協議來走的,后續每次請求必須帶上token,token值在服務端的時間比較久,因為我們想要做的是那種永不下線的操作,所以每次請求我們都將token過期時間進行累加。

          想要深入了解第3方賬號登陸,可以讀讀這兩篇:《第三方登錄:QQ登錄接入指南》、《第三方賬號登錄功能接入完全流程》。

          5.2 具體的數據庫設計

          表結構:

          對于讀者的建議,我這里做一下數據庫的整理。

           

          用戶基礎表(users):

           

          用戶驗證關聯表(user_auth_rel): 

           

          本地用戶表(user_local_auth):

           

          第三方用戶表(user_third_auth): 

           

          表結說明:

          • 1)users表只是單純針對我們業務側的登錄,主要是做自身業務的oauth2.0業務;
          • 2)user_local_auth是做自己用戶名、密碼登錄,手機號碼登錄信息記錄;
          • 3)user_third_auth是我們第三方用戶體系的數據記錄;
          • 4)user_auth_rel是用來關聯我們users表與user_local_auth、user_third_auth;
          • 5)整個設計理念就是將自建用戶與第三方在存儲上區分,這在架構演進上也是合乎情理的,開始用戶體系大多自建,而后才是對外接入。

          6、本文小結

          總的來講,賬號注冊登錄功能在一般的系統里都是入口功能,一般情況下都不會太復雜。

          對于第三方用戶的接入技術,也同樣比較簡單,我文章里設計多一個user_thirds是可以支持足夠多的第三方接入,當然一般我們也就兩三個登錄就好,太多登錄方不僅自身維護成本,界面擺盤也不好看不是。

          希望大家能夠通過以上學習,能夠對于賬戶注冊登錄有一個比較好的認知,文章里設計方案不包含分表分庫、沒有服務化,就是簡單直接的設計,當然用戶量和需要的不一樣,在這個基礎上還要加很多東西,謝謝大家閱讀。

          附錄:更多IM開發方面的文章

          [1] IM開發綜合文章:

          新手入門一篇就夠:從零開發移動端IM

          移動端IM開發者必讀(一):通俗易懂,理解移動網絡的“弱”和“慢”

          移動端IM開發者必讀(二):史上最全移動弱網絡優化方法總結

          從客戶端的角度來談談移動端IM的消息可靠性和送達機制

          現代移動端網絡短連接的優化手段總結:請求速度、弱網適應、安全保障

          騰訊技術分享:社交網絡圖片的帶寬壓縮技術演進之路

          小白必讀:閑話HTTP短連接中的Session和Token

          IM開發基礎知識補課:正確理解前置HTTP SSO單點登陸接口的原理

          移動端IM開發需要面對的技術問題

          開發IM是自己設計協議用字節流好還是字符流好?

          請問有人知道語音留言聊天的主流實現方式嗎?

          一個低成本確保IM消息時序的方法探討

          完全自已開發的IM該如何設計“失敗重試”機制?

          通俗易懂:基于集群的移動端IM接入層負載均衡方案分享

          微信對網絡影響的技術試驗及分析(論文全文)

          即時通訊系統的原理、技術和應用(技術論文)

          開源IM工程“蘑菇街TeamTalk”的現狀:一場有始無終的開源秀

          QQ音樂團隊分享:Android中的圖片壓縮技術詳解(上篇)

          QQ音樂團隊分享:Android中的圖片壓縮技術詳解(下篇)

          騰訊原創分享(一):如何大幅提升移動網絡下手機QQ的圖片傳輸速度和成功率

          騰訊原創分享(二):如何大幅壓縮移動網絡下APP的流量消耗(上篇)

          騰訊原創分享(三):如何大幅壓縮移動網絡下APP的流量消耗(下篇)

          如約而至:微信自用的移動端IM網絡層跨平臺組件庫Mars已正式開源

          基于社交網絡的Yelp是如何實現海量用戶圖片的無損壓縮的?

          騰訊技術分享:騰訊是如何大幅降低帶寬和網絡流量的(圖片壓縮篇)

          騰訊技術分享:騰訊是如何大幅降低帶寬和網絡流量的(音視頻技術篇)

          字符編碼那點事:快速理解ASCII、Unicode、GBK和UTF-8

          全面掌握移動端主流圖片格式的特點、性能、調優等

          子彈短信光鮮的背后:網易云信首席架構師分享億級IM平臺的技術實踐

          微信技術分享:微信的海量IM聊天消息序列號生成實踐(算法原理篇)

          自已開發IM有那么難嗎?手把手教你自擼一個Andriod版簡易IM (有源碼)

          融云技術分享:解密融云IM產品的聊天消息ID生成策略

          適合新手:從零開發一個IM服務端(基于Netty,有完整源碼)

          拿起鍵盤就是干:跟我一起徒手開發一套分布式IM系統

          >> 更多同類文章 …… 

          [2] 有關IM架構設計的文章:

          淺談IM系統的架構設計

          簡述移動端IM開發的那些坑:架構設計、通信協議和客戶端

          一套海量在線用戶的移動端IM架構設計實踐分享(含詳細圖文)

          一套原創分布式即時通訊(IM)系統理論架構方案

          從零到卓越:京東客服即時通訊系統的技術架構演進歷程

          蘑菇街即時通訊/IM服務器開發之架構選擇

          騰訊QQ1.4億在線用戶的技術挑戰和架構演進之路PPT

          微信后臺基于時間序的海量數據冷熱分級架構設計實踐

          微信技術總監談架構:微信之道——大道至簡(演講全文)

          如何解讀《微信技術總監談架構:微信之道——大道至簡》

          快速裂變:見證微信強大后臺架構從0到1的演進歷程(一)

          17年的實踐:騰訊海量產品的技術方法論

          移動端IM中大規模群消息的推送如何保證效率、實時性?

          現代IM系統中聊天消息的同步和存儲方案探討

          IM開發基礎知識補課(二):如何設計大量圖片文件的服務端存儲架構?

          IM開發基礎知識補課(三):快速理解服務端數據庫讀寫分離原理及實踐建議

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

          WhatsApp技術實踐分享:32人工程團隊創造的技術神話

          微信朋友圈千億訪問量背后的技術挑戰和實踐總結

          王者榮耀2億用戶量的背后:產品定位、技術架構、網絡方案等

          IM系統的MQ消息中間件選型:Kafka還是RabbitMQ?

          騰訊資深架構師干貨總結:一文讀懂大型分布式系統設計的方方面面

          以微博類應用場景為例,總結海量社交系統的架構設計步驟

          快速理解高性能HTTP服務端的負載均衡技術原理

          子彈短信光鮮的背后:網易云信首席架構師分享億級IM平臺的技術實踐

          知乎技術分享:從單機到2000萬QPS并發的Redis高性能緩存實踐之路

          IM開發基礎知識補課(五):通俗易懂,正確理解并用好MQ消息隊列

          微信技術分享:微信的海量IM聊天消息序列號生成實踐(算法原理篇)

          微信技術分享:微信的海量IM聊天消息序列號生成實踐(容災方案篇)

          新手入門:零基礎理解大型分布式架構的演進歷史、技術原理、最佳實踐

          一套高可用、易伸縮、高并發的IM群聊、單聊架構方案設計實踐

          阿里技術分享:深度揭秘阿里數據庫技術方案的10年變遷史

          阿里技術分享:阿里自研金融級數據庫OceanBase的艱辛成長之路

          社交軟件紅包技術解密(一):全面解密QQ紅包技術方案——架構、技術實現等

          社交軟件紅包技術解密(二):解密微信搖一搖紅包從0到1的技術演進

          社交軟件紅包技術解密(三):微信搖一搖紅包雨背后的技術細節

          社交軟件紅包技術解密(四):微信紅包系統是如何應對高并發的

          社交軟件紅包技術解密(五):微信紅包系統是如何實現高可用性的

          社交軟件紅包技術解密(六):微信紅包系統的存儲層架構演進實踐

          社交軟件紅包技術解密(七):支付寶紅包的海量高并發技術實踐

          社交軟件紅包技術解密(八):全面解密微博紅包技術方案

          社交軟件紅包技術解密(九):談談手Q紅包的功能邏輯、容災、運維、架構等

          即時通訊新手入門:一文讀懂什么是Nginx?它能否實現IM的負載均衡?

          即時通訊新手入門:快速理解RPC技術——基本概念、原理和用途

          多維度對比5款主流分布式MQ消息隊列,媽媽再也不擔心我的技術選型了

          從游擊隊到正規軍(一):馬蜂窩旅游網的IM系統架構演進之路

          從游擊隊到正規軍(二):馬蜂窩旅游網的IM客戶端架構演進和實踐總結

          IM開發基礎知識補課(六):數據庫用NoSQL還是SQL?讀這篇就夠了!

          瓜子IM智能客服系統的數據架構設計(整理自現場演講,有配套PPT)

          阿里釘釘技術分享:企業級IM王者——釘釘在后端架構上的過人之處

          >> 更多同類文章 ……

          (本文同步發布于:http://www.52im.net/thread-2863-1-1.html



          作者:Jack Jiang (點擊作者姓名進入Github)
          出處:http://www.52im.net/space-uid-1.html
          交流:歡迎加入即時通訊開發交流群 215891622
          討論:http://www.52im.net/
          Jack Jiang同時是【原創Java Swing外觀工程BeautyEye】【輕量級移動端即時通訊框架MobileIMSDK】的作者,可前往下載交流。
          本博文 歡迎轉載,轉載請注明出處(也可前往 我的52im.net 找到我)。


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          Jack Jiang的 Mail: jb2011@163.com, 聯系QQ: 413980957, 微信: hellojackjiang
          主站蜘蛛池模板: 新乐市| 南川市| 绥滨县| 柳河县| 海门市| 嘉善县| 江源县| 张家港市| 兴隆县| 荆州市| 石景山区| 汨罗市| 札达县| 杂多县| 东乌| 石家庄市| 香河县| 平罗县| 密云县| 漾濞| 肃宁县| 靖远县| 赫章县| 井研县| 西充县| 长宁区| 慈溪市| 陆丰市| 辽阳市| 扶绥县| 肥东县| 贵阳市| 浦江县| 白沙| 龙岩市| 关岭| 湘潭市| 博客| 德安县| 郎溪县| 开封县|