如何自己设计一个扫码登录
掃碼登錄場景
掃碼登錄場景想必我們都不陌生——很多PC端的網(wǎng)站都提供了掃碼登錄的功能,無需在網(wǎng)頁上輸入任何賬號和密碼,只需要通過手機(jī)上的APP,如微信、淘寶、QQ等等,使用掃描功能,掃描網(wǎng)頁上的二維碼,確認(rèn)登錄,就可以完成網(wǎng)頁端登錄。
掃碼登錄QQ郵箱
掃碼登錄分析
我們來分析一下,掃碼登錄,其實(shí)涉及到三種角色,需要解決兩個問題。
三種角色
很明顯,掃碼登錄當(dāng)中涉及到的三種角色:PC端、手機(jī)端、服務(wù)端。
三端
相關(guān)的設(shè)計都要圍繞這三端來展開,具體的設(shè)計其實(shí)就是每一端應(yīng)該完成什么功能?應(yīng)該怎么實(shí)現(xiàn)?端和端應(yīng)該如何交互?
兩個問題
掃碼登錄本質(zhì)上是一種特殊的登錄認(rèn)證方式,我們面對的是兩個問題
- 手機(jī)端如何完成認(rèn)證
- PC端如何完成登錄
如果用普通的賬號密碼方式登錄認(rèn)證,PC端通過賬號密碼完成認(rèn)證,然后服務(wù)端給PC端同步返回token key之類的標(biāo)識,PC端再次請求服務(wù)端,需要攜帶token key,用于標(biāo)識和證明自己登錄的狀態(tài)。
服務(wù)端響應(yīng)的時候,需要對token key進(jìn)行校驗(yàn),通過則正常響應(yīng);校驗(yàn)不通過,認(rèn)證失敗;或者token過期,PC端需要再次登錄認(rèn)證,獲取新的token key。
現(xiàn)在換成了掃碼登錄:
- 認(rèn)證不是通過賬號密碼了,而是由手機(jī)端掃碼來完成
- PC端沒法同步獲取認(rèn)證成功之后的憑據(jù),必須用某種方式來讓PC端獲取認(rèn)證的憑據(jù)。
掃碼登錄實(shí)現(xiàn)
手機(jī)端如何完成認(rèn)證
二維碼怎么生成
二維碼和超市里的條形碼類似,超市的條形碼實(shí)際是一串?dāng)?shù)字,上面存儲了商品的序列號。
二維碼的內(nèi)容就比較自由,里面不止可以存數(shù)字,還可以存任何的字符串。我們可以認(rèn)為,它就是字符的另外一種表現(xiàn)形式。
下面我通過一個網(wǎng)站把文字轉(zhuǎn)成了二維碼:
所以,我們手機(jī)掃碼這個過程,其實(shí)是對二維碼的解碼,獲取二維碼中包含的數(shù)據(jù)。
那么二維碼怎么生成呢?
首先,二維碼是展示在我們的PC端,所以生成這個操作應(yīng)該由PC端去請求服務(wù)端,獲取相應(yīng)的數(shù)據(jù),再由PC端生成這個二維碼。
二維碼包含什么呢?
二維碼在我們這個場景里面是一個重要的媒介,服務(wù)端必須給這個數(shù)據(jù)生成惟一的標(biāo)識作為二維碼ID,同時還應(yīng)該設(shè)置過期的時間。PC端根據(jù)二維碼ID等數(shù)據(jù)生成二維碼。
同時,服務(wù)端也應(yīng)該保存二維碼的一些狀態(tài):未掃描、已成功、已失效。
APP認(rèn)證機(jī)制
我們還得認(rèn)識一下基于APP的移動互聯(lián)網(wǎng)認(rèn)證機(jī)制。
首先,手機(jī)端一般是不會存儲登錄密碼的,我們我們發(fā)現(xiàn),只有裝載APP,第一次登錄的時候,才需要進(jìn)行基于賬號密碼的登錄,之后即使這個清理掉這個應(yīng)用進(jìn)程,甚至手機(jī)重啟,都是不需要再次輸入賬號密碼的,它可以自動登錄。
這背后有一套基于token的認(rèn)證機(jī)制,和PC有些類似,但又有一些不同。
- APP登錄認(rèn)證的時候除了賬號密碼,還有設(shè)備信息
- 賬號密碼校驗(yàn)通過,服務(wù)端會把賬號與設(shè)備進(jìn)行一個綁定,進(jìn)行持久化的保存,包含了賬號ID,設(shè)備ID,設(shè)備類型等等
- APP每次請求除了攜帶token key,還需要攜帶設(shè)備信息。
因?yàn)橐苿佣说脑O(shè)備具備唯一性,可以為每個客戶端生成專屬token,這個token也不用過期,所以這就是我們可以一次登錄,長久使用的原理。
手機(jī)掃碼干了什么
那這下就清楚了,我們手機(jī)掃碼干了兩件事:
- 掃描二維碼:識別PC端展示的二維碼,獲取二維碼ID
- 確認(rèn)登錄:手機(jī)端通過帶認(rèn)證信息(token key、設(shè)備信息)、二維碼信息(二維碼ID)請求服務(wù)端,完成認(rèn)證過程,確認(rèn)PC端的登錄。
確認(rèn)登錄
ps: 關(guān)于手機(jī)掃碼和確認(rèn),不是重點(diǎn),所以這里進(jìn)行了簡化,一種說法是掃碼時同時向服務(wù)端申請一次性臨時token,確認(rèn)登錄的時候攜帶這個臨時token來訪問服務(wù)端。
PC端如何完成登錄
接下來到我們的重頭戲了,手機(jī)端完成了它的工作,我們服務(wù)端的登錄怎么進(jìn)入登錄狀態(tài)呢?
我們前面講了,PC端通過token來標(biāo)識登錄狀態(tài)。那么手機(jī)端掃碼確認(rèn)之后,我們的服務(wù)端就應(yīng)該給PC生成相應(yīng)的token。
那么,這個PC端又如何獲取它所需的token key,來完成登錄呢?
PC端可以通過獲取二維碼的狀態(tài)來進(jìn)行相應(yīng)的響應(yīng):
- 二維碼未掃描:無操作
- 二維碼已失效:提示刷新二維碼
- 二維碼已成功:從服務(wù)端獲取PC token
獲取二維碼狀態(tài),主要有三種方式:
- 輪詢
- 長輪詢
- websocket
輪詢
輪詢方式是指客戶端會每隔一段時間就主動給服務(wù)端發(fā)送一次二維碼狀態(tài)的查詢請求。
長輪詢
長輪詢是指客戶端主動給服務(wù)端發(fā)送二維碼狀態(tài)的查詢請求,服務(wù)端會按情況對請求進(jìn)行阻塞,直至二維碼信息更新或超時。當(dāng)客戶端接收到返回結(jié)果后,若二維碼仍未被掃描,則會繼續(xù)發(fā)送查詢請求,直至狀態(tài)變化(已失效或已成功)。
Websocket
Websocket是指前端在生成二維碼后,會與后端建立連接,一旦后端發(fā)現(xiàn)二維碼狀態(tài)變化,可直接通過建立的連接主動推送信息給前端。
總結(jié)
通過前面的分析,我們已經(jīng)知道了二維碼掃碼登錄的一些關(guān)鍵點(diǎn),現(xiàn)在我們把這些點(diǎn)串起來,來看一看二維碼掃碼登錄的整體的實(shí)現(xiàn)流程。
以常用的輪詢方式獲取二維碼狀態(tài)為例:
總結(jié)
以上是生活随笔為你收集整理的如何自己设计一个扫码登录的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: easyphp mysql 密码_Eas
- 下一篇: 79g道闸雷达_79G雷达安装注意事项