近期把OAuth系統學習一下,并完成了授權碼模式的PHP實現,此篇文章主要介紹OAuth相關知識,分享一些參考資料。
OAuth
OAuth是一個關于授權(authorization)的開放網絡標準,在全世界得到廣泛應用,目前的版本是2.0版。
系統角色
(1) Third-party application:第三方應用程序,本文中又稱"客戶端"(client),即上一節例子中的"云沖印"。
(2)HTTP service:HTTP服務提供商,本文中簡稱"服務提供商",即上一節例子中的Google。
(3)Resource Owner:資源所有者,本文中又稱"用戶"(user)。
(4)User Agent:用戶代理,本文中就是指瀏覽器。
(5)Authorization server:認證服務器,即服務提供商專門用來處理認證的服務器。
(6)Resource server:資源服務器,即服務提供商存放用戶生成的資源的服務器。它與認證服務器,可以是同一臺服務器,也可以是不同的服務器。
運行流程
運行流程
客戶端的授權模式
客戶端必須得到用戶的授權(authorization grant),才能獲得令牌(access token)。OAuth 2.0定義了四種授權方式。
- 授權碼模式(authorization code)
- 簡化模式(implicit)
- 密碼模式(resource owner password credentials)
- 客戶端模式(client credentials)
如何選擇適合的授權模式
授權模式選擇
- 授權碼模式:第三方WEB應用常用模式,用戶登錄三方應用,獲得臨時授權code, 第三方應用通過code換取access_token ,訪問資源服務器。
- 簡化模式: 基于瀏覽器認證,可以用在瀏覽器單頁應用。
- 客戶端模式:客戶端直接獲取授權,與用戶無關,一般用于API認證
- 密碼模式:用戶把用戶名和密碼發送給第三方應用,第三方應用拿著用戶名和密碼去授權服務器校驗。第三方應用和授權服務器是同一家公司或者是非常可信的大公司。
授權碼模式
開發流程
- 搭建認證服務器(Authorization server)
GET /authorize?response_type=code&client_id=s6BhdRkqt3&state=xyz
&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1
參數解釋:
- response_type:表示授權類型,此處的值固定為"token",必選項。
- client_id:表示客戶端的ID,必選項。
- redirect_uri:表示重定向的URI,可選項。
- scope:表示權限范圍,可選項。
- state:表示客戶端的當前狀態,可以指定任意值,認證服務器會原封不動地返回這個值。
用戶認證成功,重定向到 redirect_uri 網頁,攜帶code
HTTP/1.1 302 Found
Location: https://client.example.com/cb?code=SplxlOBeZQQYbYS6WxSbIA
&state=xyz
客戶端像認證服務器換取 access_token
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
2.搭建資源服務器(Resource serve)
POST /api/user HTTP/1.1
Host: server.example.com
access_token=2YotnFZFEjr1zCsicMWpAA
注意事項
- 應用ID申請:第三方應用程序需要向認證服務器提供商申請,需要填寫應用的名稱,回調地址,返回client_id和client_secret
- 用戶登錄過程:認證服務器必須實現一種登錄認證方式,可以是登錄頁,也可以通過HTTP Basic等方式。
- redirect_uri: 回調地址必須和申請應用填寫保持一致。
- state:通常做法是將stata和用戶會話綁定,在申請token時攜帶客戶端身份,可以用于防止跨站請求攻擊(CSRF),認證服務器也可以強制要求客戶端攜帶state
OAuth2的PHP類庫
- oauth2-server-php
- league/oauth2-server
- laravel/passport
- authbucket/oauth2-symfony-bundle
-
https://github.com/Filsh/yii2-oauth2-server 這個類庫已經很久不更新了,不推薦適用,可以使用
bshaffer/oauth2-server-php