聊聊二維碼登陸

本文主要來研究一下二維碼登陸的相關場景和原理。php

場景

主要的場景有以下幾個:html

  • app掃二維碼登陸pc版系統 好比微信web版,在手機端微信登陸的前提下,掃二維碼確認,自動登陸網頁版。這裏的app能夠分爲兩大類,一個是自有的app,一個是第三方的app。

本身的app自有認證體系,在登陸前提下完成pc端的掃描登陸。 第三方app掃描登陸場景,好比使用手機端的微信APP掃描登陸PC端系統,這種狀況下,通常是利用微信的oauth體系,服務端完成自有帳戶體系與微信帳號的綁定,而後實現PC端的自動登陸git

  • app掃二維碼做爲雙因素驗證 好比微信公衆號平臺,在帳戶密碼登陸PC端的狀況下,再使用手機端微信登陸的前提下,掃描二維碼再次確認,登陸網頁版github

  • Secure QR Login (SQRL) 徹底使用二維碼登陸,替代用戶密碼。這個有SQRL協議及相關實現。web

步驟

如下全部的都基於這個前提,就是手機app已經登陸,自帶有登陸的憑證,而後要掃描登陸pc端的系統redis

  • 打開pc端顯示登陸二維碼(pc端未登陸的前提下)

這個時候請求服務端生成一個登錄二維碼 服務端生成二維碼,該二維碼包含了這個pc端的惟一標識,好比sessionId,或者是新生成一個uuid跟這個sessionId關聯數據庫

  • pc端同時開啓輪詢(有長鏈接等其餘實現,這裏以輪詢方式介紹)

獲取二維碼以後,pc端開啓定時輪詢,輪詢二維碼的狀態,主要有以下狀態:NEW,SCANED,CONFIRMED,REFUSED,EXPIRED安全

  • 手機端掃描二維碼

手機端已經登陸的狀況下,掃描網頁二維碼,二維碼狀態變爲已掃描,而後手機端跳轉到確認頁面微信

  • 手機端確認

手機端掃描二維碼以後,點擊確認,二維碼狀態變爲確認session

  • pc端跳轉成功/二維碼過時/拒絕

二維碼狀態變爲確認以後,跳轉自動登陸,完成PC端登陸態創建 若是app端拒絕此次請求,則二維碼狀態變爲被拒絕,再也不輪詢 若是二維碼狀態在必定時間沒有變化,則顯示二維碼過時,再也不輪詢

PC客戶端

  • 請求登陸二維碼
  • 輪詢二維碼狀態
  • 跳到到登錄後的頁面

手機客戶端

  • 掃描登陸二維碼
  • 確認登陸

服務端

  • 生成登陸二維碼,綁定二維碼與pc客戶端
  • 處理二維碼輪詢
  • 處理手機端掃描二維碼
  • 處理手機端確認二維碼登陸
  • 處理pc端自動登陸

實現

PC端如何自動登陸

這個問題至關於同一個賬號多設備同時登陸的問題

在二維碼被具備登陸態的app端掃描確認以後,PC端如何完成自動登陸。有以下幾個方案:

  • session拷貝

其實就是在原來基於帳號密碼的登陸鑑權邏輯基礎上,新增支持無需帳號密碼的登陸。也就至關於繞過了基於用戶名密碼,內部從新設置了一個登陸態 若是是基於session的鑑權,至關於基於原有的一個已經鑑權的session,拷貝信息到另一個新的session中,在server端關聯

  • 複用已有token

若是是基於token的鑑權,一種方案就是複用token,讓pc端也複用手機app端的token,這樣的好處是原來基於token的鑑權邏輯都不用改

  • 仿照oauth受權頒發新token

整個過程其實有點像oauth,pc端是client,server端是資源和認證中心,手機端是具備登陸態的用戶。手機端掃描二維碼,而後用戶確認受權,server端給pc端頒發token,而後pc端就能夠訪問server端的資源了。這種就在原來的認證基礎上支持另一類oauth的token校驗,貌似有點複雜 另一個變形是新頒發token,但跟app端的token有個關聯映射,最終鑑權的時候還去找原來受權的token去鑑權,這樣的好處是原來的token失效,通過它受權的token也失效

二維碼過時

一種是基於redis來作過時,一種是使用數據庫,可是設置expired time來判斷

安全問題

QRLJacking全稱Quick Response Code Login Jacking,是session劫持的一種。

原理

具體是怎麼劫持的呢,假設攻擊者將web登陸二維碼假裝爲公衆號二維碼,讓用戶去掃描,用戶一不當心點擊確認,攻擊者的就能夠登陸用戶的web系統,或者利用那個token/session去盜取用戶的相關信息或作相關操做。

防範

  • 二維碼超時機制 二維碼增長超時機制以後,會增長攻擊者攻擊的難度,不過攻擊者也可能利用腳本去自動刷新二維碼

  • 確認機制 二維碼掃描必定要有這個確認的頁面,明確告知用戶要作的操做,假設沒有確認這個環節,那麼是極其容易上當的。另外,二維碼掃描確認以後,再往用戶app或手機等發送登陸提醒的通知,告知若是不是本人登陸的,則建議用戶當即修改密碼

  • Sound-based Authentication 確認階段改成雙邊語音確認,而不是簡單的用戶點擊確認按鈕。語音是根據用戶id、二維碼id等加密生成,在app端播放,而後pc端語音識別以後才能完成整個登陸過程。這個能夠有效防止遠程攻擊。一樣的思路,改語音爲one time password也行,增長了確認過程的複雜度,也就增長了攻擊的難度。

小結

二維碼掃描登陸是個挺潮流的功能,這要求既有系統增長改造,也要求針對這種形式的登陸帶來潛在的攻擊進行安全防範。

doc

相關文章
相關標籤/搜索