使用第三方 OAuth 權杖

查看 Apigee Edge 說明文件。
前往 Apigee X說明文件
資訊

在本主題中,我們將討論如何匯入外部產生的存取權杖、更新權杖。 或驗證碼傳送至 Edge 權杖儲存庫你可以使用這項技巧 設定 Apigee Edge 以驗證在 Apigee Edge 以外產生的權杖。

在一般情況下,Apigee Edge 會產生及儲存 OAuth 權杖,然後將權杖傳回給 呼叫應用程式接著,發出呼叫的應用程式會在提出要求時,將權杖傳回 Apigee Edge 和 Apigee Edge - 透過 OAuthV2 政策搭配 Operation = VerifyAccessToken, 驗證權杖是否有效。本主題說明如何設定 Apigee Edge 以儲存 從其他地方產生的 OAuth 權杖,但是權杖驗證部分保持不變。 就像由 Edge 產生的權杖一樣

範例

如果您想查看能說明技巧的實際範例 請使用本主題所述的 Apigee 「委派權杖管理」範例

指南簡介

假設您目前已有一個授權系統,而且您想使用 而該系統產生的權杖或代碼值,取代 OAuth2 權杖或程式碼值 邊緣產生。接著您就可以使用替換的權杖或程式碼,提出安全的 API Proxy 要求。 而 Edge 會驗證這些容器是否由 Edge 產生。

一些背景資訊

在一般情況下,Apigee Edge 會產生隨機字串的隨機字串,藉此產生符記 數字。Apigee Edge 與該權杖、其他資料 (例如權杖核發時間) 建立關聯 到期的 API 產品清單,以及憑證的範圍。以上皆是 這項資訊可在由 OAuthV2 政策自動產生的回應中傳回 使用 Operation = GenerateAccessToken回應的形式如下所示:

{
  "issued_at": "1469735625687",
  "application_name": "06947a86-919e-4ca3-ac72-036723b18231",
  "scope": "urn://example.com/read",
  "status": "approved",
  "api_product_list": "[implicit-test]",
  "api_product_list_json": ["implicit-test"],
  "expires_in": "1799", //--in seconds
  "developer.email": "joe@weathersample.com",
  "token_type": "BearerToken",
  "client_id": "U9AC66e9YFyI1yqaXgUF8H6b9wUN1TLk",
  "access_token": "zBC90HhCGmGlaMBWeZAai2s3za5j",
  "organization_name": "wwitman",
  "refresh_token_expires_in": "0", //--in seconds
  "refresh_count": "0"
}

access_token 屬性的值實際上是查詢鍵 回應資料。應用程式可以向 Edge 中託管的 API Proxy 發出要求。 使用 OAuthV2 來攜帶不記名權杖 zBC90HhCGmGlaMBWeZAai2s3za5j 和 Edge 含有 Operation = VerifyAccessToken 的政策 - 查詢符記、擷取所有資訊, 並使用該資訊判斷所要求的 API Proxy 權杖是否有效。 這就是「權杖驗證」功能。上述所有資訊皆包含符記。 access_token 值只是用來查詢該資訊的方法。

另一方面,請按照此處所述的步驟,將 Edge 設定為儲存 權杖,因此其 access_token 值是由外部產生 課程中也會快速介紹 Memorystore 這是 Google Cloud 的全代管 Redis 服務所有其他中繼資料可能相同。例如 Apigee Edge 的外部,會產生「TOKEN-<16 random-<16 random》形式的權杖 數字>」,直接在 Google Cloud 控制台實際操作。在這種情況下,Apigee Edge 儲存的完整權杖中繼資料可能如下:

{
  "issued_at": "1469735625687",
  "application_name": "06947a86-919e-4ca3-ac72-036723b18231",
  "scope": "urn://example.com/read",
  "status": "approved",
  "api_product_list": "[implicit-test]",
  "api_product_list_json": ["implicit-test"],
  "expires_in": "1799", //--in seconds
  "developer.email": "joe@weathersample.com",
  "token_type": "BearerToken",
  "client_id": "U9AC66e9YFyI1yqaXgUF8H6b9wUN1TLk",
  "access_token": "TOKEN-1092837373654221",
  "organization_name": "wwitman",
  "refresh_token_expires_in": "0", //--in seconds
  "refresh_count": "0"
}

在這種情況下,應用程式可以向 Edge 中託管的 API Proxy 發出要求, 權杖 TOKEN-1092837373654221 和 Edge - 透過 OAuthV2 政策搭配「Operation =」 VerifyAccessToken - 將可以驗證憑證。您可以針對以下項目套用類似的匯入模式: 授權碼和重新整理權杖

讓我們一起瞭解如何驗證用戶端 憑證

產生權杖的一項先決條件是驗證提出要求的用戶端。根據預設, Apigee Edge 中的 OAuthV2/GenerateAccessToken 政策會以隱含形式驗證用戶端憑證。 通常在申請 OAuthV2 權杖的要求中,client_id 和 client_secret 會傳入 Authorization 標頭,透過 HTTP 基本授權進行編碼 (以冒號串連, Base64 編碼)。Apigee Edge 中的 OAuthV2/GenerateAccessToken 政策會將該標頭 查詢 client_id,並驗證傳入的 client_secret 是否適用於該用戶端 client_id.當 Apigee Edge 知道憑證存在時,這個方法有效,換句話說, 儲存在 Apigee Edge 中的開發人員應用程式,其中包含憑證,其本身含有 指定的 client_id 和 client_secret。

如果用戶端憑證未經過 Apigee Edge 驗證,您就必須 先設計您的 API Proxy,在產生權杖之前,透過一些 。通常是透過服務呼叫政策, 可連線至網路中的遠端端點

