JAVA Websocket實現掃碼二維碼登陸---GoEasy

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

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

 

JAVA Websocket消息推送web

 

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

   因此針對第一點,咱們的關鍵在於,在掃描前要確保用戶是已經被驗證過且合法的用戶(驗證方式能夠是用戶名+密碼,也能夠是一個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,你們能夠去看看效果.安全

  但願對你們有幫助,若有理解錯誤的地方,還請你們斧正。服務器

相關文章
相關標籤/搜索