Spring Security 與 OAuth2 介紹

來源:互聯網
上載者:User

標籤:操作   工作流程   多網站   緩衝   服務   authorize   系統   cli   返回   

個人 OAuth2 全部文章
  • Spring Security 與 OAuth2(介紹):https://www.jianshu.com/p/68f22f9a00ee
  • Spring Security 與 OAuth2(授權伺服器):https://www.jianshu.com/p/227f7e7503cb
  • Spring Security 與 OAuth2(資原始伺服器):https://www.jianshu.com/p/6dd03375224d
  • Spring Security 與 OAuth2(用戶端):https://www.jianshu.com/p/03e515c2b43f
  • Spring Security 與 OAuth2(相關類參考):https://www.jianshu.com/p/c2395772bc86
  • Spring Security 與 OAuth2(完整案例):https://www.jianshu.com/p/d80061e6d900

摘要:使用OAuth2 認證的好處就是你只需要一個帳號密碼,就能在各個網站進行訪問,而面去了在每個網站都進行註冊的繁瑣過程,如:很多網站都可以使用登入,網站作為第三方服務、作為服務提供者

OAuth2 角色
  • resource owner:資源所有者(指使用者)
  • resource server:資原始伺服器存放受保護資源,要訪問這些資源,需要獲得存取權杖(下面例子中的 Twitter 資原始伺服器)
  • client:用戶端代表請求資原始伺服器資源的第三方程式(下面例子中的 Quora)用戶端同時也可能是一個資原始伺服器
  • authrization server:授權伺服器用於發放存取權杖給用戶端(下面例子中的 Twitter 授權伺服器)
OAuth2 工作流程例子
  • 用戶端 Quora 將自己註冊到授權伺服器上
  • 使用者訪問 Quora 首頁,它顯示了各種登陸選項
  • 當使用者點擊使用 Twitter 登陸時,Quora 開啟一個新視窗,將使用者重新導向到 Twitter 的登陸頁面上
  • 在這個新視窗中,使用者使用他的帳號密碼登陸了 Twitter
  • 如果使用者之前未授權 Quora 應用程式使用他們的資料,則 Twitter 要求使用者授權 Quora 來訪問使用者資訊許可權,如果使用者已授權 Quora,此步驟則被跳過
  • 經過正確的身分識別驗證,Twitter 將使用者和一個身分識別驗證代碼重新導向到 Quora 的重新導向 URI
  • Quora 發送用戶端識別碼、用戶端令牌和身分識別驗證代碼到 Twitter
  • Twitter 驗證這些參數後,將存取權杖發送到 Quora
  • 成功擷取存取權杖後使用者被登陸到 Quora 上,使用者登入 Quora 後點擊他們的設定檔頁面
  • Quora 從 Twitter 資原始伺服器請求使用者的資源,並發送存取權杖
  • Twitter 資原始伺服器使用 Twitter 授權伺服器驗證存取權杖
  • 成功驗證存取權杖後,Twitter 資原始伺服器向 Quora 提供所需要的資源
  • Quora 使用這些資源,並最終顯示使用者的設定檔頁面
 OAuth2 授權模式(出自阮一峰OAuth2部落格)授權碼模式
  • 授權碼模式是功能最完整、流程最嚴密的授權模式,它的特點是通過用戶端的後台伺服器,與“伺服器提供”的證明伺服器進行互動
 9434708-a464c0c64ca6ee9a.png
  • 它的步驟如下:
    • (A)使用者訪問用戶端,後者將前者導向證明伺服器
    • (B)使用者選擇是否給予用戶端授權
    • (C)假設使用者給予授權,證明伺服器將使用者導向用戶端事先指定的“重新導向 URI”,同時附上一個授權碼
    • (D)用戶端收到授權碼,附上早先的“重新導向 URI”向證明伺服器申請令牌,這一步是在用戶端的後台伺服器上完成的,對使用者不可見
    • (E)證明伺服器核對了授權碼和重新導向URI,確認無誤後向用戶端發送令牌和更新令牌
  • 上述步驟中所需要的參數:
    • A步驟中,用戶端申請認證的 URI,包含以下參數:
      • repsone_type:授與類型,必選,此處固定值“code”
      • client_id:用戶端的ID,必選
      • client_secret:用戶端的密碼,可選
      • redirect_uri:重新導向URI,可選
      • scope:申請的許可權範圍,可選
      • state:用戶端當前的狀態,可以指定任意值,證明伺服器會原封不動的返回這個值
      GET /authorize?response_type=code&client_id=s6BhdRkqt3&state=xyz&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1Host: server.example.com
    • C步驟中,伺服器回應用戶端的URI,包含以下參數:
      • code:表示授權碼,必須按,該碼有效期間應該很短,通常10分鐘,用戶端只能使用一次,否則會被授權伺服器拒絕,該碼與用戶端識別碼 和 重新導向 URI 是一一對應關係
      • state:如果用戶端請求中包含著歌參數,證明伺服器的回應也必須一模一樣包含這個參數
      HTTP/1.1 302 FoundLocation: https://client.example.com/cb?code=SplxlOBeZQQYbYS6WxSbIA&state=xyz
    • D步驟中,用戶端向證明伺服器申請令牌的HTTP請求,包含以下參數:
      • grant_type:表示使用的授權模式,必選,此處固定值為“authorization_code”
      • code:表示上一步獲得的授權嗎,必選
      • redirect_uri:重新導向URI,必選,與步驟 A 中保持一致
      • client_id:表示用戶端ID,必選
      POST /token HTTP/1.1Host: server.example.comAuthorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JWContent-Type: application/x-www-form-urlencodedgrant_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb
    • E步驟中,證明伺服器發送的HTTP回複,包含以下參數:
      • access_token:表示令牌,必選
      • token_type:表示令牌類型,該值大小寫不敏感,必選,可以是 bearer 類型或 mac 類型
      • expires_in:表示到期時間,單位為秒,若省略該參數,必須設定其它到期時間
      • refresh_token:表示更新令牌,用來擷取下一次的存取權杖,可選
      • scope:表示許可權範圍
      HTTP/1.1 200 OK     Content-Type: application/json;charset=UTF-8     Cache-Control: no-store     Pragma: no-cache     {       "access_token":"2YotnFZFEjr1zCsicMWpAA",       "token_type":"example",       "expires_in":3600,       "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",       "example_parameter":"example_value"     }
    • 從上面代碼可以看到,參數使用 JSON 格式發送(Content-Type: application/json),才外,HTTP頭資訊中明確指定不得緩衝
