###Open Authorizationjson
是——標準受權協議後端
解決——之前使用的受權方法容易形成信息泄露,不安全,須要不向第三方泄漏數據,容許第三方訪問服務器中的數據瀏覽器
作什麼——給第三方客戶端有時效的token,第三方拿token令牌訪問資源安全
經常使用於——第三方登陸bash
傳統受權方式:服務器
複製資源擁有者的憑據直接使用app
向用戶索要憑據dom
開發者密鑰,萬能鑰匙學習
特殊密碼令牌ui
1.Client 客戶端 (使用受保護資源的API)
2.Resource Owner資源擁有者
3.Authorization Server 受權服務器
4.Resource Server 資源服務器
5.User Agent 用戶代理,瀏覽器
我去銀行ATM機取錢爲例子
我就是resource owner
銀行的金庫就是resource server
ATM機子是client
我輸入密碼以後驗證我帳號密碼對不對的服務器是authorization server
ATM機內嵌的系統是user agent
+--------+ +---------------+
| |--(A)- Authorization Request ->| Resource |
| | | Owner |
| |<-(B)-- Authorization Grant ---| |
| | +---------------+
| |
| | +---------------+
| |--(C)-- Authorization Grant -->| Authorization |
| Client | | Server |
| |<-(D)----- Access Token -------| |
| | +---------------+
| |
| | +---------------+
| |--(E)----- Access Token ------>| Resource |
| | | Server |
| |<-(F)--- Protected Resource ---| |
+--------+ +---------------+
複製代碼
Authorization Code Flow受權碼模式
服務器與客戶端配合
1.用戶訪問客戶端,選擇第三方登陸
2.客戶端重定向到受權服務器,並攜帶client_id
GET {Authorization Endpoint}
?response_type=code // - Required
&client_id={Client ID} // - Required
&redirect_uri={Redirect URI} // - Conditionally required
&scope={Scopes} // - Optional
&state={Arbitrary String} // - Recommended
&code_challenge={Challenge} // - Optional
&code_challenge_method={Method} // - Optional
HTTP/1.1
HOST: {Authorization Server}
複製代碼
示例:
https://your_domain/login?
response_type=code& // response_type爲code時表示是受權碼請求
client_id=your_app_client_id& //客戶端id
redirect_uri=your_callback_url //經過客戶端註冊的重定向 URI
複製代碼
3.用戶確認受權(Authentication),客戶端被重定向到給定的URI,並攜帶code
HTTP/1.1 302 Found
Location: {Redirect URI}
?code={Authorization Code} // - Always included
&state={Arbitrary String} // - Included if the authorization
// request included 'state'.
複製代碼
示例:
https://www.example.com/?code=95157e76-7f22-40b7-81f6-77b27be91f19
複製代碼
4.重定向過程當中,客戶端拿到code,client_id,client_serect請求令牌,若是成功,去資源服務器獲取資源
token request:
POST {Token Endpoint} HTTP/1.1
Host: {Authorization Server}
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code // - Required
&code={Authorization Code} // - Required
&redirect_uri={Redirect URI} // - Required if the authorization
// request included 'redirect_uri'.
&code_verifier={Verifier} // - Required if the authorization
// request included
// 'code_challenge'.
複製代碼
5.客戶端拿到token後,就能夠請求資源了
token response:
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache
{
"access_token": "{Access Token}", // - Always included
"token_type": "{Token Type}", // - Always included
"expires_in": {Lifetime In Seconds}, // - Optional
"refresh_token": "{Refresh Token}", // - Optional
"scope": "{Scopes}" // - Mandatory if the granted
// scopes differ from the
// requested ones.
}
複製代碼
Implicit Flow 隱式模式
用於移動應用程序或者Web應用程序
直接在瀏覽器中請求token,沒有受權碼
要求用戶受權應用程序,而後受權服務器將訪問令牌傳回給用戶代理,用戶代理將其傳遞給客戶端
1.用戶訪問客戶端,選擇第三方登陸
2.客戶端重定向到受權服務器,發起請求
GET {Authorization Endpoint}
?response_type=token // - Required
&client_id={Client ID} // - Required
&redirect_uri={Redirect URI} // - Conditionally required
&scope={Scopes} // - Optional
&state={Arbitrary String} // - Recommended
HTTP/1.1
HOST: {Authorization Server}
複製代碼
https://your_domain/login?response_type=token&client_id=your_app_client_id&redirect_uri=your_callback_url
複製代碼
3.受權服務器響應給用戶代理,其中包含access_token
HTTP/1.1 302 Found
Location: {Redirect URI}
#access_token={Access Token} // - Always included
&token_type={Token Type} // - Always included
&expires_in={Lifetime In Seconds} // - Optional
&state={Arbitrary String} // - Included if the request
// included 'state'.
&scope={Scopes} // - Mandatory if the granted
// scopes differ from the
// requested ones.
複製代碼
4.用戶代理提取轉發令牌token給客戶端
5.客戶端拿到token請求資源信息
Resource Owner Password credentials Flow 密碼模式
用戶把帳號密碼直接提供給客戶端
客戶端不能存儲密碼,對客戶端高度信任的狀況下,其餘受權模式沒法使用的狀況下
https://oauth.example.com/token?grant_type=password&
username=USERNAME&
password=PASSWORD&
client_id=CLIENT_ID
複製代碼
{
"access_token" : "",
"token_type" : "",
"expires_in" : "",
"refresh_token" : "",
}
複製代碼
Client Credentials 客戶端模式。 適用於後端API的操做
這種模式只須要提供 client_id
和 client_secret
便可獲取受權。通常用於後端 API 的相關操做。
https://oauth.example.com/token?
grant_type=client_credentials&
client_id=CLIENT_ID&
client_secret=CLIENT_SECRET
複製代碼
Refresh Token Flow
訪問時token過時,則須要更新令牌獲取新的令牌
客戶端發出更新令牌的HTTP請求,包含如下參數:
OAuth2: www.oauth.com/oauth2-serv… www.ory.sh/oauth2-for-… medium.com/@darutk/dia… medium.com/@darutk/ful…