使用 OAuth 保護 API

您目前查看的是 Apigee Edge 說明文件。
前往 Apigee X 說明文件
info

課程內容

  • 下載並部署範例 API Proxy。
  • 建立受 OAuth 保護的 API Proxy。
  • 建立產品、開發人員和應用程式。
  • 交換憑證以取得 OAuth 存取權杖。
  • 使用存取權杖呼叫 API。

本教學課程說明如何使用 OAuth 2.0 保護 API。

OAuth 是一種授權通訊協定,可讓應用程式代表使用者存取資訊,使用者不必透露使用者名稱和密碼。

OAuth 會將安全憑證 (例如使用者名稱/密碼或金鑰/密鑰) 換成存取權杖。例如:

joe:joes_password (username:password) 或
Nf2moHOASMJeUmXVdDhlMbPaXm2U7eMc:unUOXYpPe74ZfLEb (key:secret)

會變成類似下列內容:

b0uiYwjRZLEo4lEu7ky2GGxHkanN

存取權杖是隨機字串,而且是暫時性的 (應在相對較短的時間後失效),因此在應用程式工作流程中傳遞存取權杖來驗證使用者,比傳遞實際憑證安全得多。

OAuth 2.0 規格定義了不同的機制 (稱為「授權類型」),可供應用程式發布存取權杖。OAuth 2.0 定義的最基本授權類型稱為「用戶端憑證」。在這種授權類型中,系統會產生 OAuth 存取權杖,以換取用戶端憑證 (即用戶端金鑰/用戶端密鑰配對,如上例所示)。

Edge 中的用戶端憑證授權類型是透過 API Proxy 中的政策實作。典型的 OAuth 流程包含兩個步驟:

  • 呼叫 API Proxy 1,從用戶端憑證產生 OAuth 存取權杖。API Proxy 上的 OAuth v2.0 政策會處理這項作業。
  • 呼叫 API Proxy 2,在 API 呼叫中傳送 OAuth 存取權杖。API Proxy 會使用 OAuth v2.0 政策驗證存取權杖。

軟硬體需求

  • Apigee Edge 帳戶。如果還沒有帳戶,請按照「建立 Apigee Edge 帳戶」一文中的指示註冊。
  • 電腦上已安裝 cURL,可從指令列發出 API 呼叫。

下載及部署權杖產生 API Proxy