簡化模式
  • 簡化模式不通過第三方應用程式的伺服器,直接在瀏覽器中向證明伺服器申請令牌,跳過了“授權碼”這個步驟
 bg2014051205.png
  • 它的步驟如下:
    • (A)用戶端將使用者導向證明伺服器
    • (B)使用者決定是否給予用戶端授權
    • (C)假設使用者給予授權,證明伺服器將使用者導向用戶端指定的“重新導向URI”,並在URI的Hash部分包含了存取權杖
    • (D)瀏覽器向資原始伺服器發出請求,其中不包括上一步收到的Hash值
    • (E)資原始伺服器返回一個網頁,其中包含了代碼可以擷取Hash值中的令牌
    • (F)瀏覽器執行上一步獲得的指令碼,取出令牌
    • (G)瀏覽器將令牌發給用戶端
  • 上述步驟中所需要的參數:
    • A步驟中,用戶端發出HTTP請求,包含以下參數:
      • response_type:表示授與類型,此處固定值為"token",必選
      • client_id:表示用戶端ID,必選
      • redirect_uri:表示重新導向URI,可選
      • scope:表示許可權範圍,可選
      • state:表示用戶端目前狀態,可指定任意值,證明伺服器會原封不動返回這個值
      GET /authorize?response_type=token&client_id=s6BhdRkqt3&state=xyz&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1Host: server.example.com
    • C步驟中,證明伺服器回應用戶端的URI,包含以下參數:
      • access_token:表示存取權杖,必選
      • token_type:表示令牌類型,該值大小寫不敏感,必選
      • expires_in:表示到期時間,單位為秒
      • scope:表示許可權範圍,如果與用戶端申請的範圍一致,可忽略
      • state:如果用戶端請求中包含這個參數,證明伺服器也要返回一模一樣的參數
      HTTP/1.1 302 FoundLocation: http://example.com/cb#access_token=2YotnFZFEjr1zCsicMWpAA&state=xyz&token_type=example&expires_in=3600
  • 上面例子中,證明伺服器用HTTP頭資訊的Location欄,指定瀏覽器重新導向的網址,注意,這個網址的Hash部分包含了令牌
  • 根據D步驟,下一步瀏覽器會訪問Location指定的網址,但是Hash部分不會被發送,接下來的E步驟,服務提供者的資原始伺服器發送過來的代碼,提取出Hash令牌
