主頁 > 軟體設計 > 一圖搞懂掃碼登錄的技術原理

一圖搞懂掃碼登錄的技術原理

2022-01-25 06:46:29 軟體設計

現在掃碼登錄是一種很常見的登錄方式,當用戶需要登錄某個網站時,網站會提供一種掃碼登錄的方式,用戶打開相應的手機App,掃描網站上顯示的二維碼,然后在App中確認登錄,網站監測到用戶確認登錄后,跳轉到登錄成功頁面,從這個形式上看,掃碼登錄就是將用戶在手機App中的登錄狀態同步到網站中,這篇文章就來一窺這個同步是如何發生的,

同一產品中的掃碼登錄

假設有一款產品,這個產品通過手機端App和PC端應用為用戶提供服務,為了方便用戶在PC端上登錄,產品提供了一個掃碼登錄的功能,即PC端應用上展示一個登錄二維碼,用戶使用手機端App掃碼并確認登錄,然后用戶就可以在PC端上登錄成功,在這個例子中,手機端App和PC端應用同屬于一個產品,這是一種常見的產品形態,微信、微博、知乎等等都是這種產品形態的代表,

為了方便介紹,這里再假設PC端應用是一個Web站點,下面就來看一下這種登錄方式的運作原理:

同一產品掃碼登錄

如上圖所示,整個程序比較簡單,這里大概分為如下幾個步驟:

1、用戶發起二維碼登錄:此時網站會先生成一個二維碼,同時把這個二維碼對應的標識保存起來,以便跟蹤二維碼的掃碼狀態,然后將二維碼頁面回傳到瀏覽器中;瀏覽器先展示這個二維碼,再按照Javascript腳本的指示發起掃碼狀態的輪詢,所謂輪詢就是瀏覽器每隔幾秒呼叫網站的API查詢二維碼的掃碼登錄結果,查詢時攜帶二維碼的標識,有的文章說這里可以使用WebSocket,雖然WebSocket回應比較及時,但是從兼容性和復雜度考慮,大部分方案還是會選擇輪詢或者長輪詢,畢竟此時通信稍微延遲下也沒多大關系,

2、用戶掃碼確認登錄:用戶打開手機App,使用App自帶的掃碼功能,掃描瀏覽器中展現的二維碼,然后App提取出二維碼中的登錄資訊,顯示登錄確認的頁面,這個頁面可以是App的Native頁面,也可以是遠程H5頁面,這里采用Native頁面,用戶點擊確認或者同意按鈕后,App將二維碼資訊和當前用戶的Token一起提交到網站API,網站API確認用戶Token有效后,更新在步驟1中創建的二維碼標識的狀態為“確認登錄”,同時系結當前用戶,

3、網站驗證登錄成功:在步驟1中,二維碼登錄頁面啟動了一個掃碼狀態的輪詢,如果用戶已經“確認登錄”,則輪詢訪問網站API時,網站會生成二維碼系結用戶的登錄Session,然后向前端回傳登錄成功訊息,這里登錄狀態維護是采用的Session機制,也可以換成其它的機制,比如JWT,

為了保證登錄的安全,有必要采取一些安全措施,可能包括以下若干方法:

  • 對二維碼承載的資訊按照某種規則進行處理,App可以在掃碼時進行驗證,避免任何掃碼都去請求登錄;

  • 對二維碼設定一個過期時間,過期就自動洗掉,這樣使其占用的資源保持在合理范圍之內;

  • 限制二維碼只能使用一次,防止重放攻擊;

  • 二維碼使用足夠長的隨機性字串,防止被惡意窮舉占用;

  • 使用HTTPS傳輸,保護登錄資料不被竊聽和篡改,

第三方應用的掃碼登錄

現在很多網站除了提供自身賬號的登錄方式以外,還提供了微信掃碼登錄、微博掃碼登錄等方式,本來這對用戶來說是十分方便的,不過很多站點為了獲取用戶手機號,首次登錄時還需要用手機驗證碼再登錄一次,用戶會有點被欺騙的感覺,不過這個問題不是本文要探討的,

這里以微信掃碼登錄某網站為例,某網站就是第三方應用,所謂第三方是相對微信自身來說的,相比同一產品中的掃碼登錄,網站使用微信掃碼登錄會更復雜一些,因為這涉及到不同應用之間的登錄安全,下面就給出這一登錄方式的詳細運作原理,時序圖比較長,不過只要耐心點就能完全搞清楚,甚至自己實作一個類似的第三方掃碼登錄方案,

二維碼登錄-第三方應用登錄

這里對一些關鍵點特別說明下:

1、步驟3 生成微信登錄請求記錄:當用戶掃碼并同意登錄之后,步驟25中瀏覽器會重定向到第三方應用,如果之前沒有創建一條登錄請求記錄,網站并不能確定這次登錄就是自己發起的,這可能導致跨站請求偽造攻擊,比如使用某個應用的微信登錄二維碼,騙取用戶的授權,然后最侄訓呼跳轉到其它站點,被回呼站點只能被動接受,雖然下一步驗證授權Code通不過,微信也可能會認為第三方應用出了某種問題,搞不好被封掉,因此第三方應用創建一條登錄請求記錄之后,還要把記錄的標識拼接到訪問微信登錄二維碼的url中,微信會在用戶同意登錄后原樣回傳這個標識,步驟26中第三方應用可以驗證這個標識是不是有效的,

