OAuth的英文全稱是Open Authorization,它是一種開放受權協議。OAuth目前共有2個版本,2007年12月的1.0版(以後有一個修正版1.0a)和2010年4月的2.0版,1.0版本存在嚴重安全漏洞,而2.0版解決了該問題。html
OAuth是令牌代替用戶密碼訪問應用的又一標準;其餘仍是有SSO;git
受權模式:github
一、受權碼模式(Authorization Code)(正統方式)(支持refresh token)web
二、受權碼簡化模式(Implicit)(爲web瀏覽器設計)(不支持refresh token)api
三、Pwd模式(Resource Owner Password Credentials) (基本不用)(支持refresh token)瀏覽器
四、Client模式(Client Credentials) (爲後臺api調用設計)(不支持refresh token)安全
五、擴展模式(Extension)(自定義模式,這個就不介紹了)服務器
一、OAuth2.0最典型的受權碼認證方式:微信
資源服務器和鑑權服務器都是屬於資源全部方,也就是最終的服務提供方,第三接入方須要先與鑑權服務器申請合做獲取客戶編碼。ui
對於資源服務器來講,須要作的是
一、 accessToken和clientId的校驗
二、 token校驗經過後要對token訪問權限作好限制
對於鑑權服務器來講,須要作的是
一、 接受第三方應用的申請,維護clientId
2 、提供登入頁面,作用戶、密碼鑑權
三、 受權碼生成和驗證
4 、token的生成
5 、clientId、token的維護,通常clientId入庫,token入內存
OAuth2.0解決的是經過令牌獲取某個系統的操做權限,由於有clientId的標識,一次登錄只能對該系統生效,第三方應用的操做用戶不是鑑權系統的官方用戶,受權權限鑑權中心能夠作限制。
二、受權碼簡化模式,省略了1中客戶端獲取code而後交換token的過程,受權訪問後頁面將被重定向到redirect_uri並帶有令牌
受權訪問:http://localhost:8080/oauth2/authorize?response_type=token&client_id=testid&redirect_uri=http://localhost/OAuth&scope=read
受權以後頁面將被重定向到redirect_uri並帶有令牌:http://localhost/OAuth/#access_token=111111111&token_type=bearer&expires_in=3600
三、Pwd模式請求格式:POST -D "http://localhost/oauth/token?grant_type=password&username=aaa&password=123456&scope=read,write"
服務器返回來的訪問令牌:
{ "access_token":"9cd23bef-ae56-46b0-82f5-b9a8f78da569", "token_type" : "bearer" , "expires_in" : 43199 , "scope" : "read" }
吃雞練習
在使用微信受權以前,吃雞遊戲須要先在微信開放平臺上註冊應用,填寫本身的名稱、logo、用途等信息,微信開放平臺頒發給吃雞遊戲一個應用 ID 和叫 APP Secret 的密鑰,在實際對接中,會使用到這兩個參數。
建立應用成功後就將得到應用 ClientId 和叫APP Secret 密鑰
如下是受權流程
一、用戶點擊登陸按鈕
二、頁面自動跳轉到初始參數中redirect_uri 定義的那個URL,並自動在 URL 末尾添加一個 code 參數
三、吃雞遊戲經過上一步獲取的 code 參數換取 Token,Token 就是前文中說到的信用憑證
要包含如下參數:
一、client_id:在微信開放平臺申請的應用 ID
二、client_secret:在微信開放平臺申請時提供的APP Secret
三、grant_type:須要填寫authorization_code
四、code:上一步得到的 code
五、redirect_uri:回調地址,須要與註冊應用裏的回調地址以及第一步的 redirect_uri 參數一致
四、經過第3步的請求,接口返回 Token 和相關數據:
{ "access_token": "ACCESS_TOKEN",//Token 的值 "expires_in": 1234,//過時時間 "uid":"122222"//當前受權用戶的UID。 }
五、在第4步中獲取了access_token ,使用它,就能夠去獲取用戶的資源了
六、最後一步,微信返回用戶信息,吃雞遊戲進行處理,整個流程結束。
經過以上的方式,在微信和吃雞遊戲中間創建了一個獨立的權限層,這個權限由用戶賦予,能夠被用戶隨時取消,不一樣第三方應用之間相互獨立,互不干擾,這樣就完全解決了明文存放帳號密碼的問題。
參考圖
注意:
一、code時效較短,多爲10s-10min,每次得到的code僅可以使用一次,且code與client_id和redirect_uri有 一一對應關係。
二、access token 有過時時間,多爲10-15天。(過時處理有2種,請求用戶從新受權/refreshToken,通常多用從新受權。)
三、在請求時,參數中包含重定向地址的,須要和第三方在受權方平臺報備時留的地址前部一致
參考: