OAuth2和JWT - 如何設計安全的API?
點擊上方 好好學java ,選擇 星標 公眾號
重磅資訊,干貨,第一時間送達
今日推薦:分享一套基于SpringBoot和Vue的企業(yè)級中后臺開源項目,這個項目有點哇塞!
個人原創(chuàng)100W +訪問量博客:點擊前往,查看更多
轉自:樂傻驢
鏈接:www.jianshu.com/p/1f2d6e5126cb
本文會詳細描述兩種通用的保證API安全性的方法:OAuth2和JSON Web Token (JWT)
-
你已經(jīng)或者正在實現(xiàn)API; -
你正在考慮選擇一個合適的方法保證API的安全性;
JWT和OAuth2比較?
-
JWT是一種認證協(xié)議
JWT提供了一種用于發(fā)布接入令牌(Access Token),并對發(fā)布的簽名接入令牌進行驗證的方法。令牌(Token)本身包含了一系列聲明,應用程序可以根據(jù)這些聲明限制用戶對資源的訪問。 -
OAuth2是一種授權框架
另一方面,OAuth2是一種授權框架,提供了一套詳細的授權機制(指導)。用戶或應用可以通過公開的或私有的設置,授權第三方應用訪問特定資源。既然JWT和OAuth2沒有可比性,為什么還要把這兩個放在一起說呢?實際中確實會有很多人拿JWT和OAuth2作比較。標題里把這兩個放在一起,確實有誤導的意思。很多情況下,在討論OAuth2的實現(xiàn)時,會把JSON Web Token作為一種認證機制使用。這也是為什么他們會經(jīng)常一起出現(xiàn)。
JSON Web Token (JWT)
JSON Web Token (JWT) is a compact URL-safe means of representing claims to be transferred between two parties. The claims in a JWT are encoded as a JSON object that is digitally signed using JSON Web Signature (JWS).
-RFC7519 https://tools.ietf.org/html/rfc7519
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
一個token包含三部分:
header.claims.signature了安全的在url中使用,所有部分都 base64 URL-safe進行編碼處理。
頭部分簡單聲明了類型(JWT)以及產(chǎn)生簽名所使用的算法。
{"alg" : "AES256","typ" : "JWT"}
一個簡單的聲明(claim)的例子:
{"sub": "1234567890","name": "John Doe","admin": true}
這里有一個重要的實現(xiàn)細節(jié)。只有獲取了私鑰的應用程序(比如服務器端應用)才能完全認證token包含聲明信息的合法性。所以,永遠不要把私鑰信息放在客戶端(比如瀏覽器)。
OAuth2是什么?
The OAuth 2.0 authorization framework enables a third-party application to obtain limited access to an HTTP service, either on behalf of a resource owner by orchestrating an approval interaction between the resource owner and the HTTP service, or by allowing the third-party application to obtain access on its own behalf.
-RFC6749 https://tools.ietf.org/html/rfc6749
應用程序或者用戶都可以是下邊的任何一種角色:
資源擁有者
資源服務器
客戶端應用
認證服務器
這里的客戶端主要指API的使用者。它可以是的類型:
私有的
公開的
OAuth2框架也指定了集中客戶端描述,用來表示應用程序的類型:
Web應用
用戶代理
原聲應用
認證授權代表資源擁有者授權給客戶端應用程序的一組權限,可以是下邊幾種形式:
授權碼
隱式授權
資源擁有者密碼證書
客戶端證書
Endpoints終端
認證終端
Token終端
重定向終端
使用HTTPS保護用戶密碼
安全地傳輸用戶提供的私密信息,在任何一個安全的系統(tǒng)里都是必要的。否則任何人都可以通過侵入私人wifi,在用戶登錄的時候竊取用戶的用戶名和密碼等信息。
在做選擇之前,參考一下下邊提到的幾點。
OAuth2是一個安全框架,描述了在各種不同場景下,多個應用之間的授權問題。有海量的資料需要學習,要完全理解需要花費大量時間。甚至對于一些有經(jīng)驗的開發(fā)工程師來說,也會需要大概一個月的時間來深入理解OAuth2。這是個很大的時間投入。
相反,JWT是一個相對輕量級的概念??赡芑ㄒ惶鞎r間深入學習一下標準規(guī)范,就可以很容易地開始具體實施。
OAuth2不像JWT一樣是一個嚴格的標準協(xié)議,因此在實施過程中更容易出錯。盡管有很多現(xiàn)有的庫,但是每個庫的成熟度也不盡相同,同樣很容易引入各種錯誤。在常用的庫中也很容易發(fā)現(xiàn)一些安全漏洞。
當然,如果有相當成熟、強大的開發(fā)團隊來持續(xù)OAuth2實施和維護,可以一定成都上避免這些風險。
在很多情況下,使用用戶在大型社交網(wǎng)站的已有賬戶來認證會方便。
如果期望你的用戶可以直接使用Facebook或者Gmail之類的賬戶,使用現(xiàn)有的庫會方便得多。
結論
JWT使用場景
無狀態(tài)的分布式API
但是,如果系統(tǒng)中需要使用黑名單實現(xiàn)長期有效的token刷新機制,這種無狀態(tài)的優(yōu)勢就不明顯了。
快速開發(fā)
不需要cookie
JSON在移動端的廣泛應用
不依賴于社交登錄
相對簡單的概念理解
Token有長度限制
Token不能撤銷
需要token有失效時間限制(exp)
OAuth2使用場景
在作者看來兩種比較有必要使用OAuth2的場景:
外包認證服務器
也就是常見的,去認證服務商(比如facebook)那里注冊你的應用,然后設置需要訪問的用戶信息,比如電子郵箱、姓名等。當用戶訪問站點的注冊頁面時,會看到連接到第三方提供商的入口。用戶點擊以后被重定向到對應的認證服務商網(wǎng)站,獲得用戶的授權后就可以訪問到需要的信息,然后重定向回來。
快速開發(fā)
實施代碼量小
維護工作減少
大型企業(yè)解決方案
考慮到工作量,可能需要單獨的團隊,針對各種應用開發(fā)完善、靈活的安全策略。當然需要的工作量也比較大!這一點,OAuth2的作者也指出過:
To be clear, OAuth 2.0 at the hand of a developer with deep understanding of web security will likely result is a secure implementation. However, at the hands of most developers – as has been the experience from the past two years – 2.0 is likely to produce insecure implementations.
hueniverse - OAuth 2.0 and the Road to Hell
靈活的實現(xiàn)方式
可以和JWT同時使用
可針對不同應用擴展
進一步
http://jwt.io - JWT官方網(wǎng)站,也可以查看到使用不同語言實現(xiàn)的庫的狀態(tài)。
http://oauth.net/2/ OAuth2官方網(wǎng)站, 也也可以查看到使用不同語言實現(xiàn)的庫的狀態(tài)。
OAuth 2 tutorials - Useful overview of how OAuth 2 works
Oauth2 Spec issues Eran Hammer’s (推進OAuth標準的作者) views on what went wrong with the OAuth 2 spec process. Whatever your own opinion, good to get some framing by someone who understand’s key aspects of what make a security standard successful.
Thoery and implemnetation: with Laravel and Angular Really informative guide to JWT in theory and in practice for Laravel and Angular.
推薦文章
最后,再給大家分享一份很好的算法刷題指南,我們都知道面試的不可避免的就是手撕代碼,而且一般都是很難掌握的,我在前面面試中就是每天刷題,很費時間,也是很辛苦的,今天給大家推薦份來自字節(jié)跳動大佬的算法手冊,我看過,感覺很不錯,大家可以先看一下下面的內(nèi)容:

掃描下方二維碼,回復「算法」即可獲取