2、步驟17 顯示應用名稱和請求授權資訊:因為微信支持很多的第三方應用,需要明確告知用戶正在登錄哪個應用,應用可以訪問自己的什么資訊,這都是用戶做出登錄決定的必要資訊,因此掃碼之后,微信手機端就需要去微信開放平臺查詢下二維碼對應的第三方應用資訊,

3、步驟24 登錄臨時授權Code:微信開放平臺沒有直接向瀏覽器回傳登錄用戶的資訊,這是因為第三方應用還需要對用戶進行授權并保持會話的狀態,這適合在應用的服務端來處理;而且直接回傳用戶資訊到瀏覽器也是不安全的,并不能保證二維碼登錄請求就是通過指定的第三方應用發起的,第三方應用會在步驟27中攜帶這個授權Code,加上應用的AppId和AppSecret,再去向微信開放平臺發起登錄請求,臨時授權Code只能使用1次,存下來也不能再用,且只能用在指定的應用(即系結了AppId),AppSecret是應用從服務端提取的,用來驗證應用的身份,這些措施保證了微信授權登錄的安全性,不過驗證通過后還是沒有直接回傳用戶資訊,而是回傳了一個access token,應用可以使用這個token再去請求獲取用戶資訊的介面,這是因為開放平臺提供了很多介面,訪問這些介面都需要有授權才行,所以發放了一個access token給第三方應用,這種授權登錄方式叫做OAuth 2.0,基于安全方面的考慮,access token的有效期比較短,開放平臺一般還會發放一個refresh token,access token過期之后,第三方應用可以拿著這個refresh token再去換一個新的access token,如果refresh token也過期了或者用戶取消了授權,則不能獲取到新的access token,第三方應用此時應該注銷用戶的登錄,這些token都不能泄漏,所以需要保存在第三方應用的服務端,

這里有一個有意思的問題:為什么微信的二維碼登錄頁面Url中沒有第三方應用的簽名?

以極客時間的這個微信登錄二維碼頁面的Url為例:

https://open.weixin.qq.com/connect/qrconnect?appid=wx1b4c7610fc671845&redirect_uri=https%3A%2F%2Faccount.geekbang.org%2Faccount%2Foauth%2Fcallback%3Ftype%3Dwechat%26ident%3Dc75c4a%26login%3D0%26cip%3D0%26redirect%3Dhttps%253A%252F%252Faccount.geekbang.org%252Fthirdlogin%253Fremember%253D1%2526type%253Dwechat%2526is_bind%253D0%2526platform%253Dtime%2526redirect%253Dhttps%25253A%25252F%25252Ftime.geekbang.org%25252F%2526failedurl%253Dhttps%253A%252F%252Faccount.geekbang.org%252Fsignin%253Fredirect%253Dhttps%25253A%25252F%25252Ftime.geekbang.org%25252F&response_type=code&scope=snsapi_login&state=5682d8310b75cd477baf30489e673646#wechat_redirect

其中appid是微信開放平臺分配給極客時間的應用Id;redirect_uri是用戶授權登錄后微信回呼的極客時間url,雖然看起來很長,其實就是在極客時間內的頁面之間跳來跳去;state是極客時間生成的一個登錄id,不同的state會生成不同的二維碼,微信回呼極客時間的時候會帶著這個state,

這個url中只有極客時間的appid,沒有極客時間的簽名,也就是說微信會生成極客時間的登錄二維碼,但是不驗證這個二維碼登錄請求是不是極客時間發起的,那么任何人都可以生成極客時間的微信登錄二維碼頁面,這好像不太嚴謹,

這樣安全嗎?攻擊者可以很簡單的獲取某個應用的微信登錄二維碼,然后再騙取用戶的登錄授權(這個也相對簡單,弄個假冒的網站,或者直接話術忽悠,用戶很可能不仔細看掃碼確認的內容),再通過瀏覽器攔截或者DNS攻擊獲取到臨時授權Code,直接越過檢查應用State,前邊這些都相對容易,但是向微信驗證臨時授權Code的時候必須攜帶App Secret,這個就很難了,除非第三方應用開發者自己泄漏了這一核心機密,對于用戶資訊的保護,整體上來說是安全的,攻擊者基本上拿不到訪問用戶資訊的access token,如果在url中加上這個簽名,對用戶資訊的保護作用也沒有加強,授權Code還是很容易獲取;而且簽名一般也是依賴App Secret,如果泄漏了App Secret,簽名也就失去了意義,

如果有人不斷地生成某個應用的微信登錄二維碼怎么辦?這是其他型別的攻擊了,微信可以采取一些限流措施,甚至直接封掉某些IP,這對正常用戶沒什么影響,

微信二維碼登錄的變種

微信除了跳轉到二維碼登錄頁面的方式,還提供了第三方網站中內嵌二維碼的方式,通過微信JS SDK生成二維碼并在網頁的指定區域展現,用戶掃碼同意登錄后,微信JS SDK發起重定向或者在iframe中打開應用回呼頁面,傳遞臨時授權Code和應用State,后續的流程就都一樣了,

另外這里的第三方應用如果是移動端App,微信開放平臺也支持掃碼登錄的方式,區別在于需要集成微信SDK,獲取二維碼和接收用戶授權Code都是通過SDK回呼的方式,后續的流程也都一樣,


以上就是本文的主要內容了,鑒于本人才疏學淺,如有錯漏歡迎指正,

識訓更多架構知識,請關注公眾號 螢火架構,原創內容,轉載請注明出處,

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/420431.html

標籤:其他

上一篇:會計學包含的兩種程式設計思想

下一篇:微服務架構 | *2.5 Nacos 長輪詢定時機制的原始碼分析

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more