HTTP Basic Auth
每次請求API時都提供用戶的 賬號與密碼 ,它是配合RESTful API 使用最簡單的認(rèn)證方式,只需提供用戶名密碼即可,但是由于這樣會把用戶名和密碼直接暴露給第三方客戶端的風(fēng)險,所以盡量避免采用 HTTP Basic Auth
OAuth
OAuth 是一個開放的授權(quán)標(biāo)準(zhǔn),允許用戶讓第三方應(yīng)用訪問該用戶在某一web服務(wù)上存儲的私密資源,而無需將用戶名和密碼提供給第三方應(yīng)用
OAuth允許用戶提供一個令牌,而不是用戶名和密碼來訪問他們存放在特定服務(wù)提供者的數(shù)據(jù)。每一個令牌授權(quán)一個特定的第三方系統(tǒng)(例如,視頻編輯網(wǎng)站)在特定的時段(例如,接下來的2小時內(nèi))內(nèi)訪問特定的資源(例如僅僅是某一相冊中的視頻)。這樣,OAuth讓用戶可以授權(quán)第三方網(wǎng)站訪問他們存儲在另外服務(wù)提供者的某些特定信息,而非所有內(nèi)容

Cookie Auth
Cookie 認(rèn)證機制就是為一次請求認(rèn)證在服務(wù)端創(chuàng)建一個 session 對象,同時在客戶端的瀏覽器端創(chuàng)建了一個Cookie對象,通過客戶端帶上來Cookie對象來與服務(wù)器端的session對象來匹配實現(xiàn)狀態(tài)管理。
Tocken Auth
使用Token Auth的流程:客戶端使用用戶名和密碼請求登錄,服務(wù)端收到請求,驗證用戶名和密碼。驗證成功后,服務(wù)端會生成一個token,然后把這個token發(fā)送給客戶端??蛻舳耸盏絫oken后把它存儲起來,可以放在cookie或者Local Storage(本地存儲)里??蛻舳嗣看蜗蚍?wù)端發(fā)送請求的時候都需要帶上服務(wù)端發(fā)給的token。服務(wù)端收到請求,然后去驗證客戶端請求里面帶著token,如果驗證成功,就向客戶端返回請求的數(shù)據(jù)。

基于JWT的Tocken認(rèn)證機制實現(xiàn)
JWT 是 (JSON Web Tocken) 的縮寫,它是一個非常輕巧的規(guī)范,這個規(guī)范允許我們使用JWT在用戶和服務(wù)器之間傳遞安全可靠的信息
JWT的組成
一個JWT實際上就是一個字符串,它由三部分組成:頭部、載荷與簽名
載荷(payload):

iss:該JWT的簽發(fā)者,是否使用是可選的
sub:該JWT所面向的用戶,是否使用是可選的
aud:接收該JWT的一方,是否使用是可選的
exp(expires):什么時候過期,這里是一個Unix事件戳,是否使用是可選的
iat(issued at):在什么時候簽發(fā)的(UNIX事件),是否使用是可選的
nbf(Not Before):如果當(dāng)前時間在nbf里的時間之前,則Tocken不被接受;一般都會留一些余地,比如幾分鐘;是否使用是可選的
將上面的JSON對象進(jìn)行 base64編碼 可以得到下面的字符串。這個字符串 我們將它稱作JWT的Payload(載荷)
eyJpc3MiOiJKb2huIFd1IEpXVCIsImlhdCI6MTQ0MTU5MzUwMiwiZXhwIjoxNDQxNTk0NzIyLCJhdWQiOiJ3d3cuZXhhbXBsZS5jb20iLCJzdWIiOiJqcm9ja2V0QGV4YW1wbGUuY29tIiwiZnJvbV91c2VyIjoiQiIsInRhcmdldF91c2VyIjoiQSJ9
頭部(Header)
JWT 頭部用于描述關(guān)于該JWT的最基本的信息,例如其類型以及簽名所用的算法等,他也可以表示成一個json對象

上圖中在JWT頭部指明了簽名算法是HS256算法
頭部也要進(jìn)行BASE64編碼,編碼后的字符串如下:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
簽名(Signature)
將 載荷和頭部 編碼后的字符串都用句號 . 連接起來(頭部在前),就形成了
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmcm9tX3VzZXIiOiJCIiwidGFyZ2V0X3VzZXIiOiJBIn0
最后我們將上面拼完的字符串用HS256算法進(jìn)行加密,在加密的時候,我們還需要提供一個密鑰(secret),如果我們用 mystart 作為密鑰的話,那么就可以得到我們加密后的內(nèi)容:
rSWamyAYwuHCo7IFAgd1oRpSP7nzL7BF5t7ItqpKViM
最后將這一部分簽名也拼接在被簽名的字符串后面,我們就得到了完整的JWT:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmcm9tX3VzZXIiOiJCIiwidGFyZ2V0X3VzZXIiOiJBIn0.rSWamyAYwuHCo7IFAgd1oRpSP7nzL7BF5t7ItqpKViM
在我們的請求URL中會帶上這串JWT字符串:
https://your.awesome-app.com/make-friend/?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmcm9tX3VzZXIiOiJCIiwidGFyZ2V0X3VzZXIiOiJBIn0.rSWamyAYwuHCo7IFAgd1oRpSP7nzL7BF5t7ItqpKViM
Tocken Auth的優(yōu)點
Tocken機制相對于Cookie機制的好處:
1.支持跨域訪問:Cookie是不允許跨域訪問的,這一點對Tocken機制是不存在的,前提是傳輸?shù)挠脩粽J(rèn)證信息通過HTTP頭傳輸
2.無狀態(tài)(也稱:服務(wù)端可擴展行):Tocken機制在服務(wù)端不需要存儲session信息,因為Tocken自身包含了所有登錄用戶的信息,只需要在客戶端的cookie或本地介質(zhì)存儲狀態(tài)信息
3.更適用CDN:可以通過內(nèi)容分發(fā)網(wǎng)絡(luò)請求你服務(wù)端的所有資料(如:javascript,HTML,圖片等),而你的服務(wù)端只要提供API即可
4.去藕:不需要綁定到一個特定的身份驗證方案。Tocken可以在任何地方生成,只要在你的API被調(diào)用的時候,你可以進(jìn)行Tocken生成調(diào)用即可
5.更適用于移動應(yīng)用: 當(dāng)你的客戶端是一個原生平臺(iOS, Android,Windows 8等)時,Cookie是不被支持的(你需要通過Cookie容器進(jìn)行處理),這時采用Token認(rèn)證機制就會簡單得多。
6.CSRF:因為不再依賴于Cookie,所以你就不需要考慮對CSRF(跨站請求偽造)的防范。
7.性能: 一次網(wǎng)絡(luò)往返時間(通過數(shù)據(jù)庫查詢session信息)總比做一次HMACSHA256計算 的Token驗證和解析要費時得多.
8.不需要為登錄頁面做特殊處理: 如果你使用Protractor 做功能測試的時候,不再需要為登錄頁面做特殊處理.
9.基于標(biāo)準(zhǔn)化:你的API可以采用標(biāo)準(zhǔn)化的 JSON Web Token (JWT). 這個標(biāo)準(zhǔn)已經(jīng)存在多個后端庫(.NET, Ruby, Java,Python, PHP)和多家公司的支持(如:Firebase,Google, Microsoft).