實作用戶端憑證授權類型

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

使用用戶端憑證授權類型時,應用程式會將自己的憑證 (用戶端 ID 和用戶端密鑰) 傳送至 Apigee Edge 上設定的端點,以產生存取權杖。如果憑證有效,Edge 會將存取權杖傳回給用戶端應用程式。

關於這個主題

本主題將概略說明 OAuth 2.0 用戶端憑證授權類型,並討論如何在 Apigee Edge 上實作這項流程。

用途

通常在應用程式也是資源擁有者時,會使用這類授權類型。舉例來說,應用程式可能需要存取後端雲端儲存服務,以儲存及擷取用於執行工作的資料,而非使用者擁有的資料。這類授權類型流程嚴格來說只會發生在用戶端應用程式和授權伺服器之間。使用者不會參與這類授權流程。

角色

角色會指定參與 OAuth 流程的「行為者」。我們快速概略介紹一下用戶端憑證角色,協助說明 Apigee Edge 的適用範圍。如要完整瞭解 OAuth 2.0 角色,請參閱 IETF OAuth 2.0 規格

  • 用戶端應用程式:需要存取使用者受保護資源的應用程式。通常使用這個流程時,應用程式會在伺服器上執行,而不是在使用者筆電或裝置的本機執行。
  • Apigee Edge:在此流程中,Apigee Edge 是 OAuth 授權伺服器。其角色是產生存取權杖、驗證存取權杖,以及將受保護資源的授權要求傳遞至資源伺服器。
  • 資源伺服器:後端服務,用於儲存受保護的資料,用戶端應用程式必須取得存取權才能存取這些資料。如果您要保護 Apigee Edge 上代管的 API Proxy,Apigee Edge 也是資源伺服器。

程式碼範例

您可以在 GitHub 找到 用戶端憑證授權類型的工作範例實作。如需更多範例的連結,請參閱下方的「其他資源」。

流程圖

下圖顯示用戶端憑證流程,其中 Apigee Edge 是授權伺服器。一般來說,Edge 也是這個流程中的資源伺服器,也就是 API Proxy 是受保護的資源。


用戶端憑證流程的步驟

以下摘要說明實作用戶端憑證程式碼授權類型時的必要步驟,其中 Apigee Edge 會做為授權伺服器。請注意,使用這個流程時,用戶端應用程式只會提供用戶端 ID 和用戶端密鑰,如果有效,Apigee Edge 就會傳回存取權杖。

先決條件:用戶端應用程式必須向 Apigee Edge 註冊,才能取得用戶端 ID 和用戶端密鑰。詳情請參閱「註冊用戶端應用程式」。

1. 用戶端要求存取權杖

如要取得存取權杖,用戶端會將 API 呼叫 POST 至 Edge,並附上從已註冊的開發人員應用程式取得的用戶端 ID 和用戶端密鑰值。此外,grant_type=client_credentials 參數必須以查詢參數的形式傳遞。(不過,您可以設定 OAuthV2 政策,在要求標頭或主體中接受這個參數,詳情請參閱 OAuthV2 政策)。

例如:

$ curl -i -H 'Content-Type: application/x-www-form-urlencoded' -X POST 'https://docs-test.apigee.net/oauth/accesstoken' -d 'grant_type=client_credentials&client_id=ns4fQc14Zg4hKFCNaSzArVuwszX95X&client_secret=ZIjFyTsNgQNyxI'

注意:雖然您可以如上所示,將 client_id 和 client_secret 值當做查詢參數傳遞,但建議您將這些值當做 Base64 網址編碼字串,傳遞至 Authorization 標頭。如要執行這項操作,您必須使用 base64 編碼工具或公用程式,將這兩個值連同分隔兩者的半形冒號一起編碼。如下所示: aBase64EncodeFunction(clientidvalue:clientsecret)。因此,上述範例會編碼如下:

result = aBase64EncodeFunction(ns4fQc14Zg4hKFCNaSzArVuwszX95X:ZIjFyTsNgQNyxI) // Note the colon separating the two values.

上述字串經過 base64 編碼後,會產生以下結果: bnM0ZlFjMTRaZzRoS0ZDTmFTekFyVnV3c3pYOTVYOlpJakZ5VHNOZ1FOeXhJOg==

接著,請發出類似下列的權杖要求:

$ curl -i -H 'Content-Type: application/x-www-form-urlencoded' -X POST 'https://docs-test.apigee.net/oauth/accesstoken' -d 'grant_type=client_credentials' -H 'Authorization: Basic bnM0ZlFjMTRaZzRoS0ZDTmFTekFyVnV3c3pYOTVYOlpJakZ5VHNOZ1FOeXhJOg=='

2. Edge 會驗證憑證

