### 概述
* OAuth是open authorization(開放式授權) 的縮寫. 2.0是它的第二個版本.
* 官方解釋 : OAuth協議為用戶資源的授權提供了一個安全的,開放而又簡易的標準.與以往的授權方式不同之處是OAuth的授權不會使第三方觸及要用戶的賬號信息(如用戶名與密碼) , 即第三方無需使用用戶的用戶名與密碼就可以申請該用戶資源的授權,因此OAuth是安全的.
* 自我理解 : 企鵝公司為QQ號的用戶資源提供了一個授權的協議.它讓第三方的網站或者是應用在不知道用戶的QQ賬號和密碼的情況下也能知道用戶是否輸入正確的QQ號和密碼來登錄他們的網站. 如下圖 ,在使用QQ登錄的時候注意看url, 它的地址是QQ服務器的OAUTH授權地址. 在這里登錄QQ后,慕課網在不知道用戶的賬號的密碼的情況下就能獲得用戶的信息.

* 在整個使用QQ號登錄的過程總共有三個角色參與到其中 . 分別是用戶 , 慕課網和騰訊的QQ OAUTH服務器. 最開始是用戶訪問了慕課網,并使用了登錄表單中的使用QQ進行登錄, 隨后慕課網請求了騰訊的OAUTH服務器登錄頁, 隨后用戶在此頁面輸入QQ號和登錄密碼,需要注意的是用戶輸入的QQ賬號和密碼始終是在QQ的OAUTH頁面上完成的,這個頁面是不屬于慕課網的. 隨便QQ的OAUTH服務器會檢驗用戶輸入的QQ賬號和密碼是否正確并且把結果反饋給慕課網,這個結果中并不包括用戶的QQ號和密碼,只是告訴用戶是否登錄成功.最后慕課網接收到用戶登錄成功之后,慕課網會把用戶登錄狀態切換為登錄成功.

* 這么做有什么好處呢 ? 不需要注冊新的賬號,這樣會非常麻煩, 在使用QQ登錄慕課網的情況下并不用擔心QQ賬號和密碼有安全問題. 對網站的好處就是,用戶非常的懶,使用第三方授權登錄使應用新增一個用戶變得非常簡易.
* OAUTH協議的版本 : 1.0發布于2007年末,但是1.0版本存在一個非常嚴重的安全漏洞.2010年發布了2.0版本,解決了這個安全漏洞.
### 應用場景
* 其實OAUTH并不僅僅是使用第三方登錄而已( QQ用戶授權慕課網使用其QQ賬號相關的信息).
* 獲取授權后,在符合權限規則的情況下訪問各種API. 比如一鍵分享課程. 在注冊了淘寶的賬號后可以使用阿里旗下各個應用的產品并一鍵登錄,難道阿里旗下的所有產品里面都重復的存儲了用戶表么 ? 并不是這樣的. 這里也是使用了OAUTH,OAUTH可以開發給其他應用使用,也可以給該公司內部使用.因為OAUTH只是一個服務器,只要遵循它的協議就可以在任何地方使用.
### OAuth授權流程
#### 三個重要步驟
1. 請求OAuth登錄頁 : 官方稱為 **request token URL - 未授權的令牌請求服務地址 ( 就是慕課網請求QQ登錄頁面時使用的帶有特定參數的URL** . 注意這個特定的,因為除了慕課網之外其他站點也都使用了QQ的開放平臺,我們在使用前需要到QQ的開放平臺先去注冊,提交一份申請的材料,說明一下站點的描述,接入域名,和回調地址. QQ開放平臺會給申請的應用分配一個APPID 和 APPKEY.這個APPID和APPKEY是唯一的,類似用戶名和密碼, 每一個申請接入的應用都會拿到一個APPID和APPKEY . 如下圖慕課網請求QQ開放平臺的 URL ,第一行是QQ開放平臺的服務的地址,所有的第三方網站在拼接request token URL都會使用這個地址. 而第二行的client_id就是對應APPID,QQ開放服務器可以通過這個client_ID可以判斷是哪一個站點在請求使用QQ開放平臺,這個應用是否已經申請使用QQ開放平臺. 而redirect_URL就是一個回調地址, 慕課網在提交申請材料的時候就會把這個回調地址預留給QQ開放平臺.服務端回去對比相應的APPID預留的地址和這個拼接的地址是否相同 ). https://graph.qq.com/oauth2.0/show?which=Login&display=pc&**client_id**=**100490398**&response_type=code&scope=get_user_info&**redirect_uri=http%3A%2F%2Fpassport.mukewang.com%2Fuser%2Ftpcallback%3Freferer%3Dhttps%3A%2F%2Fwww.imooc.com%26browser_key%3D411dbbec8d330a5b4721671028d00aa6%26tp%3Dqq%26bind%3D0**

