OAuth2.0初體驗

問就是學習使人開心

###Open Authorizationjson

  • 是——標準受權協議後端

  • 解決——之前使用的受權方法容易形成信息泄露,不安全,須要不向第三方泄漏數據,容許第三方訪問服務器中的數據瀏覽器

  • 作什麼——給第三方客戶端有時效的token,第三方拿token令牌訪問資源安全

  • 經常使用於——第三方登陸bash

  • 傳統受權方式:服務器

    ​ 複製資源擁有者的憑據直接使用app

    ​ 向用戶索要憑據dom

    ​ 開發者密鑰,萬能鑰匙學習

    ​ 特殊密碼令牌ui

角色

1.Client 客戶端 (使用受保護資源的API)

2.Resource Owner資源擁有者

3.Authorization Server 受權服務器

4.Resource Server 資源服務器

5.User Agent 用戶代理,瀏覽器

我去銀行ATM機取錢爲例子

我就是resource owner

銀行的金庫就是resource server

ATM機子是client

我輸入密碼以後驗證我帳號密碼對不對的服務器是authorization server

ATM機內嵌的系統是user agent

受權流程

+--------+                               +---------------+
     |        |--(A)- Authorization Request ->|   Resource    |
     |        |                               |     Owner     |
     |        |<-(B)-- Authorization Grant ---|               |
     |        |                               +---------------+
     |        |
     |        |                               +---------------+
     |        |--(C)-- Authorization Grant -->| Authorization |
     | Client |                               |     Server    |
     |        |<-(D)----- Access Token -------|               |
     |        |                               +---------------+
     |        |
     |        |                               +---------------+
     |        |--(E)----- Access Token ------>|    Resource   |
     |        |                               |     Server    |
     |        |<-(F)--- Protected Resource ---|               |
     +--------+                               +---------------+
複製代碼

受權模式

  • Authorization Code Flow受權碼模式

    服務器與客戶端配合

    1.用戶訪問客戶端,選擇第三方登陸

    2.客戶端重定向到受權服務器,並攜帶client_id

    GET {Authorization Endpoint}
      ?response_type=code             // - Required
      &client_id={Client ID}          // - Required
      &redirect_uri={Redirect URI}    // - Conditionally required
      &scope={Scopes}                 // - Optional
      &state={Arbitrary String}       // - Recommended
      &code_challenge={Challenge}     // - Optional
      &code_challenge_method={Method} // - Optional
      HTTP/1.1
    HOST: {Authorization Server}
    複製代碼

    示例:

    https://your_domain/login?
    response_type=code&             // response_type爲code時表示是受權碼請求
    client_id=your_app_client_id&   //客戶端id
    redirect_uri=your_callback_url   //經過客戶端註冊的重定向 URI
    複製代碼

    3.用戶確認受權(Authentication),客戶端被重定向到給定的URI,並攜帶code

    HTTP/1.1 302 Found
    Location: {Redirect URI}
      ?code={Authorization Code}  // - Always included
      &state={Arbitrary String}   // - Included if the authorization
                                  // request included 'state'.
    複製代碼

    示例:

    https://www.example.com/?code=95157e76-7f22-40b7-81f6-77b27be91f19
    複製代碼

    4.重定向過程當中,客戶端拿到code,client_id,client_serect請求令牌,若是成功,去資源服務器獲取資源

    token request:

    POST {Token Endpoint} HTTP/1.1
    Host: {Authorization Server}
    Content-Type: application/x-www-form-urlencoded
    grant_type=authorization_code  // - Required
    &code={Authorization Code}     // - Required
    &redirect_uri={Redirect URI}   // - Required if the authorization
                                   // request included 'redirect_uri'.
    &code_verifier={Verifier}      // - Required if the authorization
                                   // request included
                                   // 'code_challenge'.
    複製代碼

    5.客戶端拿到token後,就能夠請求資源了

    token response:

    HTTP/1.1 200 OK
    Content-Type: application/json;charset=UTF-8
    Cache-Control: no-store
    Pragma: no-cache
    {
      "access_token": "{Access Token}",    // - Always included
      "token_type": "{Token Type}",        // - Always included
      "expires_in": {Lifetime In Seconds}, // - Optional
      "refresh_token": "{Refresh Token}",  // - Optional
      "scope": "{Scopes}"                  // - Mandatory if the granted
                                           // scopes differ from the
                                           // requested ones.
    }
    複製代碼
  • Implicit Flow 隱式模式

    用於移動應用程序或者Web應用程序

    直接在瀏覽器中請求token,沒有受權碼

    要求用戶受權應用程序,而後受權服務器將訪問令牌傳回給用戶代理,用戶代理將其傳遞給客戶端

    1.用戶訪問客戶端,選擇第三方登陸

    2.客戶端重定向到受權服務器,發起請求

    GET {Authorization Endpoint}
      ?response_type=token          // - Required
      &client_id={Client ID}        // - Required
      &redirect_uri={Redirect URI}  // - Conditionally required
      &scope={Scopes}               // - Optional
      &state={Arbitrary String}     // - Recommended
      HTTP/1.1
    HOST: {Authorization Server}
    複製代碼
    https://your_domain/login?response_type=token&client_id=your_app_client_id&redirect_uri=your_callback_url
    複製代碼

    3.受權服務器響應給用戶代理,其中包含access_token

    HTTP/1.1 302 Found
    Location: {Redirect URI}
      #access_token={Access Token}       // - Always included
      &token_type={Token Type}           // - Always included
      &expires_in={Lifetime In Seconds}  // - Optional
      &state={Arbitrary String}          // - Included if the request
                                         //   included 'state'.
      &scope={Scopes}                    // - Mandatory if the granted
                                         //   scopes differ from the
                                         //   requested ones.
    複製代碼

    4.用戶代理提取轉發令牌token給客戶端

    5.客戶端拿到token請求資源信息

  • Resource Owner Password credentials Flow 密碼模式

    用戶把帳號密碼直接提供給客戶端

    客戶端不能存儲密碼,對客戶端高度信任的狀況下,其餘受權模式沒法使用的狀況下

    https://oauth.example.com/token?grant_type=password&
    username=USERNAME&
    password=PASSWORD&
    client_id=CLIENT_ID
    
    複製代碼
    { 
      "access_token"  : "",
      "token_type"    : "",
      "expires_in"    : "",
      "refresh_token" : "",
    }
    複製代碼
  • Client Credentials 客戶端模式。 適用於後端API的操做

    這種模式只須要提供 client_idclient_secret 便可獲取受權。通常用於後端 API 的相關操做。

    https://oauth.example.com/token?
    grant_type=client_credentials&
    client_id=CLIENT_ID&
    client_secret=CLIENT_SECRET
    
    複製代碼
  • Refresh Token Flow

    訪問時token過時,則須要更新令牌獲取新的令牌

    客戶端發出更新令牌的HTTP請求,包含如下參數:

    • granttype:表示使用的受權模式,固定爲"refresh*token"
    • refresh_token:表示早前收到的更新令牌
    • scope:表示申請的受權範圍,不能夠超出上一次申請的範圍,若是省略,則表示與上一次一致。

學習連接

OAuth2: www.oauth.com/oauth2-serv… www.ory.sh/oauth2-for-… medium.com/@darutk/dia… medium.com/@darutk/ful…

相關文章
相關標籤/搜索