在這個步驟中,您將建立 API Proxy,從 API 呼叫中傳送的用戶端金鑰和消費者密鑰產生 OAuth 存取權杖。Apigee 提供可執行這項操作的範例 API Proxy。您現在要下載及部署 Proxy,稍後在教學課程中會用到。(您可以輕鬆自行建構這個 API Proxy。(下載及部署步驟是為了方便起見,並向您展示分享已建立的 Proxy 有多麼容易。)

  1. 將「oauth」範例 API Proxy ZIP 檔下載至檔案系統的任何目錄。
  2. 前往 https://apigee.com/edge 並登入。
  3. 在左側導覽列中,依序選取「開發」>「API Proxy」
  4. 按一下「+ Proxy」
    「建立 Proxy」按鈕
  5. 在「建立 Proxy」精靈中,按一下「上傳 Proxy 套裝組合」
  6. 選擇您下載的 oauth.zip 檔案,然後按一下「下一步」
  7. 點選「建立」
  8. 建構完成後,按一下「編輯 Proxy」,即可在 API Proxy 編輯器中查看新的 Proxy。
  9. 在 API Proxy 編輯器的「總覽」頁面中,按一下「部署」下拉式選單,然後選取「測試」。這是貴機構的測試環境。

    在確認提示中,按一下「Deploy」
    再次點選「部署作業」下拉式選單時,綠色圖示會指出 Proxy 已部署至測試環境。

太棒了!您已成功下載並將存取權杖產生 API Proxy 部署至 Edge 機構。

查看 OAuth 流程和政策

讓我們進一步瞭解 API Proxy 包含哪些內容。

  1. 在 API Proxy 編輯器中,點按「Develop」分頁標籤。左側的「Navigator」Navigator窗格會顯示兩項政策。您也會在「Proxy Endpoints」部分看到兩個 POST 流程。
  2. 按一下 Proxy Endpoints 下方的「AccessTokenClientCredential」AccessTokenClientCredential

    在 XML 程式碼檢視畫面中,您會看到名為 AccessTokenClientCredentialFlow

    <Flow name="AccessTokenClientCredential">
        <Description/>
        <Request>
            <Step>
                <Name>GenerateAccessTokenClient</Name>
            </Step>
        </Request>
        <Response/>
        <Condition>(proxy.pathsuffix MatchesPath "/accesstoken") and (request.verb = "POST")</Condition>
    </Flow>

    流程是 API Proxy 中的處理步驟。在這種情況下,工作流程會在符合特定條件時觸發 (稱為條件式工作流程)。<Condition> 元素中定義的條件表示,如果 API Proxy 呼叫是針對 /accesstoken 資源發出,且要求動詞為 POST,則執行 GenerateAccessTokenClient 政策,產生存取權杖。

  3. 現在來看看條件式流程會觸發的政策。按一下流程圖中的「GenerateAccessTokenClient」GenerateAccessTokenClient政策圖示。

    下列 XML 設定會載入程式碼檢視畫面:

    <OAuthV2 name="GenerateAccessTokenClient">
        <!-- This policy generates an OAuth 2.0 access token using the client_credentials grant type -->
        <Operation>GenerateAccessToken</Operation>
        <!-- This is in millseconds, so expire in an hour -->
        <ExpiresIn>3600000</ExpiresIn>
        <SupportedGrantTypes>
            <!-- This part is very important: most real OAuth 2.0 apps will want to use other
             grant types. In this case it is important to NOT include the "client_credentials"
             type because it allows a client to get access to a token with no user authentication -->
            <GrantType>client_credentials</GrantType>
        </SupportedGrantTypes>
        <GrantType>request.queryparam.grant_type</GrantType>
        <GenerateResponse/>
    </OAuthV2>

    設定包括下列項目:

    • <Operation> 可以是多個預先定義的值之一,用於定義政策的用途。在本例中,政策會產生存取權杖。
    • 權杖會在產生 1 小時 (3600000 毫秒) 後失效。
    • <SupportedGrantTypes> 中,預期使用的 OAuth <GrantType>client_credentials (以 OAuth 權杖交換用戶端金鑰和密鑰)。
    • 第二個 <GrantType> 元素會根據 OAuth 2.0 規格,告知政策要在 API 呼叫中的哪個位置尋找授權類型參數。(稍後您會在 API 呼叫中看到這個值)。授權類型也可以在 HTTP 標頭 (request.header.grant_type) 中傳送,或是以表單參數 (request.formparam.grant_type) 的形式傳送。

目前您不需要對 API Proxy 採取任何其他行動。在後續步驟中,您會使用這個 API Proxy 產生 OAuth 存取權杖。但首先,您需要完成下列事項:

  • 建立您實際要使用 OAuth 保護的 API Proxy。
  • 再建立幾個構件,產生用戶端金鑰和密鑰,以便換取存取權杖。

建立受 OAuth 保護的 API Proxy

關於「mocktarget」

mocktarget 服務代管於 Apigee,並會傳回簡單資料。事實上,您可以使用網路瀏覽器存取這項服務。如要試用,請按一下下列連結:

http://mocktarget.apigee.net/ip

目標會傳回您最終呼叫這個 API Proxy 時應會看到的內容。

您也可以前往 http://mocktarget.apigee.net/help,查看 mocktarget 中提供的其他 API 資源。

現在要建立您想保護的 API Proxy。這是會傳回所需內容的 API 呼叫。在本例中,API Proxy 會呼叫 Apigee 的 mocktarget 服務,傳回您的 IP 位址。但只有在 API 呼叫中傳遞有效的 OAuth 存取權杖,您才能看到這項資訊。

您在此建立的 API Proxy 會包含一項政策,用於檢查要求中是否有 OAuth 權杖。

  1. 在左側導覽列中,依序選取「開發」>「API Proxy」
  2. 按一下「+ Proxy」
    「建立 Proxy」按鈕
  3. 在「Build a Proxy」(建立 Proxy) 精靈中,選取「Reverse proxy (most common)」(反向 Proxy (最常見)),然後按一下「Next」(下一步)
  4. 使用下列項目設定 Proxy:
    在這個欄位中 請按照下列步驟操作:
    Proxy 名稱 輸入:helloworld_oauth2
    專案基本路徑

    變更為:/hellooauth2

    專案基本路徑是向 API Proxy 提出要求時所用網址的一部分。

    現有 API

    輸入:https://mocktarget.apigee.net/ip

    這會定義 Apigee Edge 在對 API Proxy 發出要求時,所叫用的目標網址。

    說明 輸入:hello world protected by OAuth
  5. 點選 [下一步]。
  6. 在「Common policies」(一般政策) 頁面中:
    在這個欄位中 請按照下列步驟操作:
    安全性:授權 選取「OAuth 2.0」
  7. 點選 [下一步]。
  8. 在「虛擬主機」頁面中,按一下「下一步」
  9. 在「Build」(建構) 頁面中,確認已選取 test 環境,然後按一下「Create and Deploy」(建立及部署)
  10. 在「摘要」頁面中,您會看到確認訊息,指出新的 API Proxy 已成功建立,且已部署至測試環境。
  11. 按一下「編輯 Proxy」,即可顯示 API Proxy 的「總覽」頁面。
    請注意,這次 API Proxy 會自動部署。按一下「部署」下拉式選單,確認「測試」環境旁有綠色的部署點。

查看政策

讓我們進一步瞭解您建立的內容。

  1. 在 API Proxy 編輯器中,點按「Develop」分頁標籤。您會看到兩個政策已新增至 API Proxy 的要求流程:
    • 驗證 OAuth v2.0 存取權杖:檢查 API 呼叫,確保存在有效的 OAuth 權杖。
    • 移除授權標頭:AssignMessage 政策會在存取權杖通過檢查後移除權杖,避免權杖傳遞至目標服務。(如果目標服務需要 OAuth 存取權杖,您就不會使用這項政策)。
  2. 在流程檢視畫面中,按一下「Verify OAuth v2.0 Access Token」圖示,然後查看程式碼窗格中下方的 XML。

    <OAuthV2 async="false" continueOnError="false" enabled="true" name="verify-oauth-v2-access-token">
        <DisplayName>Verify OAuth v2.0 Access Token</DisplayName>
        <Operation>VerifyAccessToken</Operation>
    </OAuthV2>

    請注意,<Operation>VerifyAccessToken。「Operation」定義政策應執行的動作。在本例中,這項動作會在要求中檢查有效的 OAuth 權杖。

新增 API 產品

如要使用 Apigee UI 新增 API 產品,請按照下列步驟操作:

  1. 選取「發布」>「API 產品」
  2. 按一下「+ API 產品」
  3. 輸入 API 產品的產品詳細資料
    欄位 說明
    名稱 API 產品的內部名稱。名稱中不得包含特殊字元。
    注意:API 產品建立完成後,您就無法編輯名稱。例如:helloworld_oauth2-Product
    顯示名稱 API 產品的顯示名稱,顯示名稱會顯示在使用者介面中,而且隨時可以編輯。如未指定,系統會使用「名稱」值。系統會使用「名稱」值自動填入這個欄位,您可以編輯或刪除其內容。顯示名稱可以包含特殊字元。例如 helloworld_oauth2-Product
    說明 API 產品說明。
    環境 API 產品允許存取的環境。選取您部署 API Proxy 的環境。例如 test
    存取權 選取「公開」
    自動核准存取要求 針對任何應用程式,啟用這個 API 產品的金鑰要求自動核准功能。
    配額 在本教學課程中,請忽略這項錯誤。
    允許的 OAuth 範圍 在本教學課程中,請忽略這項錯誤。
  4. 在「API proxies」(API Proxy) 欄位中,選取您剛建立的 API Proxy。
  5. 在「路徑」欄位中輸入「/」。忽略其他欄位。
  6. 按一下 [儲存]

在機構中新增開發人員和應用程式

接下來,您要模擬開發人員註冊使用 API 的工作流程。 理想情況下,開發人員會透過開發人員入口網站自行註冊,並註冊自己的應用程式。不過,在這個步驟中,您會以管理員身分新增開發人員和應用程式。

開發人員會有一或多個呼叫您 API 的應用程式,每個應用程式都會取得專屬的用戶端金鑰和消費者密碼。API 提供者也能透過這項機制,更精細地控管 API 存取權,並取得更精細的 API 流量數據分析報表,因為 Edge 知道哪些開發人員和應用程式屬於哪些 OAuth 權杖。

建立開發人員

我們來建立名為 Nigel Tufnel 的開發人員。

  1. 在選單中依序選取「發布」>「開發人員」
  2. 按一下「+ 開發人員」
  3. 在「New Developer」(新增開發人員) 視窗中輸入下列資訊:
    在這個欄位中 Enter 鍵
    名字 Nigel
    姓氏 Tufnel
    使用者名稱 nigel
    電子郵件 nigel@example.com
  4. 點選「建立」

註冊應用程式

現在為 Nigel 建立應用程式。

  1. 依序選取「發布」>「應用程式」
  2. 按一下「+ 應用程式」
  3. 在「New App」(新增應用程式) 視窗中輸入下列內容:
    在這個欄位中 請按照下列步驟操作:
    「名稱」和「顯示名稱」 輸入:nigel_app
    開發人員 按一下「開發人員」,然後選取:Nigel Tufnel (nigel@example.com)
    回呼網址附註 留空
  4. 在「產品」下方,按一下「新增產品」
  5. 選取「helloworld_oauth2-Product」
  6. 點選「建立」

取得用戶端金鑰和密鑰

現在您會取得用戶端金鑰和密鑰,這些金鑰和密鑰會換取 OAuth 存取權杖。

  1. 確認系統顯示 nigel_app 頁面。如果沒有,請前往「應用程式」頁面 (依序點選「發布」>「應用程式」),然後點選「nigel_app」nigel_app
  2. 在 nigel_app 頁面中,按一下「Key」和「Secret」欄中的「Show」。請注意,金鑰/密鑰與先前自動建立的「helloworld_oauth2-Product」相關聯。

  3. 選取並複製金鑰和密鑰。將這些內容貼到臨時文字檔中。您會在後續步驟中使用這些憑證,呼叫 API Proxy,將這些憑證換成 OAuth 存取權杖。

嘗試呼叫 API 來取得 IP 位址 (失敗!)

為了好玩,請嘗試呼叫應該會傳回 IP 位址的受保護 API Proxy。在終端機視窗中執行下列 cURL 指令,並替換 Edge 機構名稱。網址中的 test 是貴機構的測試環境,也就是您部署 Proxy 的環境。Proxy 基礎路徑為 /hellooauth2,與您建立 Proxy 時指定的基礎路徑相同。請注意,您並未在呼叫中傳遞 OAuth 存取權杖。

curl https://ORG_NAME-test.apigee.net/hellooauth2

由於 API Proxy 具有「Verify OAuth v2.0 Access Token」政策,會檢查要求中是否有有效的 OAuth 權杖,因此呼叫應會失敗,並顯示下列訊息:

{"fault":{"faultstring":"Invalid access token","detail":{"errorcode":"oauth.v2.InvalidAccessToken"}}}

在這種情況下,失敗是好事!這表示您的 API Proxy 安全性更高。只有具備有效 OAuth 存取權杖的信任應用程式,才能成功呼叫這個 API。

取得 OAuth 存取權杖

現在我們來看看成果。您即將使用複製並貼到文字檔的金鑰和密鑰,換取 OAuth 存取權杖。現在要對匯入的 API 範例 Proxy oauth 發出 API 呼叫,產生 API 存取權杖。

使用該金鑰和密碼,發出下列 cURL 呼叫 (請注意,通訊協定為 https),並在指定位置代入您的 Edge 機構名稱、金鑰和密碼:

curl -X POST -H "Content-Type: application/x-www-form-urlencoded" \
"https://ORG_NAME-test.apigee.net/oauth/client_credential/accesstoken?grant_type=client_credentials" \
-d "client_id=CLIENT_KEY&client_secret=CLIENT_SECRET"

請注意,如果您使用 Postman 等用戶端發出呼叫,client_idclient_secret 會放在要求主體中,且必須為 x-www-form-urlencoded

您應該會收到類似下面的回應:

{
  "issued_at" : "1466025769306",
  "application_name" : "716bbe61-f14a-4d85-9b56-a62ff8e0d347",
  "scope" : "",
  "status" : "approved",
  "api_product_list" : "[helloworld_oauth2-Product]",
  "expires_in" : "3599", //--in seconds
  "developer.email" : "nigel@example.com",
  "token_type" : "BearerToken",
  "client_id" : "xNnREu1DNGfiwzQZ5HUN8IAUwZSW1GZW",
  "access_token" : "GTPY9VUHCqKVMRB0cHxnmAp0RXc0",
  "organization_name" : "myOrg",
  "refresh_token_expires_in" : "0", //--in seconds
  "refresh_count" : "0"
}

您已取得 OAuth 存取權杖!複製 access_token 值 (不含引號),然後貼到文字檔。您稍後會用到。

發生什麼事了?

還記得您先前在 oauth Proxy 中查看的條件流程嗎?該流程會判斷資源 URI 是否為 /accesstoken 且要求動詞為 POST,如果是,則執行 GenerateAccessTokenClient OAuth 政策來產生存取權杖。您的 cURL 指令符合這些條件,因此系統執行了 OAuth 政策。系統已驗證您的用戶端金鑰和用戶端密鑰,並將其換成 1 小時後過期的 OAuth 權杖。

使用存取權杖呼叫 API (成功!)

取得存取權杖後,您就可以使用該權杖呼叫 API Proxy。發出下列 cURL 呼叫。替換 Edge 機構名稱和存取權杖。

curl https://ORG_NAME-test.apigee.net/hellooauth2 -H "Authorization: Bearer TOKEN"

您現在應該可以成功呼叫 API Proxy,並傳回 IP 位址。範例如下:

{"ip":"::ffff:192.168.14.136"}

您可以在將近一小時內重複呼叫該 API,之後存取權杖就會過期。如要在一小時後撥打電話,請按照先前的步驟產生新的存取權杖。

恭喜!您已建立 API Proxy,並要求呼叫時必須包含有效的 OAuth 存取權杖,藉此保護 Proxy。

相關主題