REST 是一種現代架構風格,它定義了一種設計 Web 服務的新方法。和以前的 HTTP 以及 SOA 不一樣,它不是一個協議(即:一套嚴格的規則),而是一些關於 Web 服務應該如何相互通訊的一些建議和最佳實踐。按照 REST 最佳實踐開發的服務被稱爲 「RESTful Web 服務」。算法
安全性是 RESTful 服務的基石。啓用它的方法之一是儘量內置用戶身份驗證和受權機制。segmentfault
在 RESTful 服務中實現用戶身份驗證和受權的方法有不少。咱們今天要講的主要方法(或標準)有:後端
爲了讓咱們的討論更加具體,假設咱們的後端程序有微服務,而且每一個用戶請求時,必須調用後端的幾個服務來返回請求的數據。因此,咱們將不只從安全性問題方面,並且在它們產生的額外流量和服務器負載的背景下檢查每一個標準。下面開始吧…安全
最古老也是最簡單的標準。服務器
看起來像: 用戶名 + 密碼 + Base64(對用戶名和密碼作哈希的基礎算法)。架構
工做原理:加入有人嘗試登陸用戶的 Fackbook 帳戶,去訪問他的消息、歷史記錄、羣組信息,這些都是獨立的服務。當用戶輸入用戶名和密碼後,系統會容許登陸。可是,默認狀況下,系統不知道用戶的角色和權限是什麼,他們能夠訪問哪些服務等等。微服務
因此每次用戶嘗試訪問任何一個服務的時候,系統都應該再次驗證是否容許執行這個操做,這意味着須要對身份驗證進行額外的調用。就咱們的示例中有四個服務而言,在這種狀況下,每一個用戶將有四個額外的調用。編碼
如今假設每秒有 3k 個請求,在 Facebook 的系統中每秒 300k 請求更現實。將這請求乘以四,結果是每秒要向服務器發出 12k 次調用。spa
總結:可伸縮性差,大量的額外流量(額外調用)沒有帶來業務價值,服務器的負載很大。設計
看起來像:用戶名 + 密碼 + 訪問令牌 + 過時令牌
工做原理:OAuth 2.0 標準的核心思想是,用戶使用用戶名和密碼登陸系統後,客戶端(用戶訪問系統的設備)會收到一對令牌,這是一個訪問權限令牌和刷新令牌。
訪問令牌用於訪問系統中的全部服務。到期後,系統使用刷新令牌生成一對新的令牌。因此,若是用戶天天都進入系統,令牌也會天天更新,不須要每次都用用戶名和密碼登陸系統。刷新令牌也有它的過時時間(雖然它比訪問令牌長得多),若是一個用戶一年沒有進入系統,那麼極可能會被要求再次輸入用戶名和密碼。
OAuth 2.0 標準取代了基本的身份驗證方法,它具備必定的優點,例如用戶每次想要進入系統時不用輸入用戶名和密碼。可是,系統仍然須要調用身份驗證服務器,就像使用基自己份驗證方法時同樣,以檢查擁有該令牌的用戶有權限作什麼。
假設有效期是一天。這意味着登陸服務器上的負載要少得多,由於用戶天天只須要輸入一次憑證,而不是每次都要進入系統。可是,系統仍須要驗證每一個令牌並檢查用戶角色的存儲狀態。因此咱們最終還要調用身份驗證服務器。
總結:和 Basic 驗證有相同的問題 - 可伸縮性差,身份驗證服務器負載較高。
看起來像:用戶名 + 密碼 + JSON數據 + Base64 + 私鑰 + 到期日期
工做原理:當用戶第一次使用用戶名和密碼登陸系統時,系統不只會返回一個訪問令牌(只是一個字符串),而是一個包含全部用戶信息的 JSON 對象,好比角色和權限,使用 Base64 進行編碼並使用私鑰簽名。下圖是它在沒有編碼的狀況下的樣子:
看起來很可怕,但這確實有效!主要區別在於咱們能夠在令牌中存儲狀態,而服務保持無狀態。這意味着用戶本身擁有本身的信息,不須要額外的調用來檢查它,由於全部的內容都在令牌裏。這對於減小服務器負載方面是一個很大的優點。這個標準在世界範圍內獲得普遍應用。
總結:良好的可伸縮性,能夠和微服務一塊兒工做。
一種全新的,奇特的方法,稱爲 HTTP 簽名,亞馬遜是目前使用它的大廠之一。
它的思路是,當你建立亞馬遜賬戶的時候,會生成一個永久的、很是安全的訪問令牌,你要很是當心地存儲起來而且不要給任何人顯示。當你要從 Amazon 請求某些資源時,你能夠獲取到全部相關的 http 頭信息,使用這個私鑰對其進行簽名,而後將簽名的字符串做爲 header 發送。
在服務器端,亞馬遜也有你的訪問密鑰。它們接下來作什麼?只須要使用你的 http 頭信息和這個密鑰進行簽名。而後將簽名字符串和你做爲簽名的字符串進行比較;若是相同那麼就知道你是誰。
最大的好處是你只須要發送一次用戶名和密碼 - 就能夠得到令牌。至於使用私鑰簽名的 header 信息,基本上沒有機會對它們進行編碼。就算有人截獲了信息——誰在意呢 ;)
英文原文: https://yellow.systems/blog/r...
本文由博客一文多發平臺 OpenWrite 發佈!