<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Jack Jiang

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

    本文原文由作者Amazing10原創發布于公眾號業余碼農,收錄時有改動,感謝原作者的技術分享。

    1、引言

    某天中午,吃完午飯,攤在自己的躺椅上,想趁吃飽喝足的午后時間靜靜享受獨自的靜謐。

     
     

    干點什么好呢?于是單手操作鼠標打開了一個陌生而隱秘的網站。正開著某個視頻起勁。。。

    突然瀏覽器彈出了一個提示:

    請使用微信掃碼登錄賬號,繼續觀看

    這...

     
     

    但是由于強烈的好奇驅使,迫于無奈,只好選擇登錄再繼續觀看。于是熟練的掏出手機,打開微信掃一掃對準上面的二維碼,只聽見 “叮” 的一聲,網頁上的二維碼放佛活過來了,直接刷新出了本尊的微信頭像,同時手機上也彈出登錄的提醒。

     
     

    心中略微驚嘆,但沒來得及多想。忙點擊手機界面中登錄按鈕。此時網頁刷新,恢復了正常,表示可以繼續觀看。

    上網沖浪的時間總是過得很快,很快就有些疲倦。于是閉上眼睛,腦海中卻浮現出了剛剛微信掃描二維碼,然后登錄網頁的場景,心中再次驚嘆,并開始思考起其中的原理來。。。

    言歸正傳,本文將以輕松活潑的語言形式,為你分析和講解微信手機掃碼登錄的技術原理,希望在你的IM中開發此功能時有所啟發。

    推薦閱讀:另一篇同類文章《IM的掃碼登錄功能如何實現?一文搞懂主流的掃碼登錄技術原理》也值得一讀。

    學習交流:

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

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

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

    2、IM開發干貨系列文章

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

    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開發基礎知識補課(七):主流移動端賬號登錄方式的原理及設計思路

    IM開發基礎知識補課(八):史上最通俗,徹底搞懂字符亂碼問題的本質

    IM的掃碼登功能如何實現?一文搞懂主流應用的掃碼登錄技術原理

    IM要做手機掃碼登陸?先看看微信的掃碼登錄功能技術原理》(本文)

    3、原理解析

    微信掃碼登錄現在在日常生活中已經是常見不能再常見的場景之一了,但是要知道微信首次公開這項功能時,卻是驚艷眾人。移動端與PC端以這樣一種巧妙的方式鏈接在了一起,的確是讓人驚嘆。

    以下是一個典型的微信掃碼登錄全過程: 

    本來想在Web版微信上截圖,但掃碼登陸后出現了下面的提示(貌似很多人都碰到過): 

    好吧,這很微信,反正就是不想讓你好好用,用戶愛咋咋滴。。。

    如上圖所示,操作過程如下:

    1)第一步:電腦上打開PC端(出現2維碼);

    2)第二步:拿出手機,掃碼2維碼;

    3)第三步:PC端顯示掃碼成功;

    4)第四步:手機端“確認”登錄;

    5)第五步:成功登陸PC端。

    上述實際操作過程,用戶體驗相當順滑,也難怪剛出來那會,能驚艷到很多人。

    那么,對于上述操作過程的技術實現原理是什么樣的呢?

    想起來之前聽過的前后端的概念,知道賬戶的數據信息一般都是放在服務器上,前端負責向后端 “討要數據” 并顯示,后端則是對前端的 “討要” 做出反應。

    這樣一來,猜測微信登錄的過程可能就是:

    1)網頁前端向微信后臺請求賬號數據;

    2)微信后臺接受網頁前端的請求,然后將他的賬號數據返回;

    3)網頁前端接收到了數據后,在瀏覽器里進行顯示。

    于是,手腳麻利的畫了個示意圖:

    當我正準備沾沾自喜的時候,突然看到桌面上的手機。咦,如果就只是這么個過程,那手機的作用是啥。于是才開始意識到,問題沒這么簡單。

    好吧,我們城要再深入一點探秘微信掃碼登錄的過程。

    4、過程分析

    為了更深入的分析整個過程,我們可以去看看微信網頁版,地址是:https://wx.qq.com/

     

    筆者看著網頁中碩大的二維碼陷入了沉思——這個二維碼跟手機賬號有沒有什么對應關系呢?如果沒有,那它又是怎么生成的呢?

    思考間,于是打開了瀏覽器的開發者工具。

    在網絡監控一覽找到了這幅二維碼,與之對應的鏈接是:

    https://login.weixin.qq.com/qrcode/gaO8cOQweA==

    如下圖所示:

    然后習慣性地,嘗試多次刷新頁面,發現二維碼不斷發生變化,鏈接也不斷更改:

    https://login.weixin.qq.com/qrcode/AencxgKNFQ==

    https://login.weixin.qq.com/qrcode/YcD7f_DxvA==

    https://login.weixin.qq.com/qrcode/QblN8lCn2g==

    似乎發現了些東西:二維碼不斷變化,其對應的鏈接尾的代碼也相應變化,并且是隨機性的變化。

    這也就是說,每一次頁面刷新都會隨機且唯一地生成一個二維碼。這或許可以與手機登錄的過程聯系起來。

    似乎開始明白了,于是再次拿起手機,熟練的使用微信掃描了此時的二維碼。

    “叮” 的一聲,網頁上的二維碼頓時變成了我帥氣的微信頭像。這個時候,我才突然意識到,是掃碼之后網頁才與他的微信賬號建立起了聯系。

    如下圖所示: 

    也就是說:

    1)沒有掃碼之前,頁面上的二維碼只是隨機生成的且與用戶無關的碼;

    2)而當用戶掃碼之后,二維碼便與用戶帳號綁定在了一起。

    原來手機掃碼的用處是這樣!

    此時注意到,手機微信上彈出了『微信登錄確認』的提醒。這個時候謹慎地點擊了下方的登錄按鈕。

    如下圖所示: 

    隨著平滑的動畫一閃而過,網頁上已經顯示出了我的微信賬號信息,顯示微信賬號已經登錄。再一次體驗這個過程,心中開始思索手機微信在登錄過程中所起到的具體作用。

    首先需要明白幾個過程:

    1)進入網頁登陸界面,隨機生成一個二維碼;

    2)通過手機掃描二維碼,將微信賬號與二維碼綁定;

    3)在手機微信點擊登錄按鈕,授權網頁登錄微信賬號;

    4)網頁獲得的賬號信息,將數據顯示。

    5、原理解釋

    回顧上述過程,結合最開始的原理猜測,開始思索整個環節,是哪里理解的不對。。。

    1)網頁的二維碼到底從何而來?

    2)是誰向微信后臺請求了賬號數據?

    實際上:不同的網站可能都需要通過微信后臺進行數據的獲取,那么每一個網站必然也存在它的后臺來給微信后臺發送請求。

    這樣一來,整個過程就能解釋得通了:

    1)網站頁面刷新,網頁后臺向微信后臺請求授權登錄;

    2)微信后臺返回登錄所需二維碼;

    3)用戶通過手機掃描二維碼,并在手機上授權登錄后,微信后臺告知網頁后臺已授權;

    4)網頁后臺向微信后臺請求微信賬號數據;

    5)微信后臺返回賬號數據;

    6)網頁后臺接收數據并通過瀏覽器顯示;

    6、技術剖析

    正如上節所述,想清楚了整個過程后,我們應該對整個過程的技術實現進行進一步的探究。

    在微信開發官方文檔中,我找到了第三方網站應用微信登錄開發指南:

    https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html

    我將整個過程梳理了一遍,畫出了這個圖: 

    如上圖所示,整個技術實現如下。

    (1)二維碼的獲得:

    • 1)用戶打開網站后,網站后臺根據微信OAuth2.0協議向微信開發平臺請求授權登錄,并傳遞事先在微信開發平臺中審核通過的AppID和AppSecrect等參數;
    • 2)微信開發平臺對AppID等參數進行驗證,并向網站后臺返回二維碼;
    • 3)網站后臺將二維碼傳送至網站前端進行顯示。

    (2)微信客戶端授權登錄:

    • 1)用戶使用微信客戶端掃描二維碼并授權登錄;
    • 2)微信客戶端將二維碼特定的uid與微信賬號綁定,傳送至微信開發平臺;
    • 3)微信開發平臺驗證綁定數據,調用網站后臺的回調接口,發送授權臨時票據code;

    (3)網站后臺請求數據:

    • 1)網站后臺接收到code,表明微信開發平臺同意數據請求;
    • 2)網站后臺根據code參數,再加上AppID和AppSecret請求微信開發平臺換取access_token;
    • 3)微信開發平臺驗證參數,并返回access_token;
    • 4)網站后臺收到access_token后即可進行參數分析獲得用戶賬號數據。

    在上述過程中,有幾個參數值得解釋一下(來源官方文檔):

    • 1)AppID:應用唯一標識,在微信開放平臺提交應用審核通過后獲得;
    • 2)AppSecret:應用密鑰,在微信開放平臺提交應用審核通過后獲得;
    • 3)code:授權臨時票據,第三方通過code進行獲取access_token的時候需要用到,code的超時時間為10分鐘,一個code只能成功換取一次access_token即失效。code的臨時性和一次性保障了微信授權登錄的安全性。

    整個過程從網站后臺向微信開發平臺請求授權登錄開始,最終目的是為了獲得access_token:

    access_token:用戶授權第三方應用發起接口調用的憑證

    在獲得了access_token后就可以解析用戶的一些基本信息,包括頭像、用戶名、性別、城市等。這樣一來,整個微信掃描登錄的過程就完成了。

    7、寫在最后

    研究到這,終于大體上對微信掃碼登錄的整個過程有了清晰的認知。看起來似乎也不難,開發者只需要在網頁后端做好對微信公眾平臺的接口調用即可實現掃碼登錄。

    伸了伸懶腰,忽然又想到在整個過程中還需要考慮超時的問題。比如二維碼超時未掃描、二維碼掃描后超時授權、獲得access_token后超時等等問題。

    我發現一個簡單的功能實現起來還是需要考慮許多細節,真的是紙上得來終覺淺呀。于是我下定決心,下次得少上網沖浪了,花點時間搭個服務器先把微信掃碼登錄過程實現看看。

    不過,還得先去在微信開放平臺注冊開發者帳號,并擁有一個已審核通過的網站應用,并獲得相應的AppID和AppSecret才行。

    想了想,還是讓我先趟一會兒吧。。。

     

    附錄:更多IM開發相關文章

    [1] IM開發熱門文章:

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

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

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

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

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

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

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

    移動端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] 有關WEB端即時通訊開發:

    新手入門貼:史上最全Web端即時通訊技術原理詳解

    Web端即時通訊技術盤點:短輪詢、Comet、Websocket、SSE

    SSE技術詳解:一種全新的HTML5服務器推送事件技術

    Comet技術詳解:基于HTTP長連接的Web端實時通信技術

    新手快速入門:WebSocket簡明教程

    WebSocket詳解(一):初步認識WebSocket技術

    WebSocket詳解(二):技術原理、代碼演示和應用案例

    WebSocket詳解(三):深入WebSocket通信協議細節

    WebSocket詳解(四):刨根問底HTTP與WebSocket的關系(上篇)

    WebSocket詳解(五):刨根問底HTTP與WebSocket的關系(下篇)

    WebSocket詳解(六):刨根問底WebSocket與Socket的關系

    socket.io實現消息推送的一點實踐及思路

    LinkedIn的Web端即時通訊實踐:實現單機幾十萬條長連接

    Web端即時通訊技術的發展與WebSocket、Socket.io的技術實踐

    Web端即時通訊安全:跨站點WebSocket劫持漏洞詳解(含示例代碼)

    開源框架Pomelo實踐:搭建Web端高性能分布式IM聊天服務器

    使用WebSocket和SSE技術實現Web端消息推送

    詳解Web端通信方式的演進:從Ajax、JSONP 到 SSE、Websocket

    MobileIMSDK-Web的網絡層框架為何使用的是Socket.io而不是Netty?

    理論聯系實際:從零理解WebSocket的通信原理、協議格式、安全性

    微信小程序中如何使用WebSocket實現長連接(含完整源碼)

    八問WebSocket協議:為你快速解答WebSocket熱門疑問

    快速了解Electron:新一代基于Web的跨平臺桌面技術

    一文讀懂前端技術演進:盤點Web前端20年的技術變遷史

    Web端即時通訊基礎知識補課:一文搞懂跨域的所有問題!

    >> 更多同類文章 ……

    (本文同步發布于:http://www.52im.net/thread-2941-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
    主站蜘蛛池模板: 国内免费高清在线观看| 亚洲不卡影院午夜在线观看| 亚洲av纯肉无码精品动漫| 亚洲一区在线免费观看| 精品亚洲成a人片在线观看少妇| 成人免费777777被爆出| 亚洲色大成网站WWW久久九九| 久久久久女教师免费一区| 亚洲啪啪综合AV一区| 暖暖免费日本在线中文| 亚洲黄色免费电影| 国产免费AV片在线播放唯爱网| 亚洲第一页在线播放| www.黄色免费网站| 亚洲成av人无码亚洲成av人| xvideos亚洲永久网址| 伊人免费在线观看| 97久久精品亚洲中文字幕无码| 99久久国产热无码精品免费| 亚洲熟女精品中文字幕| 亚洲?V乱码久久精品蜜桃 | 亚洲精品你懂的在线观看| 叮咚影视在线观看免费完整版| 亚洲国产一区二区三区青草影视 | 成人a免费α片在线视频网站| 亚洲国产精品无码久久| 精品国产香蕉伊思人在线在线亚洲一区二区| 国产成人无码免费看片软件| 久久久久亚洲精品天堂| 国产高清免费在线| 色播在线永久免费视频网站| 亚洲免费视频网址| 亚洲精品国精品久久99热| 69精品免费视频| 久久亚洲精品无码av| 亚洲国产精品VA在线观看麻豆| 男人的好看免费观看在线视频 | 国产精品成人免费一区二区| gogo免费在线观看| 亚洲AV色吊丝无码| 亚洲中文字幕久久精品无码APP|