OAuth
協議爲用戶資源的受權提供了一個安全又簡易的標準。與以往的受權方式不一樣之處是 OAuth
的受權不會使第三方觸及到用戶的賬號信息(如用戶名與密碼),即第三方無需使用用戶的用戶名與密碼就能夠申請得到該用戶資源的受權,所以 OAuth
是安全的。OAuth
是 Open Authorization
的簡寫html
OAuth
自己不存在一個標準的實現,後端開發者本身根據實際的需求和標準的規定實現。其步驟通常以下:json
token
) 任何身份認證,本質上都是基於對請求方的不信任所產生的。同時,請求方是信任被請求方的,例如用戶請求服務時,會信任服務方。因此,身份認證
就是爲了解決身份的可信任
問題。segmentfault
在OAuth2.0
中,簡單來講有三方:用戶(這裏是指屬於服務方的用戶
)、服務方(如微信、微博等)、第三方應用後端
code,AppID
等)步驟詳解:api
Authorization Request
, 第三方請求用戶受權Authorization Grant
,用戶贊成受權後,會從服務方獲取一次性用戶受權憑據(如code
碼)給第三方Authorization Grant
,第三方會把受權憑據以及服務方給它的的身份憑據(如AppId
)一塊兒交給服務方的向認證服務器申請訪問令牌 Access Token
,認證服務器覈對受權憑據等信息,確認無誤後,向第三方發送訪問令牌Access Token
等信息Access Token
,經過這個Access Token
向Resource Server
索要數據Protected Resource
,資源服務器使用令牌向認證服務器確認令牌的正確性,確認無誤後提供資源 這樣服務方,一能夠肯定第三方獲得了用戶對這次服務的受權(根據用戶受權憑據),二能夠肯定第三方的身份是能夠信任的(根據身份憑據),因此,最終的結果就是,第三方順利地從服務方獲取到了這次所請求的服務
從上面的流程中能夠看出,OAuth2.0
完整地解決了用戶、服務方、第三方 在某次服務時這三者之間的信任問題緩存
客戶端必須獲得用戶的受權(authorization grant
),才能得到令牌(access token
)。OAuth 2.0
定義了四種受權方式:安全
authorization code
)implicit
)resource owner password credentials
)client credentials
) 受權碼模式(authorization code
)是功能最完整、流程最嚴密的受權模式。它的特色就是經過客戶端的後臺服務器與"服務提供商"的認證服務器進行互動。服務器
它的步驟以下:微信
URI
,同時附上一個受權碼URI
,向認證服務器申請令牌。這一步是在客戶端的後臺的服務器上完成的,對用戶不可見URI
,確認無誤後,向客戶端發送訪問令牌(access token
)和更新令牌(refresh token
)等包含如下參數:app
如微信受權登陸,此ID是APPID
)示例:
GET /authorize?response_type=code&client_id=s6BhdRkqt3&state=xyz &redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1 HTTP/1.1 Host: server.example.com
對比網站應用微信登陸:請求CODE
https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
包含如下參數:
只能使用該碼一次
,不然會被受權服務器拒絕。該碼與客戶端ID和重定向URI,是一一對應關係。示例:
HTTP/1.1 302 Found Location: https://client.example.com/cb?code=SplxlOBeZQQYbYS6WxSbIA &state=xyz
包含如下參數:
示例:
POST /token HTTP/1.1 Host: server.example.com Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW Content-Type: application/x-www-form-urlencoded grant_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA &redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb
對比網站應用微信登陸:經過code獲取access_token
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
包含如下參數:
示例:
HTTP/1.1 200 OK Content-Type: application/json;charset=UTF-8 Cache-Control: no-store Pragma: no-cache { "access_token":"2YotnFZFEjr1zCsicMWpAA", "token_type":"example", "expires_in":3600, "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA", "example_parameter":"example_value" }
從上面代碼能夠看到,相關參數使用JSON格式發送(Content-Type: application/json
)。此外,HTTP頭信息中明確指定不得緩存。
對比網站應用微信登陸:返回樣例
{ "access_token":"ACCESS_TOKEN", "expires_in":7200, "refresh_token":"REFRESH_TOKEN", "openid":"OPENID", "scope":"SCOPE", "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL" }
若是用戶訪問的時候,客戶端的訪問令牌access_token
已通過期,則須要使用更新令牌refresh_token
申請一個新的訪問令牌。
客戶端發出更新令牌的HTTP請求,包含如下參數:
示例:
POST /token HTTP/1.1 Host: server.example.com Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW Content-Type: application/x-www-form-urlencoded grant_type=refresh_token&refresh_token=tGzv3JOkF0XG5Qx2TlKWIA
(完)