要求 API 金鑰來保護 API

本頁內容適用於 ApigeeApigee Hybrid

查看 Apigee Edge 說明文件。

影片:歡迎觀看這部短片,瞭解如何保護 API 安全。

課程內容

本教學課程說明如何:

  • 建立需要 API 金鑰的 API Proxy。
  • 建立 API 產品、開發人員和開發人員應用程式。
  • 使用 API 金鑰呼叫 API。

請務必保護 API,防止他人在未經授權的情況下擅自存取。其中一種方式是使用 API 金鑰。

如果應用程式向設定為驗證 API 金鑰的 API Proxy 發出要求,就必須提供有效金鑰。在執行階段,Verify API Key 政策會檢查提供的 API 金鑰是否符合下列條件:

  • 有效
  • 未遭撤銷
  • 與公開所要求資源的 API 產品 API 金鑰相符

如果金鑰有效,系統就會允許要求。如果金鑰無效,要求會導致授權失敗。

建立 API Proxy

請按照下列步驟,使用 Apigee 使用者介面建立 API Proxy:

  1. 在 Google Cloud 控制台中,前往「Proxy 開發」>「API Proxy」頁面。

    前往 API Proxy

  2. 在 Google Cloud 窗格的專案挑選器中選取機構。機構名稱與 Google Cloud 專案名稱相同。
  3. 點選「+ 建立」
  4. 在「建立 Proxy」窗格的「Proxy template」下方,選取「Reverse proxy (Most common)」。反向 Proxy 會將傳入流量轉送至後端服務。
  5. 請按照下列步驟設定 Proxy:
    名稱
    Proxy 名稱 helloworld_apikey
    基本路徑

    /helloapikey

    專案基本路徑是網址的一部分,用於向 API Proxy 發出要求。

    說明 hello world protected by API key
    目標 (現有 API)

    http://mocktarget.apigee.net

    這會定義 Apigee 在對 API Proxy 發出要求時叫用的目標網址。這個目標只會回傳簡單的回應:Hello, Guest!

  6. 點選「下一步」
  7. 部署 (選用)。請將這些欄位留空。
  8. 點選「建立」
  9. Apigee 會建立新的 Proxy,並在「Proxy summary」窗格中顯示 Proxy 詳細資料摘要。

查看政策

如要查看政策,請按照下列步驟操作:

  1. 在「helloworld_apikey」Proxy 的「Proxy summary」窗格中,按一下「Develop」分頁標籤。
  2. 在「政策」選單中,按一下 「新增政策」
  3. 在「建立政策」窗格的「安全性」下方,選取「驗證 API 金鑰」
  4. 在「Verify API Key」窗格中,使用下列值填寫「Name」和「Display name」部分中的必填欄位:
    • 名稱:輸入政策名稱。例如:VerifyAPIKey
    • 顯示名稱:輸入要在使用者介面中使用的政策名稱。例如:Verify API Key
  5. 點選「建立」
  6. 按一下 即可新增其他政策。
  7. 在「建立政策」窗格的「中介服務」下方,選取「指派訊息」
  8. 在「Assign Message」窗格中,使用下列值填妥「Name」和「Display name」區段中的必填欄位:
    • 名稱:輸入政策名稱。例如:AssignMessage
    • 顯示名稱:輸入要在使用者介面中使用的政策名稱。例如:Assign Message
  9. 點選「建立」
  10. 下方 XML 程式碼中的 <APIKey> 元素,會指定傳入要求中 API 金鑰的位置。根據預設,這項政策會從 HTTP 要求中名為 apikey 的查詢參數擷取金鑰。
    <APIKey ref="request.queryparam.apikey" />

    名稱 apikey 是任意名稱,可以是包含 API 金鑰的任何屬性。

  11. 將「Assign Message」政策的內容更新為下列內容:
  12. <AssignMessage async="false" continueOnError="false" enabled="true" name="remove-query-param-apikey">
        <DisplayName>Remove Query Param apikey</DisplayName>
        <Remove>
            <QueryParams>
                <QueryParam name="apikey"/>
            </QueryParams>
        </Remove>
        <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
        <AssignTo createNew="false" transport="http" type="request"/>
    </AssignMessage>
  13. 新增 VerifyApiKeyRemove Query Param apikey 政策。
    1. 在「Proxy endpoints」選單中,按一下「Preflow」
    2. 在視覺化編輯器的「Request」窗格中,按一下 「Add policy step」
    3. 在「新增政策步驟」窗格中,選取「驗證 API 金鑰」
    4. 按一下「新增」。
    5. 在視覺化編輯器的「Request」窗格中,按一下 「Add policy step」
    6. 在「Add policy step」窗格中,選取「Remove Query Param apikey」
    7. 按一下「新增」。
  14. 按一下 [儲存]
  15. 將 Proxy 部署至環境:
    1. 點選「Deploy」(部署)
    2. 選取「修訂版本」和「環境」
    3. 點選「Deploy」(部署)
  16. 如要測試變更,請按照「 嘗試呼叫 API」一節的說明呼叫 API。

嘗試呼叫 API

