書籍推薦
OAuth2 in Action -- 原理
OAuth2 Cookbook -- 實踐
OAuth2 解決的問題域
- 開放系統間授權
- 社交聯合登錄
- 開放API平台
- 現代微服務安全
- 單頁瀏覽器App(HTML5/JS/無狀態)
- 無線原生App
- 服務器端WebApp
- 微服務和API間調用
- 企業內部應用認證授權(IAM/SSO)
OAuth2的原理
OAuth2的最簡向導可以很清楚的說明.簡單明了(地址在https://github.com/MissWangLove/Micro-Service中的pdf下面).
應用請求資源服務器,訪問客戶數據,在沒有OAuth2的情況下,資源服務器區分不出請求過來的應用是惡意用戶還是其他用戶,數據都會返回. 有了OAuth2之后,使用授權服務器頒發給客戶應用Access Token, 資源服務器拿到Access Token進行校驗,驗證通過之后才返回數據.
整體的流程就是:
客戶應用向授權服務器請求Sccess Token ---> 授權服務器向用戶征詢意見,是否將權限授予客戶應用 ---> 用戶同意 ---> 授權服務器生成頒發Access Token給客戶應用 ---> 客戶應用請求資源服務器 ---> 資源服務器驗證客戶應用的Access Token ---> 驗證通過,返回數據.
涉及到三個角色:
- 客戶應用(請求資源方)
- 授權服務器(生成Access Token並頒發Access Token)
- 資源服務器(驗證Access Token,返回資源)
OAuth2的定義
什么是Oauth2
- OAuth2是用於REST/APIs的代理授權框架(delegated authorization framework)
- 是基於令牌Token的授權,在無需暴露用戶密碼的情況下,是應用能獲取對用戶數據有限訪問權限
- 解耦認證和授權
- 標准安全框架,支持多種用例場景
- 服務器端WebApp
- 瀏覽器單頁SAP
- 無線/原生App
- 服務器對服務器之間
令牌類比仆從鑰匙(Valet Key)
也就是給應用有限的訪問權限,讓應用能夠代表用戶去訪問用戶的數據.
舉個簡單例子,讓別人去你家取東西,將鑰匙給他,東西在大廳,他僅僅能進入大廳,卧室的門和其他櫃子的鑰匙並沒有給他,也就沒有權限進行訪問.
所以說關鍵點在於有限的訪問權限,這個很重要.
OAuth2的優點和缺點
優點:
- OAuth2.0比1.0更容易實現
- 更安全,客戶端不接觸用戶密碼,服務器端更易於集中保護
- 廣泛傳播並被持續使用
- 短壽命和封裝的token
- 資源服務器和授權服務器解耦
- 集中式授權,簡化客戶端
- HTTP/JSON友好,易於請求和傳遞token
- 考慮多種客戶端架構場景
- 客戶可以具有有不同的信任級別
缺點:
- 協議框架太寬泛,造成各種實現的兼容性和相互操作性差
- 和OAuth1.0不兼容
- OAuth2.0不是一個認證協議(是授權協議),OAuth2.0本身並不能告訴你任何用戶信息.
OAuth2.0主要角色
- 資源擁有着(RO): 資源的擁有人,想要分享某些資源給第三方應用
- 客戶應用: 通常是一個Web或者無線應用,需要訪問用戶的受保護資源
- 資源服務器: Web站點或者Web service API,用戶的受保護數據存在此處
- 授權服務器:客戶應用成功認證並獲得授權之后,向客戶應用頒發訪問令牌Access Token
OAuth術語
- 客戶憑證: 客戶的clientId和密碼用於認證客戶
- 令牌: 授權服務器在接收到客戶請求后,頒發的訪問令牌
- 作用域: 客戶請求訪問令牌時,由資源擁有者額外指定的細分權限(permission)
OAuth2的令牌類型
- 授權碼(Authorization Code Token): 僅用於授權碼授權類型,用於交換獲取訪問令牌和刷新令牌
- 刷新令牌(Refresh Token): 用於去授權服務器獲取一個新的訪問令牌
- 訪問令牌(Access Token): 用於去代表一個用戶或服務直接去訪問受保護的資源.
- Bearer Token: 不管誰拿到Token,都可以訪問資源,像現鈔
- Proof of Possession(PoP Token): 可以校驗client是否對Token有名確的擁有權
訪問令牌是最重要的.
OAuth2.0誤解
- OAuth並沒有支持HTTP以外的協議
- OAuth並不是一個認證協議
- OAuth並沒有定義授權處理機制
- OAuth並沒有定義token格式
- OAuth2.0並沒有定義加密算法
- OAuth2.0並不是單個協議
- OAuth2.0僅是授權框架,僅用於授權處理
OAuth的本質就是如何獲取token和如何使用token.
OAuth是一種在系統間的代理授權協議(delegation authorization)
OAuth提供一個寬泛的協議框架,具體安全場景需要定制
OAuth使用代理協議的方式解決密碼共享反模式問題
OAuth2.0的典型模型
授權碼模式
簡化模式(適用於單頁應用)
密碼模式
客戶端模式
刷新令牌如何簡化令牌的獲取
模式選型
授權流程渠道(channels)
客戶應用類型
四中OAuth2.0授權類型(Flows)
授權類型選擇 ~ 流程
OAuth的極簡pdf: https://github.com/MissWangLove/Micro-Service/tree/master/pdf