SSO:用戶一次登錄後在多個系統免登陸。html
博客gem 'doorkeeper' https://i.cnblogs.com/EditPosts.aspx?postid=9255973git
OAuth:用戶受權第三方應用訪問本身的資源無需提供帳號密碼。
1. 維基百科:
OAuth(開放受權)是一個開放標準,容許用戶讓第三方應用(網站/app)訪問該用戶在另外一網站(qq, 微博,微信等等)上存儲的私密的資源(如照片,視頻,聯繫人列表),而無需將用戶名和密碼提供給第三方應用。 github
OAuth容許用戶提供一個令牌,而不是用戶名和密碼來訪問他們存放在特定服務提供者的數據。每個令牌受權一個特定的網站(例如,視頻編輯網站)在特定的時段(例如,接下來的2小時內)內訪問特定的資源(例如僅僅是某一相冊中的視頻)。這樣,OAuth讓用戶能夠受權第三方網站訪問他們存儲在另外服務提供者的某些特定信息,而非全部內容。web
2 流程圖(用git帳號登錄第三方網站)
3. devise使用OmniAuthapi
簡單易學的PPT:(做者大🐂)
https://ruby-china.org/topics/15825瀏覽器
(筆記和摘錄)ruby
目標服務器
- OAuth2 協議怎麼運行的
- 看懂基於OAuth2的第三方API
- 知道怎麼用Oauth2 鎖你的API(不理解)
課表微信
- Oauth2是什麼
- 通訊協定怎麼跑
- 製造Oauth2 Provider的方法(沒看, 幻燈片224頁)
- 第一次用rails+ grape api整合oauth2 就上手(略, 244頁)
OAuth2.0: the OAuth2.0 authorization framework
Oauth2是什麼:
Resource
Resource Owner = User的狀況
- 就是你的網站上的User
- API拉到的是根User有關的資料
- 好比好友名單,信件內容
- 受權必須由本人親自確認
Resource Owner = Client
- 爬公開的資料,沒有個體人的存在
- Twitter稱爲App-Only Authorization
- Facebook稱爲App Access Token
Client
- User受權給第三方程序,這個程序就是Client (個人理解:web網站服務器)
- 例子:手機上的APP, Facebook上的遊戲, 桌面app。
Client必須事先註冊
- 「Client Registration」
- Client ID
- Client secret (密碼)
- Redirect URl (重要🌿)
在Facebook上註冊得到facebook_app_id, facebook_app_secret, 在facebook上設置redirect URIs併發
Redirect URI
- User本人確認使用Facebook登錄後,返回結果到Client。
- 要事先指定URl, 若不一致,則不可Redirect過去
- 能夠指定多組,上面的圖指定了2組。
- 推薦使用HTTPS.
Public 對比 Confidential Client
- 根據【可否保護資料】來區分:
- Confidential-Server-Side application 機密的服務器端程序
- Public-手機app/桌面程序/Javascript App/ Browser Extension
Client Authorization(使用於Confidential Client)
-
- 出示Client ID + Secret 向 Auth.Server認證本身(我是一個服務器商業機構,我想得到user的信息)
- Client要登入到Auth.Server(Facebook的開發者相關的服務器)
Client
-
- 有ID/Secret用於登錄
- 用Redirect URI確認 瀏覽啊轉地址到 正確的Client.
- Public/Confidential 這2種模式有各自的受權流程(token得到流程)
Endpoints(可見下面的圖)
3個端點:
- Authorization Endpoint(受權端): 用來給User本人確認受權
- Token Endpoint: 用來讓Client(如:商業網站)獲得Token
- Redirection Endpoint: Client用來收取資料的URls
Authorization Endpoint
- 給用戶User本人一個用於受權的網頁,能夠填寫帳號名,密碼。
- Client拿到Grant受權狀,不是token。
- Resource Owner/User答覆以後, 驗證服務器(facebook)會把批准碼grant傳回到Redirect URI
Redirection Endpoint
- 用來從browser接收Auth.Server來的資料。
- 把資料存在Client上(猜想:這裏是商業網站服務器上)
- Client在facebook上註冊時,填寫Redirection URL就是callback URL
Token Endpoint
- 給Client取得真正的Token
- JSON API 機械化界面,無網頁。
Resource Server
- Client必須出示Token才能拿資料
- 可使用Scope限制Token的取用範圍。
- Password-Free API
- Login via Your Website
Parameters 和 Data
Client ID/Secret
- 用於Client認證(Client 登入到Auth.Server)
- HTTP Basic Auth或包在Form裏面。(禁用URL)
Id和secret被base64()生成亂碼,放入請求頭中:
Basic Auth Header
Authorization: Basic xxx亂碼
Token(s)
- Access Token: 打Api用的
- Refresh Token: Access Token過時能夠換新的
Access Token:
-
- 向Resource Server要資料(user信息)
- 能夠綁定一組Scope
- 能夠設定氣息,能夠撤銷Revoke
- 受權流程的目標就是拿到Access Token
Refresh Token
-
- 換髮Access Token用,只會傳到Auth.Server
- 和一個Access Token綁定,隨Access Token一切核發
- 用過就失效,新的Access Token會綁定新的Refresh Token
Scopes
- 用來表示哪行資料能夠存取的權限範圍。
- 如: 好友名單, 相片, friends_list, photos
- 申請受權時能夠規定它。
State
- 用來放在CSRF攻擊(cross site request forgery)
- Rails使用了校驗token防止了這種攻擊。
怎麼運行的:若是取得受權(從client視角,程序程序開發者視角)
- Client 向Res.Owner取得Grant
- Client 用Grant向Authorization Server換Token
- Token拿到,去打API
常見的scenario:
有網站Facebook, 你但願在那上面的User(Resource Owner),
透過Facebook的Authorization Server,
給你的網站(Client)權限(Token),能夠讀取那User的資料(Resource Server)
例子:使用你網站的user無需註冊,而是使用Fackbook/qq的帳號註冊。
Authorization Code Grant Flow:
- Grant是具體string, 稱爲Code
- 須要通過Browser
- 適用Client:商業網站 。
具體過程見幻燈片(40多張)
https://speakerdeck.com/chitsaou/jian-dan-yi-dong-de-oauth-2-dot-0?slide=73
步驟A以前,已經在Facebook上註冊了。
當網站上的用戶點擊login with Facebook按鈕的時候:
(A)發出Get request:
猜想:還應該包括用戶輸入facebook的帳號和密碼。這樣facebook才能找到對應用戶的Res.Owner
(B)的過程,在瀏覽器上彈出對話框問,是否受權,用戶選擇贊成。進入(C)
(C) 的過程,Authorization Server傳回Client數據:Grant Code。
若是(B)不受權,(c)Client收到錯誤的信息。
Redirection endPoint會檢查state和存的數據是否一致。沒問題就去換Token了。
(D)步驟:
-
這是服務器後臺的事情。
- 發出 POST request到Auth.Server的Token Endpoint換Token
(E)步驟:
Authorization Server:
- 確認Client Auth(Id/Secret)正確。
- 找到Grant Code, 並確認Redirect URI 相同
- 發Token
Client的Token Request的Response 是 JSON Response
能夠一併發Refresh Token
手機app/桌面app由於,客戶端驗證不可信,因此另有一套implicit grant flow。
具體見108頁的幻燈片。
自產自用的,Resource Owner Password Credentials Grant Flow
具體見148頁的幻燈片。
注意:須要Resource Owner高度信賴Client。能夠作系統內建的應用或官方應用程序。
不須要User, 只存取公開資料, Client Credentials Grant Flow 160頁
發生錯誤時的迴應方式171頁
拿到Token了,如何打API
(RFC6750 'Bearer token usage') . https://tools.ietf.org/html/rfc6750
發生錯誤時的迴應方式211
Token過時,換掉。 Token Refresh(217頁)
製造OAuth2 Provider的方法 =造Authorization Server (沒看)
第一次用rails+ grape api整合oauth2 就上手(244頁, 有詳細步驟)
- 用Devise生成User(Resource Owner)
- 用Doorkeeper蓋 Authorization Server
- 用Grape蓋API (Resource Server)
- 本身刻 Resource Server Guard 來鎖api
第2步驟:
rails g doorkeeper:install
rails g doorkeeper:migration
rails db:migrate
生成3個new tables
- oauth_application: 用於Clients 註冊
- oauth_access_grant: 用於儲存Auth Grant Codes
- oauth_access_token: 真正核發出去的Access Tokens,包含對應的Refresh Token
routes.rb
Doorkeeper 內建的4個部分:
- Authorization Endpoint 和 Token Endpoint
- Token Debug Endpoint (在implicit flow驗證token的真實性)
- Client Registration Interface(crud)
- User管理受權過的Clients的界面(可Revoke)
做者最後表示徹底弄懂的話,必須看HTML官方文檔。