网站扫码登录时怎么一回事?
網站掃碼登錄時怎么一回事?
在了解這個原理之前,一百個為什么?
什么是二維碼?
掃碼登錄的原理是什么?
二維碼里面是什么?
服務端,移動端,網站之間發生了什么?
對于服務器于第三方的網站為什么需要授權,健全?
掃碼登錄為什么需要是在登錄之后才可以使用?
關于二維碼引發的網絡安全是什么?
服務端與網絡之間的通信是怎么進行的?
對于第三方平臺的授權方式有什么?
對于網頁進行長輪詢詢問服務器,怎么在控制臺看出來?
token里面攜帶的是什么?
在了解掃二維碼登錄的前提下,我們先來了解一下什么鑒權?
對于服務器來說它不知道每次發送的請求是誰,而有些資源是部分共享的,那么這時候就需要鑒權這個手段。
在瀏覽器安全方面,我們客戶端和服務端之間才有了鑒權方式,一方面考慮到http無狀態,另一方面考慮到防止被攻擊。
鑒權
Cookie + Session 登錄
session解決的是http協議無狀態的問題。session是由24個隨機的字符串組成的。session是服務端的解決方案,那么對于客戶端與服務端來說,這是兩套隔離系統,那么對于服務端來說通過每次檢查請求頭里面的唯一標識sessionid去讀取它對應的key值。服務端一般會把sessionid放在哪里呢?內存,硬盤等,不同的語言有不同的解決方案。
對于客戶端來說,是sessionid是存儲在cookie字段里面的,對于禁止緩存的客戶端說,我們可以對sessionid進行加密,然后通過url的形式進行傳遞,好比我們通過點擊鏈接跳轉到第三方網站的時候,不需要我們進行登錄兒需要我們鑒權。
Token 登錄
使用jwt(Json Web Token)方案,客戶端與服務端進行了六次交互
客戶端向服務端發起登錄請求,并攜帶用戶名和密碼
服務端檢驗用戶名和密碼,
檢驗成功以后,返回token(json對象,里面包括
- headers 類別和加密算法
- claims 用戶信息,開發者自定義
- signature 根據指定的加密算法和私密的私鑰,在服務端進行加密而得到的簽名的字符串。
給客戶端。如果未成功或者過期了,就告訴服務器需要重新鑒權。
客戶端將token存儲(cookie, localStorage)起來
每次發起請求,請求頭header都帶著token
服務端對于每次發送的token,都會檢查它的時效性,如果過期了,就重新用加密算法加密再次發送給客戶端。
OAuth 第三方登錄
那么我們通過微信,釘釘,淘寶掃碼登錄是屬于哪一種呢?
我們可以看這個網站的開放平臺,可以看到大多數是采用OAuth 第三方登錄。
OAuth
OAuth
在生活中,網站利用微信qq登錄一鍵登錄,網站通過微信qq掃碼一鍵登錄,小程序使用微信一鍵登錄等這都是采用oauth驗證。
對于第三方應用的授權驗證,一般分為三個角色,用戶,第三開發者,授權服務器。接下來我們通過這三個角色對下面三個使用oauth的應用場景進行分析。
在生活中,網站利用微信qq登錄一鍵登錄,網站通過微信qq掃碼一鍵登錄,小程序使用微信一鍵登錄等這都是采用oauth驗證。
對于第三方應用的授權驗證,一般分為三個角色,用戶,第三開發者,授權服務器。接下來我們通過這三個角色對下面三個使用oauth的應用場景進行分析。
客戶端與服務端——Websocket
對于傳統的服務器與客戶端通信,只有客戶端向服務端發送信息,可是服務端缺少主動性,wesocket剛好滿足這個要求,也就是服務端主動推動。
二維碼的登錄原理是什么?
二維碼的本質是什么?
二維碼其實也是字符串。
-
可以是二維碼ID
-
可以是包含二維碼ID的一個url地址
怎么生成二維碼?
當pc端去請求服務器,服務端會生成隨機的id值,這時候網頁根據這個id值生成二維碼,這時候就等待移動端的掃碼了
二維碼的狀態有哪些?
已生成,待確定,已確定
二維碼的狀態是怎么轉變的?這里從兩個方面進行討論轉變。
手機端 - pc端-服務端(未接入第三方應用)
手機去掃描這個二維碼
二維碼切換為 已掃描待確認狀態, 此時就會將賬號信息與這個ID綁定
當手機端確認登錄時,它就會生成PC端用于登錄的token,并返回給PC端
手機端 - pc端-服務端(接入第三方應用)
這幾天相繼看了釘釘開放者平臺,微信開放平臺等對于掃碼登錄第三方網站,都有一些預授碼,授權。臨時憑證等,我在想為什么要授權?看得我一頭霧水,這時候了解了oauth機制才知道。了解完二維碼的原理,pc端,服務端,移動端之間掃碼登錄的具體步驟,知道了二維碼其實也是字符串,當pc端去請求服務器,服務端會生成隨機的id值,這時候網頁根據這個id值生成二維碼,這時候就等待移動端的掃碼了。這時候pc端也就是代理服務器怎么有權利去訪問服務器資源呢?這就是一個臨時憑證的生成,這個臨時的憑證是怎么生成的?那像生活中的app端的支付寶(第三方應用)掃碼登錄支付寶網站呢?我們把第三方應用都比做移動端,因為移動端無法存儲密碼,相反它存儲的是token,換句話說,這是一場基于token的認證機制。而token里面是什么呢?移動端看到網站的二維碼,掃碼得到的是二維碼的ID值,移動端手機的設備信息發給服務器。這時候二維碼的狀態變成待確定,這時候移動端把賬號信息就和id進行綁定。當手機確定以后,它就會生成pc用于登錄的token,并返回給服務端。在移動端與服務器的互動的過程中,pc端會一直輪詢服務器的二維碼狀態。接下來要討論pc端怎么拿到服務端的token了,因為在pc端和網站之間還有一層授權層,這個授權層是基于OAuth協議,不同的第三方應用有不一樣的處理方式,比如微信,釘釘,京東。這個授權可以理解為用戶(移動端)給網站權利可以訪問使用資源庫(服務端),也就是這時候客戶端要利用服務端的api請問臨時授權碼,那么請求體要帶什么呢?一般是用戶的賬號密碼等。如果驗證通過,就會返回臨時票據code。再通過code 加上 appid 和 appsecret來換取 access_token。這時候就拿到令牌了。
微信客戶端,網站,服務器,微信開放平臺這幾個角色之間有什么關系呢?看字看多了還是圖文來的比較直觀是吧!
網站掃碼登錄
這里需要思考的是我們最終的目標是拿到服務端的授權碼,那我們首先是想拿到用戶授權碼,那么怎么主動拿到用戶授權碼呢?其實就是生成個二維碼,從我們點擊圖標或者選擇登錄方式的時候,我們的客戶端的后臺就向授權服務端請請求一個二維碼id,然后用qrcode庫繪制,那么怎么傳到客戶端(網站)展示出來呢?以前接觸的都是客戶端發送給服務端,那我們服務端怎么主動發給客戶端呢?這就涉及我們前面設計的webbsocket通信啦!二維碼一掃,客戶端用戶授權拿到手(一般監聽二維碼事件),客戶端利用js攜帶code(用戶授權)發送請求給自己的后臺,后臺拿到code,這時候再像授權服務器(微信開放平臺等),這時候授權服務器返回服務器授權碼,這是一場基于token的認證機制。
小程序掃碼登錄
對于剛剛的二維碼原理,一共有是泛指三個角色,移動端,服務端,客戶端。
那么對于小程序掃碼登錄網站,這三個三個角色指的是什么?我們首先要明白我們掃碼登錄這是一個token鑒權的過程,那么通過鑒權,我們要共享什么呢?
當然是用戶的信息
從這里開始,用戶的信息,我們用微信登錄第三方網站是為了獲取用戶信息登錄第三方網站,那么用戶信息放在哪里呢?微信服務器有服務提供商也就是微信開放平臺,這里好比就是三者中的服務端,網站分前后臺(開發者服務器),那么客戶端泛指這兩者,移動端就很好認啦,也就是微信客戶端。(小程序)
實踐
小程序掃碼登錄網站
pc端(小程序)采用websocket和后臺(express)進行通信,微信作為手機客戶端,微信開放平臺作為授權服務器。
- 微信開放平臺申請小程序
- 微信掃碼獲得那一串就是用戶授權碼
- 數據庫存的是openid
- 網站生成的是小程序碼
- 小程序記錄通信狀態

網頁授權
websocket 實現微信掃碼登錄(需關注公眾號) #8
二維碼登錄原理
點擊微信登錄
極客時間-二維碼原理
一張圖搞定OAuth2.0
應用開發
web項目對接釘釘掃碼登錄
掃碼登錄第三方網站
總結
以上是生活随笔為你收集整理的网站扫码登录时怎么一回事?的全部內容,希望文章能夠幫你解決所遇到的問題。