Python 實現掃碼二維碼登錄

最近在做一個掃碼登錄功能,爲此我還在網上搜了一下關於微信的掃描登錄的實現方式。當這個功能完成了後,我決定將整個實現思路整理出來,方便自己以後查看也方便其他有類似需求的程序猿些。
要實現掃碼登錄我們需要解決兩個問題:
1.  在沒有輸入用戶名及密碼的情況下,如何解決權限安全問題?換句話講,如何讓服務器知道掃碼二維碼的客戶端是一個合法的用戶?
2.  服務器根據用戶在客戶端的選擇如何實時在網頁上作出相應的響應?

首先我們先理一下微信的實現思路,來方便我們理解解決這一難題的思路方向。微信登錄的二維碼實際上是將一個URL轉換成二維碼的形式,而通過微信客戶端掃碼後,無非就是打開了這個url, 我捕捉到的微信二維碼的urlhttps://login.weixin.qq.com/l/YdmTu30I5A== ,這個url裏的YdmTu30I5A==代表的是本次會話的唯一ID, 這個有點兒類似瀏覽器裏的session id,通過這個ID,微信就能定向將確認結果反饋到網頁上。使用微信二維碼登錄功能,需要有兩個前提:一是客戶端上需要安裝微信app二是用戶需要登錄到到微信apphttps://wx.qq.com/

 

 Python Web實時消息後臺服務器推送技術

 

爲什麼要有這兩個條件呢?那是因爲微信在確認是否允許登錄到網頁版的時候,微信需要提取當前app的登錄信息並將上面的session ID一併發給服務器,這樣服務器收到了登錄信息和sessionID後就可以確認兩件事:一是用來確認登錄的客戶端的用戶是驗證過的;二是通過sessionID服務器知道將反饋結果推送到哪個網頁。

   所以針對第一點,我們的關鍵在於,在掃描前要確保用戶是已經被驗證過且合法的用戶(驗證方式可以是用戶名+密碼,也可以是一個secure key),在選擇是否登錄時將這個結果一併推送到服務器端,就好了。如果用戶沒有驗證是否合法,可以像微信的處理方式一樣直接告訴用戶二維碼不可識別或提示請先登錄到app

  有了身份驗證,那麼現在就解決第二個問題,如何將反饋結果實時地顯示在網頁上呢?有朋友可能會說,客戶端這邊很簡單發一個請求到後臺就好了,而網頁上用ajax定時發送到服務器端看是否有反饋。我不贊成這種做法,因爲ajax輪詢方式十分消耗客戶端和服務器端資源!這裏涉及到另一個技術-web實時推送技術,使用推送技術可以節約服務器端和客戶端的資源,可以穩定地推送和接收任何消息。我在實現的過程中我採用了第三方推送服務-GoEasy推送,用它是實現非常簡單,我們項目裏的其他功能也用到了GoEasy web實時推送服務,所以在此我直接就用的GoEasy推送來將登錄反饋結果推送到服務器。我的實現步驟非常簡單,將傳送的session ID作爲客戶端與網頁端的通信channel,網頁端訂閱用session ID作爲值得channel,客戶端將驗證結果和session ID發送到服務器端,服務器端可以通過這個channel主動將結果推送給網頁版!如果客戶端也需要做相應的反饋的話,那麼客戶端也只需要訂閱這個channel,然後服務器端會同時將結果推送給網頁版和客戶端,收到消息後,就可以根據需求在goeasy的回調函數裏做你想做的事情了。關於goeasy推送的使用,大家可以參考這篇博客: http://www.cnblogs.com/jishaochengduo/articles/5552645.html另外GoEasy推送官網上也有一個demoGoEasy二維碼掃碼登錄demo,大家可以去看看效果.

  希望對大家有幫助,如有理解錯誤的地方,還請大家斧正。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章