2. 用戶使用QQ號登錄并授權 : 如果賬號和密碼未通過,直接并OAUTH服務器拒絕并讓我們重新登錄 . 如果用戶登錄成功之后就會使用到上面的redirect_URL , 就是告訴QQ的OAUTH服務器,當用戶登錄成功后跳轉到上面地方去. 并且在跳轉的時候會在URL上加上一個加密的參數CODE , 當URL跳轉到慕課網指定的地址后,我們就是用通過$_GET['code']來獲取到這個參數 .
3. 返回登錄結果 : 在上圖中返回登錄結果只畫了一個箭頭,在實際中是有個一來一回的步驟 . 在步驟2中重定向的地址中加了一個code參數,第三方應用有了這個code參數后就說明可以確定登錄是成功的 . 有了這個步驟還不夠, 如果在拿到這個code后就可以允許用戶進行操作就會比較危險. 如果被心懷不軌的人拿到這個code就會出事. 為了確保這個code被合法的第三方服務器拿到這里需要慕課網的服務器再次請求一個URL地址**User Authorization URL(用戶授權的令牌請求服務地址** : 就是說用戶QQ登授權之后需要請求的一個帶有**特定參數的URL**(前面那個是用戶未授權的, 這個是用戶已經授權的,這個地址無法看到(如下) ,client_id和client_secret 就是申請下來的APPID和APPKEY . 最后再拼接上拿到的這個code ,需要注意的是這個code的有效時間很短,最短只有5秒鐘,如果超時的話,QQ開放平臺會認為不安全并拒絕請求.多了這個一來一回的交互,QQ開放平臺的服務器確認了第三方網站是否合法.在請求這個URL之前慕課網并不知道是誰進行了授權操作,在請求了這個URL之后就會得到一個響應信息,這個響應信息就包含了這個QQ用戶的信息,慕課網就可以把這些信息寫入用戶表中,隨之code也失效了,也就是說這個code是在有效時間內可以使用,并且只可以使用一次的字符串 . 這個響應數據里面還包含一個很重要的數據叫做access token,token 是用戶發給第三方網站的令牌,第三方應用就可以以用戶的身份去操作一些開放平臺允許它進行的操作 ,比如分享 .)).

### access toen 與 refresh token
令牌的作用類似 虎符令牌 , 軍隊只認令牌不認人. 有了這個token就可以使用相API了 . 出于安全的考慮,一般都使用POST方式. OAuth的服務器會驗證鏈接中的access token是否合法,如果合法,就把相關的數據打包成json或者xml返回給用戶 .

用戶拿到數據之后再進行具體的操作 .

### 生命周期
具有較長聲明周期(10天半個月甚至更長) , 如果access token 過期了, 那么久進行重新登錄. 第二種方式就是拼接User Authorization URL 的時候指定 need_refresh_token = true ,帶上一個布爾型參數 , 指明在響應的數據中需要一個刷新令牌. 每個平臺命名不一樣. 當access token 快過期的時候使用這個refresh token 獲取新的access token . 一般這個功能在使用定時任務的時候用的情況比較多. 比如定時發布QQ說說. 這個refresh token 也是有聲明周期的,但是一般時間更長,半年或1年.

- PHP加密技術
- md5加密
- Crypt加密
- 函數
- 概述
- 強類型參數
- 可變參數列表
- 值傳遞&引用傳遞
- 變量作用域
- 可變函數
- 嵌套函數
- 遞歸函數
- 匿名函數(閉包)
- 面向對象
- 概念
- 類
- 對象的傳值
- 對象的克隆
- 構造方法
- 析構方法
- 克隆方法
- $this
- 類常量
- 靜態屬性
- 靜態方法
- 繼承
- 重寫
- 重載
- 概述
- 屬性重載
- 概述
- __set()
- __get()
- __unset()
- __isset()
- 方法重載
- 概述
- __call()
- __callstatic()
- 封裝
- 最終類
- 抽象類
- 接口
- 對象的序列化與反序列化
- __sleep()
- __wakeup()
- 其他魔術方法
- 對象的遍歷
- 類和對象相關函數
- 錯誤
- 概述
- 設置錯誤級別
- trigger_error()觸發錯誤
- 處理PHP中的錯誤
- 異常
- 概述
- 自定義異常類
- 自定義文件寫入異常類
- 記錄和發送異常信息
- 使用觀察者模式處理異常信息
- 自定義異常處理器
- 設計模式
- 創建型
- 單例模式
- 工廠模式
- 原型模式
- 結構型
- 注冊樹模式
- 適配器模式
- 數據映射模式
- 裝飾器模式
- 代理模式
- 行為型
- 策略模式
- 觀察者模式
- 迭代器模式
- 網絡
- cURL
- Oauth2.0
- QQ第三方登錄
- TCP/IP協議
- 概述
- HTTP協議
- 概述
- HTTP請求協議
- HTTP響應協議
- WebSocket
- 安裝擴展
- Redis
- Socket
- 計算機通信
- socket簡介
- PHP操作socket
- TCP
- HTTP服務端
- WebSocket
- PHP7
- 生成器yield
- 異常finally
- CGI和FPM
- php有用命令
- 內存