Cipher 模式
  • Cipher 模式中,使用者向用戶端提供自己的使用者名稱和密碼,用戶端使用這些資訊向“服務提供者”索要授權

  • 在這種模式中,使用者必須把密碼給用戶端,但用戶端不得儲存密碼,這通常在使用者對用戶端高端信任的情況下,比如用戶端是作業系統的一部分,由一個著名的公司出品,而證明伺服器只有在其它授權模式無法執行的情況下,才考慮該模式

 9434708-6165f69e2bfc8881.png
  • 它的步驟如下:
    • (A)使用者向用戶端提供使用者名稱和密碼
    • (B)用戶端將使用者名稱密碼發送認證給伺服器,向後者請求令牌
    • (C)證明伺服器確認無誤後,向用戶端提供存取權杖
  • 上述步驟中所需要的參數:
    • B步驟中,用戶端發出HTTP請求,包含以下參數:
      • grant_type:授與類型,必選,此處固定值“password”
      • username:表示使用者名稱,必選
      • password:表示使用者密碼,必選
      • scope:許可權範圍,可選
      POST /token HTTP/1.1 Host: server.example.com Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW Content-Type: application/x-www-form-urlencoded grant_type=password&username=johndoe&password=A3ddj3w
    • C步驟中,證明伺服器向用戶端發送存取權杖,下面是一個例子:
      HTTP/1.1 200 OK Content-Type: application/json;charset=UTF-8 Cache-Control: no-store Pragma: no-cache {   "access_token":"2YotnFZFEjr1zCsicMWpAA",   "token_type":"example",   "expires_in":3600,   "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",   "example_parameter":"example_value" }
用戶端模式
  • 用戶端模式指用戶端以自己名義,而不是使用者名稱義,向“服務提供者”進行認證,嚴格地說,用戶端模式不屬於OAuth架構要解決的問題,在這種模式中,使用者直接向用戶端註冊,用戶端以自己名義要求“服務提供者”提供服務
 bg2014051207.png
  • 它的步驟如下:
    -(A):用戶端向證明伺服器進行身份認證,並要求一個存取權杖
    -(B):證明伺服器確認無誤後,向用戶端提供存取權杖

  • 上述步驟中所需要的參數:

    • A步驟中,用戶端發出HTTP請求,包含以下參數:

      • granttype:表示授與類型,此處固定值為“clientcredentials”,必選
      • scope:表示許可權範圍,可選
       POST /token HTTP/1.1 Host: server.example.com Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW Content-Type: application/x-www-form-urlencoded grant_type=client_credentials
    • B步驟中,證明伺服器向用戶端發送存取權杖,下面是一個例子

       HTTP/1.1 200 OK Content-Type: application/json;charset=UTF-8 Cache-Control: no-store Pragma: no-cache {   "access_token":"2YotnFZFEjr1zCsicMWpAA",   "token_type":"example",   "expires_in":3600,   "example_parameter":"example_value" }
更新令牌
  • 如果使用者訪問的時候,用戶端“存取權杖”已經到期,則需要使用“更新令牌”申請一個新的令牌
  • 用戶端發出更新令牌請求,包含以下參數:
    • granttype:表示授權模式,此處固定值為“refreshtoken”,必選
    • refresh_token:表示早前收到的更新令牌,必選
    • scope:表示申請許可權範圍,不得超出上一次申請的範圍,若省略該參數,則表示與上一次一樣
     POST /token HTTP/1.1 Host: server.example.com Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW Content-Type: application/x-www-form-urlencoded grant_type=refresh_token&refresh_token=tGzv3JOkF0XG5Qx2TlKWIA


本文轉載自

林原

來源:簡書

連結:https://www.jianshu.com/p/68f22f9a00ee

Spring Security 與 OAuth2 介紹

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.