[轉載]Token原理以及應用

  近期因爲項目須要開發供第三方使用的api,在整個架構設計的一個環節中,對api訪問須要進行認證,在這裏我選擇了token認證。算法

一:token的優點(此部分引自http://www.sumahe.cn/

    1.無狀態、可擴展

        在客戶端存儲的Tokens是無狀態的,而且可以被擴展。基於這種無狀態和不存儲Session信息,負載負載均衡器可以將用戶信息從一個服  務   傳到其餘服務器上。

    若是咱們將已驗證的用戶的信息保存在Session中,則每次請求都須要用戶向已驗證的服務器發送驗證信息(稱爲Session親和性)。用戶量大時,可能會形成  一些擁堵。可是不要着急。使用tokens以後這些問題都迎刃而解,由於tokens本身hold住了用戶的驗證信息。
 api

    2.安全性


    請求中發送token而再也不是發送cookie可以防止CSRF(跨站請求僞造)。即便在客戶端使用cookie存儲token,cookie也僅僅是一個存儲機制而不是用於認證。不將信息存儲在Session中,讓咱們少了對session操做。

    token是有時效的,一段時間以後用戶須要從新驗證。咱們也不必定須要等到token自動失效,token有撤回的操做,經過token revocataion可使一個特定的token或是一組有相同認證的token無效。跨域

           3.可擴展性

Tokens可以建立與其它程序共享權限的程序。例如,能將一個隨便的社交賬號和本身的大號(Fackbook或是Twitter)聯繫起來。當經過服務登陸Twitter(咱們將這個過程Buffer)時,咱們能夠將這些Buffer附到Twitter的數據流上(we are allowing Buffer to post to our Twitter stream)。安全

使用tokens時,能夠提供可選的權限給第三方應用程序。當用戶想讓另外一個應用程序訪問它們的數據,咱們能夠經過創建本身的API,得出特殊權限的tokens。服務器

4.多平臺跨域

咱們提早先來談論一下CORS(跨域資源共享),對應用程序和服務進行擴展的時候,須要介入各類各類的設備和應用程序。cookie

Having our API just serve data, we can also make the design choice to serve assets from a CDN. This eliminates the issues that CORS brings up after we set a quick header configuration for our application.session

只要用戶有一個經過了驗證的token,數據和資源就可以在任何域上被請求到。架構

Access-Control-Allow-Origin: *

5.基於標準

建立token的時候,你能夠設定一些選項。咱們在後續的文章中會進行更加詳盡的描述,可是標準的用法會在JSON Web Tokens體現。app

最近的程序和文檔是供給JSON Web Tokens的。它支持衆多的語言。這意味在將來的使用中你能夠真正的轉換你的認證機制。負載均衡

 

二.Token的原理

 

 

1.將荷載payload,以及Header信息進行Base64加密,造成密文payload密文,header密文。


2.將造成的密文用句號連接起來,用服務端祕鑰進行HS256加密,生成簽名.


3.將前面的兩個密文後面用句號連接簽名造成最終的token返回給服務端

注:

(1)用戶請求時攜帶此token(分爲三部分,header密文,payload密文,簽名)到服務端,服務端解析第一部分(header密文),用Base64解密,能夠知道用了什麼算法進行簽名,此處解析發現是HS256。

(2)服務端使用原來的祕鑰與密文(header密文+"."+payload密文)一樣進行HS256運算,而後用生成的簽名與token攜帶的簽名進行對比,若一致說明token合法,不一致說明原文被修改。

 (3)判斷是否過時,客戶端經過用Base64解密第二部分(payload密文),能夠知道荷載中受權時間,以及有效期。經過這個與當前時間對比發現token是否過時。

三,實現思路

 

1.用戶登陸校驗,校驗成功後就返回Token給客戶端。

2.客戶端收到數據後保存在客戶端

3.客戶端每次訪問API是攜帶Token到服務器端。

4.服務器端採用filter過濾器校驗。校驗成功則返回請求數據,校驗失敗則返回錯誤碼

注:若是其中有錯誤請你們指出,但願你們共同進步

相關文章
相關標籤/搜索