后端服務器有兩種基本的身份驗證:
1.是基於Cookie的身份驗證,使用服務器端的cookie來對每次請求的用戶進行身份驗證。
2. 較新的方法,基於令牌Token的認證,依賴於被發送到服務器上每個請求的簽署令牌。
token的優勢
1.跨域 / CORS: cookies並不能跨不同的域名:abc.com和xy.abc.com的cookies是不能共享的,索性這種一級二級域名是可以通過
設置Cookie的SetDomain參數(例如:cookies.setDomain(".abc.com"))來共享cookies.但是abc.com和xy.com是不能相互獲取 cookies的.而基於令牌能夠使用 AJAX 調用服務器,在任何域名下你都可以使用HTTP header頭部來傳輸用戶信息。
2. 無態(代表服務器端可伸縮): 沒有必要將會話保存,令牌 token 自己是一個自我包容的實體,包含用戶各種信息,其他狀態信息可以保存在cookie或客戶端本地存儲器中
3.CDN: 能夠適用來自CDN任何應用部件(e.g. javascript, HTML, images, etc.), 你的服務器只是一個 API.
4.解耦: 你不必和一個特定的驗證格式Schema綁定,令牌token 能在任何地方產生,這樣的你的API可以在任何地方以同一種驗證方式調用驗證。
5.對移動Mobile友善: 當你在一個原生平台(iOS, Android, Windows 8, etc.)時, cookies依賴於一個安全API,並不是好主意,因為你得和一個cookie容器打交道,而基於令牌則簡單多。
6.CSRF: 因為你不依賴cookies, 你就不需要跨請求保護,(e.g. it 有可能來自 <iframe> 請求一個POST,需要重用一個存在的驗證。).
6.性能:一個網絡往返(如發現在數據庫中的會話)可能會比計算的HMACSHA256驗證令牌耗費更多時間。
7.登錄頁面不是一個特殊情況,如果你如果您正在使用量角器來寫你的功能測試,你不需要來處理登錄的任何特殊情況。
8.基於標准: 你的API能接受一個標准的 JSON Web Token (JWT). 這個標准后面有多個庫包(.NET, Ruby, Java, Python, PHP),許多公司支持(e.g. Firebase, Google, Microsoft). ,比如Firebase允許他們的客戶使用任何身份驗證機制,只要你使用預先定義的屬性生成一個 JWT,並使用共享密鑰簽署,就能調用它們的API.
基於Token的驗證原理
基於Token的身份驗證是無狀態的,我們不將用戶信息存在服務器或Session中。
這種概念解決了在服務端存儲信息時的許多問題
NoSession意味着你的程序可以根據需要去增減機器,而不用去擔心用戶是否登錄。
基於Token的身份驗證的過程如下:
1.用戶通過用戶名和密碼發送請求。
2.程序驗證。
3.程序返回一個簽名的token 給客戶端。
4.客戶端儲存token,並且每次用於每次發送請求。
5.服務端驗證token並返回數據。
每一次請求都需要token。token應該在HTTP的頭部發送從而保證了Http請求無狀態。我們同樣通過設置服務器屬性Access-Control-Allow-Origin:* ,讓服務器能接受到來自所有域的請求。需要主要的是,在ACAO頭部標明(designating)*時,不得帶有像HTTP認證,客戶端SSL證書和cookies的證書。