書籍推薦
OAuth2 in Action -- 原理git
OAuth2 Cookbook -- 實踐github
OAuth2 解決的問題域
- 開放系統間受權
- 現代微服務安全
- 單頁瀏覽器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)
也就是給應用有限的訪問權限,讓應用可以表明用戶去訪問用戶的數據.session
舉個簡單例子,讓別人去你家取東西,將鑰匙給他,東西在大廳,他僅僅能進入大廳,臥室的門和其餘櫃子的鑰匙並無給他,也就沒有權限進行訪問.架構
因此說關鍵點在於有限的訪問權限,這個很重要.框架
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的典型模型
受權碼模式
![受權碼模式](http://static.javashuo.com/static/loading.gif)
簡化模式(適用於單頁應用)
![簡化模式](http://static.javashuo.com/static/loading.gif)
密碼模式
![密碼模式](http://static.javashuo.com/static/loading.gif)
客戶端模式
![客戶端模式](http://static.javashuo.com/static/loading.gif)
刷新令牌如何簡化令牌的獲取
![刷新令牌](http://static.javashuo.com/static/loading.gif)
模式選型
受權流程渠道(channels)
![channels](http://static.javashuo.com/static/loading.gif)
客戶應用類型
![oauth client](http://static.javashuo.com/static/loading.gif)
四中OAuth2.0受權類型(Flows)
![flows](http://static.javashuo.com/static/loading.gif)
受權類型選擇 ~ 流程
![select](http://static.javashuo.com/static/loading.gif)
OAuth的極簡pdf: https://github.com/MissWangLove/Micro-Service/tree/master/pdf