在這個步驟中,您將直接向目標服務發出成功的 API 呼叫,然後向 API Proxy 發出不成功的呼叫,瞭解政策如何保護 API Proxy。

  1. 成功

    在網路瀏覽器中前往下列網址,這是 API Proxy 設定要將要求轉送至的目標服務,但您現在會直接存取該服務:

    http://mocktarget.apigee.net

    您應該會收到以下成功回應:Hello, Guest!

  2. 失敗

    現在嘗試呼叫 API Proxy:

    curl -v -k https://YOUR_ENV_GROUP_HOSTNAME/helloapikey

    其中 YOUR ENV_GROUP_HOSTNAME 是環境群組主機名稱。請參閱「 找出環境群組主機名稱」。

    如果沒有「驗證 API 金鑰」政策,這次呼叫會傳回與上次呼叫相同的回應。但在此情況下,您應該會收到下列錯誤回應:

    {"fault":{"faultstring":"Failed to resolve API Key variable request.queryparam.apikey","detail":{"errorcode":"steps.oauth.v2.FailedToResolveAPIKey"}}}

    這表示您未傳遞有效的 API 金鑰 (做為查詢參數)。

在後續步驟中,您將取得必要的 API 金鑰。

新增 API 產品

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

  1. 在 Google Cloud 控制台中,前往「發布」>「API 產品」頁面:

    前往 API 產品

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

如要進一步瞭解如何新增 API 產品,請參閱「 建立 API 產品」。

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

接下來,我們要模擬開發人員註冊使用 API 的工作流程。開發人員會有一或多個呼叫您 API 的應用程式,每個應用程式都會取得專屬 API 金鑰。API 供應商可以藉此更精細地控管 API 存取權,並取得更精細的應用程式 API 流量報表。

建立開發人員

如要使用 Apigee UI 建立開發人員:

  1. 在 Google Cloud 控制台中,前往「發布」>「開發人員」頁面:

    前往「開發人員」

  2. 點選「+ 建立」
  3. 在「新增開發人員」視窗中輸入下列資訊:
    欄位
    名字 Keyser
    姓氏 Soze
    電子郵件 keyser@example.com
    使用者名稱 keyser
  4. 按一下「新增」。

如要進一步瞭解如何建立開發人員,請參閱「 註冊應用程式開發人員」。

註冊應用程式

如要使用 Apigee UI 註冊開發人員應用程式,請按照下列步驟操作:

  1. 在 Google Cloud 控制台中,前往「Distribution」>「Apps」頁面:

    前往「應用程式」

  2. 點選「+ 建立」
  3. 在「建立應用程式」視窗中輸入下列資訊:
    欄位
    應用程式名稱 輸入:keyser_app
    顯示名稱 輸入:keyser_app
    開發人員 選取:Keyser Soze (keyser@example.com)
    回呼網址 留空
    附註 留空
  4. 在「憑證」部分中,按一下「新增憑證」
  5. 選取「永不」。這個應用程式的憑證永不過期。
  6. 按一下「新增產品」
  7. 選取剛建立的產品。
  8. 按一下「新增」。
  9. 點選「建立」

如要進一步瞭解如何註冊應用程式,請參閱「 註冊應用程式」。

取得 API 金鑰

如要使用 Apigee UI 取得 API 金鑰,請按照下列步驟操作:

  1. 在 Google Cloud 控制台,依序前往「Distribution」>「Apps」頁面。

    前往「應用程式」

  2. 從應用程式清單中選取所需應用程式。
  3. 在「查看應用程式」頁面,點選「憑證」下方的「金鑰」欄位旁的 。請注意,金鑰會與您建立的產品建立關聯。
  4. 按一下 「複製」。 您會在下一個步驟中使用這組金鑰。

使用金鑰呼叫 API

現在您已取得 API 金鑰,可以呼叫 API Proxy。如畫面所示,將 API 金鑰貼到查詢參數中。確認查詢參數中沒有多餘的空格。

curl -v -k https://YOUR_ENV_GROUP_HOSTNAME/helloapikey?apikey=YOUR_API_KEY

現在呼叫 API Proxy 時,您應該會收到以下回應:Hello, Guest!

恭喜!您已建立 API Proxy,並要求在呼叫中加入有效的 API 金鑰,藉此保護 Proxy。

請注意,一般而言,將 API 金鑰做為查詢參數傳遞並非良好做法。建議您改為在 HTTP 標頭中傳遞

最佳做法:在 HTTP 標頭中傳遞金鑰

在這個步驟中,您將修改 Proxy,在名為 x-apikey 的標頭中尋找 API 金鑰。

  1. 在 Google Cloud 控制台中,前往「Proxy 開發」>「API Proxy」頁面。
  2. 前往 API Proxy

  3. 從 Proxy 清單中選取所需 Proxy。
  4. 在「Proxy details」(Proxy 詳細資料) 頁面上,按一下「Develop」(開發)
  5. 修改政策 XML,讓政策在標頭中尋找,而不是在查詢參數中尋找:
  6. <APIKey ref="request.header.x-apikey"/>
  7. 按一下「儲存」儲存變更。
  8. 點選「Deploy」(部署)
  9. 選取「修訂版本」和「環境」
  10. 點選「Deploy」(部署)
  11. 使用 cURL 進行下列 API 呼叫,將 API 金鑰做為名為 x-apikey 的標頭傳遞。別忘了代入貴機構名稱。

    curl -v -H "x-apikey: YOUR_API_KEY" http://YOUR_ENV_GROUP_HOSTNAME/helloapikey

請注意,如要完全完成變更,您也需要設定「指派訊息」政策,移除標頭而非查詢參數。例如:

<Remove>
  <Headers>
      <Header name="x-apikey"/>
  </Headers>
</Remove>

相關主題

以下是與 API 產品和金鑰相關的主題:

API 保護通常需要額外的安全措施,例如 OAuth。這項開放通訊協定會將憑證 (例如使用者名稱和密碼) 換成存取權杖。存取權杖是隨機產生的長字串,可透過訊息管道傳遞,包括從一個應用程式傳遞到另一個應用程式,不會洩漏原始憑證。

如要瞭解安全性相關主題,請參閱「保護 Proxy 安全」。