OAuth

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,通常多用從新受權。)

  三、在請求時,參數中包含重定向地址的,須要和第三方在受權方平臺報備時留的地址前部一致

參考:

  OAuth 2.0 的四種方式

  GitHub OAuth 第三方登陸示例教程

相關文章
相關標籤/搜索