官網這樣說...php
An open protocol to allow secure authorization in a simple and standard method from web, mobile and desktop applications.web
OAuth 1.0 協議過於複雜,易用性差,因此並無獲得普及,下文中給出了受權的流程圖,能夠簡單瞭解瞭解,如今不多有用的了。瀏覽器
OAuth Authentication Flow安全
關於OAuth 1.0, 想了解的能夠看看這些:服務器
OAuth 2.0是目前的最新版本,OAuth 2.0不兼容OAuth 1.0。這篇文章主要講講OAuth 2.0,並以此展開。網絡
先來講一個場景:好比你第一次打開簡書官網,想要註冊一個帳號。你會看到簡書容許你經過新浪微博帳號登錄。當你點擊以後,須要你登錄微博。以後會出現「是否贊成簡書獲取你的我的信息」等等,若是你選擇受權,以後會跳轉回簡書。你會發現你在簡書的用戶名就是你微博的用戶名。而後,你會發出一條新的微博好比「我加入了簡書,一個基於內容分享的社區!」(這只是舉個例子,不知道簡書有沒有這樣作)。app
好了,這回開始進入正題ide
OAuth 2.0 定義了四個角色:網站
資源擁有者(Resource Owner)
資源擁有者其實就是用戶(user),用戶將會受權一個第三方應用能夠獲取他們的帳戶資源。固然第三方應用程序對於用戶帳戶的操做是有限制的(好比,read access, read and write access)!這個限制就是用戶受權時給予的權限範圍(scope)
上面場景中,微博帳戶就是資源擁有者。read access就好比讀取微博用戶名,write access就好比以你的名義發了一個微博。spa
客戶端(Client)
客戶端就是前面說的第三方應用程序,他們想要獲取用戶的帳戶資源,但在這麼作以前必須通過受權
上面場景中,簡書就是客戶端
資源服務器(Resource Server)
資源服務器存放用戶帳戶以及帳戶信息和資源
上面場景中,新浪微博就是資源服務器,同時也是受權服務器
受權服務器(Authorization Server)
受權服務器驗證用戶身份,併爲第三方應用程序頒發受權令牌(access token)
資源服務器與受權服務器能夠是同一臺服務器,這裏分開主要是便於解釋清楚OAuth協議。從程序開發者的角度,這兩個都是service's API會執行的事情。
在瞭解完OAuth中的四個角色以後,咱們看看這四個角色之間是如何互動的。下面是基本運行流程。
Abstract Protocol Flow
對於一個應用程序來講,若是它想要使用OAuth,那麼首先它要在服務提供商那裏註冊。通常出如今網站的「developer」或者「API」部分。
應用程序要提供:
在用戶贊成受權(或者拒絕)以後,服務提供商會將用戶從新導向這個Callback URL,這個Callback URL要來負責處理受權碼或者訪問令牌。
應用程序註冊完成以後,服務提供商會頒發給應用程序一個「客戶端認證信息(client credentials)」。Client Credential包括:
OAuth 2.0 定義了四種受權模式:
Authorization Code Flow
第一步:客戶端把用戶代理定向到受權終端(Authorizaiton Endpoint)
https://www.example.com/v1/oauth/authorize?response_type=code&client_id=CLIENT_ID&redirect_uri=CALLBACK_URL&scope=read
第二步:用戶受權應用程序
用戶點擊上述URI以後,用戶首先要登錄,證實其身份。而後選擇贊成受權應用程序能夠訪問他們的帳戶或者拒絕。
是否容許簡書訪問你的微博帳戶
第三步:應用程序獲取受權碼
若是用戶贊成受權,服務提供商會將用戶代理重定向到第一步中的redirect_uri,而且會包含受權碼。
https://www.jianshu.com/callback?code=AUTHORIZATION_CODE
第四步:應用程序請求受權令牌
應用程序向API token終端發送剛剛得到的受權碼,以及認證信息。
https://www.example.com/v1/oauth/token?client_id=CLIENT_ID&client_secret=CLIENT_SECRET&grant_type=authorization_code&code=AUTHORIZATION_CODE&redirect_uri=CALLBACK_URL
URI中包括:
第五步:應用程序得到受權令牌
若是上一步驗證有效,API將返回一個HTTP回覆。
{"access_token":"ACCESS_TOKEN","token_type":"bearer","expires_in":2592000,"refresh_token":"REFRESH_TOKEN","scope":"read"}
HTTP回覆中包含:
Implicit Flow
第一步:客戶端把用戶代理定向到受權終端(Authorizaiton Endpoint)
https://www.example.com/authorize
token
而不是code
https://www.example.com/authorize?response_type=token&client_id=CLIENT_ID&redirect_uri=CALLBACK_URL&scope=read
第二步:用戶受權應用程序
用戶點擊上述URI以後,用戶首先要登錄,證實其身份。而後選擇贊成受權應用程序可訪問他們的帳戶或者拒絕。
是否容許簡書訪問你的微博帳戶
第三步:用戶代理收到受權令牌
假設用戶贊成受權,受權服務器重定向用戶代理到第一步提到的redirect_uri。並在URI fragment中包含受權令牌(但不能查看)。
https://www.example.com/callback#token=ACCESS_TOKEN
第四步:用戶代理向資源服務器發出請求
用戶代理依照重定向的指令,向資源服務器發出請求,但並不包含上一步中獲得的受權令牌(#後面的部分)。用戶代理將完整的重定向URI保存在本地。
第五步:資源服務器返回一個網頁
資源服務器會返回一個網頁(一般是一個HTML文件內嵌一段腳本)。這段內嵌的腳本(script)能夠訪問第三步中用戶代理保存在本地的完整的重定向URI,並從中提取受權令牌。
第六步:用戶代理提取受權令牌
用戶代理執行上面提到的腳本,提取出受權令牌。而後將受權令牌傳遞給應用程序。
Password Credentials Flow
第一步:用戶傳遞認證信息
用戶將用戶名和密碼交給應用程序。
第二步:應用程序請求受權令牌
https://www.example.com/token
password
,前面提到的兩種分別是code
和token
。https://www.example.com/token?grant_type=password&username=USERNAME&password=PASSWORD&client_id=CLIENT_ID
第三步:受權服務器返回受權令牌
若是用戶的認證信息獲得驗證,受權服務器將嚮應用程序返回受權令牌。
Client Credentials Flow
第一步:應用程序請求受權令牌
https://www.example.com/token
client_credentials
,前面提到的兩種分別是code
、token
和password
。https://www.example.com/token?grant_type=client_credentials&client_id=CLIENT_ID&client_secret=CLIENT_SECRET
第二步:受權服務器返回受權令牌
受權服務器驗證認證信息,嚮應用程序返回受權令牌。
Invalid Token Error
refresh_token
https://www.example.com/v1/oauth/token?grant_type=refresh_token&client_id=CLIENT_ID&client_secret=CLIENT_SECRET&refresh_token=REFRESH_TOKEN