前言:最近想在我的個人網站上面加上一個掃二維碼登錄后台的一個功能,之前寫過websocket在線聊天,知道掃碼成功之后,需要用到websocket來實現pc同步登錄,百度了一下掃碼登錄思路,很無賴,都只是隨便的談了一下大概的思路,看完之后還是一臉萌逼,最后還是決定自己去研究一下QQ的掃碼登錄如何實現的,分享一下我是如何實現掃碼登錄。。
思路這東西還真得靠自己熬呀!
我是研究的qq郵箱掃碼登錄,所以后面的都以qq郵箱為例,先看一下這張圖:
結合之前百度的掃碼登錄思路,這個appid應該就是客戶端的id,然后每次刷新的時候這個t都在變化,不知道他是當前的時間戳,還是每次刷新會生成一個隨機數(后面叫他時間戳)。只看懂了這兩個參數,其他的沒看懂,先不管,先記錄下這兩個參數。通過這張圖咱們可以知道咱們第一步需要做什么:
1. 首先需要生成一個二維碼,並且二維碼需要有一個客戶端id。(讓客戶端id每次刷新的時候隨機生成)
每次進入該頁面,由后台生成一個帶有隨機客戶端id的二維碼。到了這兒,pc端就先告一段落。
2.手機端實現登錄功能,登錄成功之后,由后台生成並返回登錄憑證(后面叫token)
token:登錄成功之后的憑證,這個登錄憑證最好使用數據庫來存,之前我自己使用session,忽略了一個問題,session的本質是cookie,所以不能跨平台,在移動端保存的session,在pc端獲取不到。
3.實現掃一掃的功能(一定要移動端拿到后台生成的token之后才能使用掃一掃的功能)
4.掃pc端的二維碼並且獲取到客戶端id(client_id)
當我們拿到這個client_id之后,這個掃碼登錄就算完成了一大半了,現在要做的,就是想辦法將手機端的token,拿給pc端,pc登錄成功,然后將這個token保存下來,每次操作需要登錄驗證的時候,將token發給后台進行驗證就ok了。
5.pc端和移動端實時通信(websocket)
我在移動端是使用的html原生的websocket,沒有使用插件,后台是使用的ws模塊。
6.將移動端的token推送給對應的客戶端(client_id排上用場)
后台推送消息的時候,同過client_id可以判斷出,把這個token應該推送給哪一個客戶端(client_id)
在之前,我是沒有發現client_id有什么作用,pc端和移動端實時通信之后,直接將這個token推送給所有人。pc端收到,和后台token做一個驗證(看token是否有問題),直接就提示登錄成功。結果pc同時開幾個登錄網頁出來的時候,手機一掃,所有打開的網頁全部都登錄了,還是登錄的同一個賬號,很尷尬!!!!!
完成這6步,簡單的二維碼登錄就算完成了。