15.app後端怎麼設計用戶登陸方案

【轉載】做者:曾健生,公衆號IDappbackendweb

               比目科技 Bmob後端雲redis

 

在不少app中,都須要用戶的登陸操做。登陸,就須要用到用戶名和密碼。爲了安全起見,暴露明文密碼的次數越少越好。怎麼能最大程度避免泄露用戶的密碼呢?在登陸後,app後端怎麼去驗證和維持用戶的登陸狀態呢?在本文中,給出了一套用戶登陸的解決方案,以供你們參考。後端

 

1.保證登陸的安全性,最起碼要使用https協議api

 

  避免信息的泄露,最簡單的方案是全部涉及到安全性的api請求,都必需要使用https協議。瀏覽器

 

  HTTPSSecure Hypertext Transfer Protocol)安全超文本傳輸協議安全

 

  它是一個安全通訊通道,它基於HTTP開發,用於在客戶計算機和服務器之間交換信息。它使用安全套接字層(SSL)進行信息交換,簡單來講它是HTTP的安全版。它是由Netscape開發並內置於其瀏覽器中,用於對數據進行壓縮和解壓操做,並返回網絡上傳送回的結果。HTTPS實際上應用了Netscape的安 全全套接字層(SSL)做爲HTTP應用層的子層。服務器

 

  http是超文本傳輸協議,信息是明文傳輸,https 則是具備安全性的ssl加密傳輸協議。cookie

 

  注意了,https協議須要到ca申請證書,通常免費證書不多,須要交費。網絡

 

  咱們能夠看看全部大型網站,例如京東,淘寶,支付寶,涉及到登陸和支付的頁面,url都是以https開頭,這就意味着,此次通信是使用https。開放平臺的api,例如新浪微博,騰訊等,api請求都是以https開頭的。https是業界經常使用的保證安全性的協議。session

 

  所以,涉及安全問題的api,都應該使用https協議。雖然,https爲了保證安全性,在效率上是比http協議低。

 

2.基本的用戶登陸方案

 

  在傳統的web網站中,能夠使用cookie+session來實現用戶的登陸維護,那麼在app後端,能夠怎麼實現呢?

 

  在app後端,怎麼避免每次驗證用戶身份都須要傳輸用戶名和密碼呢?

 

  一個生活的模型就是:

 

  假設服務器是個房間,裏面有個房間管理員,房間上的門有把鎖,這把鎖有兩種打開方式:

 

  1. 輸入了這把鎖上註冊的用戶名和密碼,就能打開

 

  2. 用房間管理員提供的鑰匙打開

 

  a.當第一次使用用戶名和密碼打開了這把鎖後,進入房間,找到房間管理員,讓他提供一把鑰匙。

 

  b.那之後每次須要進入這個房間,就用這把鑰匙就好了,不用擔憂旁邊有人偷看到本身的用戶名和密碼.

 

  c.決定有一段時間不進入這個房間,又怕鑰匙被偷,就進入房間裏,把鑰匙還給管理員,讓管理員把鑰匙毀滅

 

  a就是登陸的操做,b就是驗證身份的操做,c就是退出登陸的操做.

 

  理論版的描述以下:

 

  (1)  服務器接收到app發送的用戶名和密碼後,驗證用戶名和密碼是否正確。

 

  若是錯誤則返回錯誤信息。

 

  若是驗證正確,生成一個隨機的不重複的token字符串(例如"daf32da456hfdh"),在redismemcache中維護一個映視表,創建token字符串和用戶信息的對應關係表,例如,把token字符串"daf32da456hfdh"和用戶id"5"對應起來。

 

  (2) 服務器把token字符串返回給appapp把這個token字符串保存起來,做爲登陸的驗證。

 

  (3) 當須要驗證用戶身份的操做時,必需要把token字符串傳給服務器驗證身份。

 

  例如,api "test.com/user/update"是更新用戶的信息,必需要驗證用戶的身份.當調用api "test.com/user/update"時,把token字符串"daf32da456hfdh"放在url上,變成"test.com/user/update?token=daf32da456hfdh" .

 

  當服務器接收到這個api請求,知道要驗證用戶身份的,因而,就把參數中token的值"daf32da456hfdh"取出來,在(1)中創建的token字符串和用戶信息的對應關係表查找,若是發現沒這個token值的,則返回驗證失敗的信息。若是發現有這個token值,則獲取這個用戶的信息,進行相關的更新操做。

 

  (4) 當用戶退出登陸時,須要經過調用api,讓服務器把這個用戶對於的token字符串刪除.

 

  例如,api "test.com/user/logout"是退出登陸的api,也要驗證用戶身份, 則調用"test.com/user/logout?token=daf32da456hfdh" 。當服務器接到退出登陸的api請求時,在(1)中創建的token字符串和用戶信息的對應關係表查找token字符串,把token和用戶信息都刪除便可。

 

  注意:這個方案並非十分安全,這個身份驗證是依賴於token字符串。若是用戶泄漏了本身的url, 那很大程度上token也被別人泄漏了,就至關於鑰匙被人複製了一份。在下篇的通信安全中,會描述一個防止token在通信中泄漏的方案。

相關文章
相關標籤/搜索