1. 程式人生 > >OAuth2.0認證原理淺析

OAuth2.0認證原理淺析

一.OAuth是什麼?

        OAuth的英文全稱是Open Authorization,它是一種開放授權協議。OAuth目前共有2個版本,2007年12月的1.0版(之後有一個修正版1.0a)和2010年4月的2.0版,1.0版本存在嚴重安全漏洞,而2.0版解決了該問題,下面簡單談一下我對OAuth2.0的理解。

二.OAuth2.0有什麼用?

 

         引用一下OAuth2.0中文文件中的介紹:

            1.需要第三方應用儲存資源所有者的憑據,以供將來使用,通常是明文密碼。

            2.需要伺服器支援密碼身份認證,儘管密碼認證天生就有安全缺陷。

            3.第三方應用獲得的資源所有者的受保護資源的訪問許可權過於寬泛,從而導致資源所有者失去對資源使用時限或使用範圍的控制。

            4.資源所有者不能僅撤銷某個第三方的訪問許可權而不影響其它,並且,資源所有者只有通過改變第三方的密碼,才能單獨撤銷這第三方的訪問許可權。

            5.與任何第三方應用的讓步導致對終端使用者的密碼及該密碼所保護的所有資料的讓步。

        簡單概括,就是用於第三方在使用者授權下調取平臺對外開放介面獲取使用者相關資訊。

         OAuth引入了一個授權環節來解決上述問題。第三方應用請求訪問受保護資源時,資源伺服器在獲准資源使用者授權後,會向第三方應用頒發一個訪問令牌(AccessToken)。該訪問令牌包含資源使用者的授權訪問範圍、授權有效期等關鍵屬性。第三方應用在後續資源訪問過程中需要一直持有該令牌,直到使用者主動結束該次授權或者令牌自動過期。

 

 

三.OAuth2.0有哪幾種授權模式?

    授權碼模式(Authorization Code)(正統方式)(支援refresh token)
    授權碼簡化模式(Implicit)(為web瀏覽器設計)(不支援refresh token)
    Pwd模式(Resource Owner Password Credentials) (基本不用)(支援refresh token)
    Client模式(Client Credentials) (為後臺api呼叫設計)(不支援refresh token)
    擴充套件模式(Extension)(自定義模式,這個就不介紹了)

    

   1.授權碼模式(第四小結詳解,此處略過)

   2.授權碼簡化模式

            授權訪問:

                            http://localhost:8080/oauth2/oauth/authorize?     response_type=token&client_id=testid&redirect_uri=http://localhost/OAuth&scope=read


            之後接受訪問,該頁面將被重定向到重定向URI並帶有令牌:

                             http://localhost/OAuth/#access_token=KCIS89HFUE7SGE62&token_type=bearer&expires_in=3600

 

   3.Pwd模式

            請求格式:

                POST -D "&grant_type=password&username=babala&password=kkk1234&scope=read,write" 

                 http://localhost/oauth/token

            伺服器返回來的訪問令牌:
             {
              "access_token":"9cd23bef-ae56-46b0-82f5-b9a8f78da569",
              "token_type" : "bearer" ,
              "expires_in" : 43199 ,
              "scope" : "read"
            }

   4.Client模式

            請求格式:
POST   -D  "&client_id=appid&grant_type=client_credentials&client_secret=appkey"  http://localhost/OAuth/token

            伺服器返回來的訪問令牌:
            {
              "access_token":"4e56e9ec-2f8e-46b4-88b1-5d06847909ad", 
              "token_type": "bearer” ,
              "refresh_token":"7e14c979-7039-49d0-9c5d-854efe7f5b38",
              "expires_in": 36133 ,
              "scope": "read,write"
            }

 

四.詳解OAuth2.0的授權碼簡化模式?


        簡單概括,就是用於第三方在使用者授權下調取平臺對外開放介面獲取使用者相關資訊。

        有三個關鍵字:第三方,使用者,平臺,關係如下圖。

        

        看起來很簡單對吧,其實授權的部分,要比上圖展示的複雜一丟丟,下面來講解一下授權的部分。

        首先,有個問題,就拿微博平臺來說吧,不能說隨便一個第三方過來要求申請使用者資源,微博平臺就去使用者那問一句是否授予許可權吧,微博大哥能這麼隨便?所以第三方需要去想要請求的介面所在平臺去報備一下,也就是告訴平臺:我的xxx地址想要申請使用你的介面,可以嗎?等平臺稽核通過之後,會下發一組appid+appkey,第三方持憑此就有資格去請求該平臺的介面了。

        第三方的準備工作做好了,下面就是具體運作流程了。(各大平臺大多使用授權碼模式——Authorization Code,因為它相比其它幾種模式更為嚴謹,這裡我僅分析一下該模式的原理)

        這裡我們假設一個場景,就是想用‘雲列印’來列印自己‘微博的關注列表’。

簡圖如下:

 

詳圖如下:

        在第②,④,⑥,⑧步中,分別用到了雲列印在微博平臺上獲得的appid+appkey。關於每一步請求所需要的一系列引數這裡就不一一列舉了,官方文件非常詳細,這裡僅說明一下請求code和請求access token時重要的引數。

        第④步引數:

                      response_type:指授權型別,必選,這裡填固定值‘code’

                      client_id:指客戶端id,必選,這裡填在平臺報備時獲取的appid

                      redirect_uri:指重定向URI,可選

                      scope:指申請的許可權範圍,可選

                      state:指客戶端當前狀態,可選,若填了,則認證伺服器會原樣返回該值

 

        第⑥步引數:

                      grant_type:指使用哪種授權模式,必選,這裡填固定值‘authorization_code’

                      code:指從第⑤步獲取的code,必選

                      redirect_uri:指重定向URI,必選,這個值需要和第④步中的redirect_uri保持一致

 

                      client_id:指客戶端id,必選,這裡填在平臺報備時獲取的appid

                      client_secret:指客戶端金鑰,必選,這裡填在平臺報備時獲取的appkey

 

        第⑧步引數:

                      access_token:指訪問令牌,必選,這裡填第⑦步獲取的access_token

                      token_type:指令牌型別,必選,大小寫不敏感,bearer型別 / mac型別

                      expires_in:指過期時間,單位秒,當其他地方已設定過期時間,此處可省略該引數

                      refresh_token:指更新令牌,可選,用即將過期token換取新token

                      scope:指許可權範圍,可選,第④步中若已申請過某許可權,此處可省略該引數

 

到這裡,OAuth2.0 授權碼模式的認證過程就完成了,原理還算比較簡單,就是較為繁瑣,但是不算難。

 

注意:1.code時效較短,多為10s-10min,每次獲得的code僅可使用一次,且code與client_id和redirect_uri有 一一對應關係。

          2.access token 有過期時間,多為10-15天。(過期處理有2種,請求使用者重新授權/refreshToken,一般多用重新授權。)

          3.在請求時,引數中包含重定向地址的,需要和第三方在授權方平臺報備時留的地址前部一致

          4.關於token_type的兩種型別有什麼區別,有個部落格寫的很詳細,推薦閱讀:www.cnblogs.com/XiongMaoMengNan/p/6785155.html

此處奉上找了好久才找到的OAuth2 RFC6749中文翻譯:http://colobu.com/2017/04/28/oauth2-rfc6749/

參考文件:http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html