請注意,API 呼叫會傳送至 /accesstoken 端點。這個端點已附加政策,可驗證應用程式的憑證。也就是說,這項政策會比較提交的金鑰與 Apigee Edge 在註冊應用程式時建立的金鑰。如要進一步瞭解 Edge 的 OAuth 端點,請參閱「設定 OAuth 端點和政策」。

3. Edge 傳回回覆

如果憑證沒問題,Edge 會將存取權杖傳回給用戶端。否則會傳回錯誤。

4. 用戶端呼叫受保護的 API

現在,用戶端可以透過有效的存取權杖呼叫受保護的 API。在這個情境中,要求會傳送至 Apigee Edge (Proxy),而 Edge 負責驗證存取權杖,然後再將 API 呼叫傳遞至目標資源伺服器。如需範例,請參閱下方的「呼叫受保護的 API」。

設定流程和政策

Edge 會做為授權伺服器,處理存取權杖的要求。身為 API 開發人員,您需要建立具有自訂流程的 Proxy,以處理權杖要求,並新增及設定 OAuthV2 政策。本節說明如何設定該端點。

自訂流程設定

如要說明 API Proxy 流程的設定方式,最簡單的方法就是顯示 XML 流程定義。以下是設計用來處理存取權杖要求的 API Proxy 流程範例。舉例來說,當要求傳入且路徑後置字串與 /accesstoken 相符時,系統會觸發 GetAccessToken 政策。如要快速瞭解建立這類自訂流程的必要步驟,請參閱「設定 OAuth 端點和政策」。

<Flows>
  <Flow name="GetAccessToken">
         <!-- This policy flow is triggered when the URI path suffix
         matches /oauth/accesstoken. Publish this URL to app developers 
         to use when obtaining an access token using an auth code   
         -->
    <Condition>proxy.pathsuffix == "/oauth/accesstoken"</Condition>
    <Request>
        <Step><Name>GetAccessToken</Name></Step>
    </Request>
  </Flow>
</Flows>

使用政策設定流程

您需要將政策附加至端點,如下所示。如要快速瞭解將 OAuthV2 政策新增至 Proxy 端點的步驟,請參閱「設定 OAuth 端點和政策」。

取得存取權杖

這項政策與 /accesstoken 路徑相關。這項政策會使用 OAuthV2,並指定 GenerateAccessToken 作業。

<OAuthV2 name="GetAccessToken">
  <Operation>GenerateAccessToken</Operation>
  <ExpiresIn>3600000</ExpiresIn>
  <SupportedGrantTypes>
    <GrantType>client_credentials</GrantType>
  </SupportedGrantTypes>
  <GenerateResponse/>
</OAuthV2>

取得存取權杖的 API 呼叫是 POST,且包含 Authorization 標頭,其中含有 base64 編碼的 client_id + client+secret 和查詢參數 grant_type=client_credentials。也可以包含範圍和狀態的選用參數。例如:

$ curl -i -H 'Content-Type: application/x-www-form-urlencoded' -X POST 'https://docs-test.apigee.net/oauth/accesstoken' -d 'grant_type=client_credentials' -H 'Authorization: Basic c3FIOG9vSGV4VHo4QzAySVgT1JvNnJoZ3ExaVNyQWw6WjRsanRKZG5lQk9qUE1BVQ'

附加驗證存取權杖政策

如要使用 OAuth 2.0 安全性保護 API,您需要新增 OAuthV2 政策,並使用 VerifyAccessToken 作業。這項政策會檢查傳入的要求是否具有有效的存取權杖。 如果權杖有效,Edge 會處理要求。如果無效,Edge 會傳回錯誤。如需基本步驟,請參閱「驗證存取權杖」。

<OAuthV2 async="false" continueOnError="false" enabled="true" name="VerifyAccessToken">
    <DisplayName>VerifyAccessToken</DisplayName>
    <ExternalAuthorization>false</ExternalAuthorization>
    <Operation>VerifyAccessToken</Operation>
    <SupportedGrantTypes/>
    <GenerateResponse enabled="true"/>
    <Tokens/>
</OAuthV2>

呼叫受保護的 API

如要呼叫受 OAuth 2.0 安全防護機制保護的 API,您必須提供有效的存取權杖。正確做法是在 Authorization 標頭中加入權杖,如下所示:請注意,存取權杖也稱為「不記名權杖」。

$ curl -H "Authorization: Bearer UAj2yiGAcMZGxfN2DhcUbl9v8WsR" \
  http://myorg-test.apigee.net/v0/weather/forecastrss?w=12797282 

另請參閱「傳送存取權杖」。

其他資源

  • Apigee 提供 API 開發人員線上訓練課程,包括 API 安全性課程,其中包含 OAuth。
  • OAuthV2 政策:提供許多範例,說明如何向授權伺服器提出要求,以及如何設定 OAuthV2 政策。