無論是默示或明確方式,您都必須確保 API Proxy 產生權杖時,首先會驗證用戶端憑證。請記得, 用戶端的執行程序與產生存取權杖無關。您可以將 Apigee Edge 設定為同時執行這兩項作業 或是兩者都不做

如果您希望 Apigee Edge 中的 OAuthV2/GenerateAccessToken 政策用於驗證用戶端 比對 Edge 商店,請將 <ExternalAuthorization> 元素設為 false 或完全省略。如要使用 外部授權服務,明確驗證用戶端憑證 <ExternalAuthorization>true

雖然 Apigee Edge 可能不會驗證用戶端憑證,但對於 由 Apigee Edge 知道及管理的 client_id。Apigee Edge 中的每個 access_token 由 Apigee Edge 產生或由外部系統產生,再匯入 Apigee Edge 必須與用戶端應用程式相關聯,以 client_id 表示。即使這樣 其中 Apigee Edge 中的 OAuthV2/GenerateAccessToken 政策不會驗證 client_id 和 client_secret 比對時,這項政策會驗證 client_id 是否有效、存在,以及 已撤銷。因此,您必須先透過 Edge 匯入 client_id's,才能進行必要的設定步驟 管理 API

Apigee 第三方 OAuth 政策流程

在 Apigee Edge 中使用第三方 OAuth 系統的權杖,產生存取權的流程 符記應遵循下列任一模式。

(外部連結) 用戶端憑證驗證

  1. ServiceCallout 驗證傳入用戶端憑證,並取得外部權杖。
  2. ExtractVariablesJavaScript 步驟 從回應中擷取外部產生的權杖
  3. AssignMessage 授予 設定名為 oauth_external_authorization_status 的特殊已知變數。 這個值必須為 true,表示用戶端憑證有效。
  4. OAuthV2/GenerateAccessToken 已將 <ExternalAuthorization> 元素設為 true,且至少設為 1 共 <ExternalAccessToken><ExternalRefreshToken>,或 <ExternalAuthorizationCode>

內建電池用 用戶端憑證驗證

  • ServiceCallout 取得外部權杖
  • ExtractVariablesJavaScript 步驟 從回應中擷取外部產生的權杖
  • OAuthV2/GenerateAccessToken 已將 <ExternalAuthorization> 元素設為 false,且至少設為 1 共 <ExternalAccessToken><ExternalRefreshToken>,或 <ExternalAuthorizationCode>

流程和政策設定注意事項

  • 如果您要使用外部系統驗證用戶端憑證, 制定必要的政策流程一般情況下,您需要使用 服務呼叫政策:將外部辨識的憑證傳送至外部 驗證服務外部驗證服務通常會傳回回應 如果憑證有效,則也會包含存取權杖。

  • Service 呼叫 之後,API Proxy 需要剖析回應來擷取 有效性狀態,以及外部產生的 access_token, refresh_token.

  • 在 OAuthV2/GenerateAccessToken 政策中設定 <StoreToken> 元素 設為 true,並將 <ExternalAuthorization> 元素設為 truefalse

    執行 OAuthV2/GenerateAccessToken 政策時,系統會讀取變數 oauth_external_authorization_status。如果已設定該變數,且值為 是,Apigee Edge 不會嘗試驗證用戶端憑證。如果變數 如果未設定或值為 True,Apigee Edge 就會嘗試驗證用戶端 憑證

  • OAuthV2 政策有三個元素,可讓您指定 要匯入的資料:<ExternalAccessToken><ExternalRefreshToken>, 和 <ExternalAuthorizationCode>。每個元素都接受 流程變數。Edge 政策會讀取該變數,以找出 外部產生的存取權杖、更新權杖或授權碼。一切由您決定 實施政策和邏輯,將外部符記或代碼放置在適當的 變數。

    舉例來說,下列 OAuthV2 政策中的設定會指示 Edge 尋找 符記。external_token

    <ExternalAccessToken>external_token</ExternalAccessToken>
    

    您也需要在之前的步驟設定該變數。

  • 在設定 oauth_external_authorization_status 變數的過程中,常見的 如要設定這個變數,就必須將 AssignMessage 政策用於 assignVariable 元素,如下所示:

    <AssignMessage name="AssignMessage-SetVariable">
        <DisplayName>Assign Message - Set Variable</DisplayName>
        <AssignVariable>
            <Name>oauth_external_authorization_status</Name>
            <Value>true</Value>
        </AssignVariable>
        <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
    </AssignMessage>
    

    請記住,這項政策必須在 OAuthV2 政策前面,且 Operation = GenerateAccessToken.

OAuthV2 政策示例

下列 OAuthV2 政策 產生 Apigee Edge 存取權杖時,Edge 會尋找 流程變數 external_access_token 中的符記值。

<OAuthV2 name="OAuth-v20-Store-External-Token">
    <ExternalAccessToken>external_access_token</ExternalAccessToken>
    <ExternalAuthorization>true</ExternalAuthorization>
    <Operation>GenerateAccessToken</Operation>
    <GenerateResponse enabled="true">
        <Format>FORM_PARAM</Format>
    </GenerateResponse>
    <ReuseRefreshToken>false</ReuseRefreshToken>
    <StoreToken>true</StoreToken>
    <SupportedGrantTypes>
        <GrantType>client_credentials</GrantType>
    </SupportedGrantTypes>
    <ExpiresIn ref='flow.variable'>2400000</ExpiresIn>
</OAuthV2>

理論上,您可以透過任何第三方 OAuth2 授權套用這個模式 課程中也會快速介紹 Memorystore 這是 Google Cloud 的全代管 Redis 服務