附註:

使用 OCI API Gateway 將 OCI Streaming 與其他授權方法整合

簡介

我們通常需要我們的應用程式來使用 Oracle Cloud Infrastructure (OCI) REST 服務。有數種方式可以保證元件之間的安全,確保應用程式可以安全地向後端服務認證。

這大部分時間都是 Oracle Cloud 內的原生作業,因為有數種方式可以保護網路及存取現有服務。只需幾項設定即可完成。不過,在某些情況下,應用程式可能會提供額外的安全性和連線需求。本教學課程的使用案例滿足混合雲或多雲案例 (連線至 Oracle Cloud 的內部部署,或連線至其他雲端的 Oracle Cloud) 中非常常見的需求。

讓我們呈現下列案例:

因此,教學課程提供下列解決方案:

注意OCI 函數代碼可在此處下載:OAuthOCIService-fn.zip

目標

必要條件

作業 1:使用 Oracle Identity Cloud Service 設定 OAuth2

  1. 取得 OCI API 閘道參數:讓我們開始設定 OAuth2 機制。我們必須將 Oracle Identity Cloud Service 從 Oracle Cloud 設定為身分識別提供者,以將您的 OCI API 閘道執行處理整合至身分識別提供者。

    • 移至 OCI API Gateway 執行處理並複製主機名稱。此資訊將用於下一個步驟的 Oracle Identity Cloud Service 資源伺服器組態中。

      img.png

  2. 建立資源應用程式:我們需要為您的應用程式建立 OAuth2 授權者。我們可以與 Oracle Cloud 中的 Oracle Identity Cloud Service 搭配使用。

    1. 在 OCI 主控台中,前往身分識別與安全並選取同盟

      img.png

    2. 按一下 OracleIdentityCloudSevice

      img.png

    3. 按一下 Oracle Identity Cloud Service 執行處理的 Oracle Identity Cloud Service 主控台連結。

      img.png

    4. 我們將建立兩個應用程式。按一下應用程式和服務

      img.png

    5. 在「應用程式」中,按一下新增

      img.png

    6. 選取機密應用程式,即可開始設定您的資源伺服器。

      img.png

    7. 我們將設定第一個應用程式。在資源伺服器應用程式中輸入名稱,然後按一下下一步

      img.png

    8. 按一下以後略過。我們只需要設定資源。

      img.png

    9. 輸入您在步驟 1 取得的 API 閘道主機名稱。

      img.png

    10. 按一下新增範圍,然後輸入範圍資訊。

      img.png

    11. 複查您的範圍資訊,按兩次下一步,然後按一下完成

      img.png

    12. 按一下啟動來啟動您的應用程式。

      img.png

  3. 建立從屬端應用程式

    1. 在應用程式中,按一下新增

      img.png

    2. 選取機密應用程式,即可開始設定您的資源伺服器。

      img.png

    3. 輸入您應用程式的名稱,然後按一下下一步

      img_1.png

    4. 選取立即將應用程式設定為用戶端,為您的用戶端應用程式啟用組態。選取從屬端證明資料JWT 宣告以及代表

      img.png

      注意:如果您要驗證函數代碼中的 OAuth2,則必須設定自我檢查旗標。這會啟用 /oauth2/v1/introspect Oracle Identity Cloud Service REST API 服務。

      img_10.png

    5. 向下捲動並按一下新增範圍

      img.png

    6. 尋找您在 (oauth_resource_server) 之前建立的資源應用程式,然後按一下新增

      img.png

    7. 您可以查看已新增至應用程式的範圍。按下一步

      img.png

      注意:請注意範圍值,您必須使用它來要求記號。

    8. 略過資源Web 層原則視窗。在授權中,選取強制授權為授權,然後按一下完成

      img.png

    9. 請注意用戶端 ID用戶端密碼資訊。您將需要這個權限來取得您的 token。

      img.png

    10. 按一下啟用以啟用應用程式,您的 OAuth2 授權者已準備好進行測試。

      img_1.png

  4. 取得記號:現在我們可以測試 OAuth2 授權者以取得記號。

    1. 撰寫授權者的 URL。您可以在瀏覽器中取得 Oracle Identity Cloud Service URL,即可取得此 URL。在 Oracle Identity Cloud Service URL 中,您可以看到類似以下的內容:https://idcs-xxxxxxxxxxxxx.identity.oraclecloud.com/ui/v1/adminconsole

    2. 您需要 URL 連結,直到 oraclecloud.com 為根端點為止。例如 https://idcs-xxxxxxxxxxxxx.identity.oraclecloud.com

    3. 我們需要新增 oAuth 認證路徑。此 URL 將以 POST REST 要求的形式執行。例如,https://idcs-xxxxxxxxxxxxx.identity.oraclecloud.com/oauth2/v1/token。您必須輸入一些參數,才能要求權杖。

    4. 請將證明資料輸入為基本認證從屬端 ID 以及從屬端密碼

      img.png

    5. 主體內容中,輸入 grant_typescope 值。請記住,範圍是在 Oracle Identity Cloud Service 組態中擷取。

      img.png

    6. 按一下傳送,然後執行 POST 要求並檢視記號。

      img_2.png

作業 2:設定 OCI 函數以呼叫您的 OCI SDK API

  1. 瞭解 OCI 函數和 OCI API 閘道:這是透過 OCI API 閘道公開服務的最佳做法。若要完成認證,請將證明資料從 OCI API 閘道傳送至後端服務,但後端認證若不是您從屬端應用程式的適當方法,可以在 OCI API 閘道層級執行部分組態。

    在此步驟中,讓我們瞭解 OCI API Gateway 如何協助我們整合 OAuth2 認證和任何 OCI 服務的要求,例如透過 OCI Functions 進行 OCI Streaming。

    OCI Functions 可執行工作以產生正確的認證 / 授權並傳送至 OCI 服務,而不需要將使用者證明資料或私密金鑰傳送至用戶應用程式。OCI 服務中的部分服務無法使用 OAuth2 方法進行認證,因此我們可以使用 OCI 函數進行認證。若要建立和部署 OCI 函數,請參閱 OCI 函數快速啟動

    在此範例中,OCI Streaming 服務可透過 OCI IAM 中的 OCI 私密金鑰透過 draft-cavage-http-signatures-08 方法進行認證,而用戶則可透過 OAuth2 進行認證。

  2. 瞭解程式碼:此程式碼將與 OCI API Gateway 搭配使用。在您的 API 部署中,我們將在 OCI API 閘道中設定 OCI Streaming 端點,並將其作為 HEADER 授權參數傳送。因此,您可以將此功能用於部署每個 OCI API 閘道所需的許多服務。

    img_12.png

    • Python 中的此函數會以認證的格式建立日期與時間。此日期與時間必須產生一次,並用於兩個點。至 OCI Streaming 要求的標頭日期簽章加密標頭。

      img_1.png

    • 此為簽名加密的功能。此組件包括使用 OCI IAM 使用者的私密金鑰搭配 SHA-256,然後使用 base64。

      img_2.png

    • 簽名加密將用於完整的 Authorization HEADER。

      img_3.png

    • 這是 Oracle Identity Cloud Service OAUTH2 權杖驗證代碼。您必須使用 Oracle Identity Cloud Service 應用程式參數來設定 config.json 檔案。

      img_13.png

    • 這是函數的起點,並從為此 API 部署 (streaming_hostoci_region) 建立的 OCI IAM 安全性和 OCI Streaming 變數初始化部分資訊。

      img_4.png

    • 這是此函數的主要部分,有兩個部分。

      在第一部分,我們取得 API 閘道要求中傳遞的權杖。在此之後,我們呼叫 auth_idcs() 函數來驗證 Oracle Identity Cloud Service 中的記號。產生 draft-cavage-http-signatures-08 字串之前,請先驗證 Oracle Identity Cloud Service 權杖。如果它不是有效的記號,則回應會提供 401 未授權的錯誤。

      在第二個部份中,我們將建立兩個值。日期格式的日期 (d) 將用於建立簽名 (a)。rdata 會使用 OCI API 閘道在 OCI Streaming 上驗證的授權日期值來建構函數的回應。

      img_15.png

    • 我們可以在這裡產生 OCI Observability 的日誌,這是選擇性步驟。輸入日誌的 Oracle Cloud Identifier (OCID) 。您必須先建立自訂日誌

      注意:若要在 OCI Observability 中建立自訂日誌,請參閱使用 OCI API Gateway、Functions 及 Observability 來驗證 JSON Content 和 Monitor API 標頭和主體

      img_6.png

    • 這是最後一個步驟,並且傳回有效的認證。

      img_7.png

    這是必須在此函數 (fn) 中載入的 requirements.txt 程式庫。

    requirements.txt
    ---------------------
    fdk>=0.1.54
    requests
    oci
    cryptography
    six
    PyJWT
    py3_lru_cache
    simplejson
    

    此為 config.json 檔案。

    img_14.png

    這是 OCI 組態檔。您可以從 OCI CLI 安裝複製此檔案,但請務必修改 key_file 區段並移除 OCI CLI 安裝的路徑。這將用於 Python 程式碼中以產生 draft-cavage-http-signatures-08 加密字串。

    img_16.png

    部署函數之前,請先建立兩個變數,然後填入 OCI 串流 OCIDOCI 區域值,就像這樣。

    fn config app <function-app> streaming_host ocid1.stream.oc1.iad.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxqhgw275qp7a
    fn config app <function-app> oci_region us-ashburn-1
    

    在 OCI API Gateway 中部署您的函數並進行設定。

作業 3:設定 API 閘道部署

注意:開發函數並在 OCI API Gateway 中呼叫它,請參閱 OCI Functions:Validate an API Key with API Gateway

  1. 設定您的 OCI API 閘道服務。在此範例中,我們將設定 OCI Streaming 服務。在基本資訊中,將路徑前置碼輸入為 /20180418/streams/,再輸入串流執行處理的 OCID。

    例如:/20180418/streams/ocid1.stream.oc1.iad.xxxxxxxxxxxxxxxxxxxxxxxxxxxx

    img.png

  2. 在「認證」中,選取單一認證授權者函數。選取區間和 Oracle Function 作為 get-authorization

    img.png

  3. 設定您的要求 HEADERs 參數。

    Header Parameter 1
    Context table=request.headers
    Header name=Date
    Argument name=Date
    
    Header Parameter 2
    Context table=request.headers
    Header name=token
    Argument name=token
    
  4. 若要設定 Oracle Identity Cloud Service 參數的 HEADER,您必須按一下顯示路由要求原則

    img.png

  5. HEADER 轉換中,按一下編輯,然後在兩個參數中輸入行為Overwrite標頭名稱分別以 AuthorizationDate作為 ${request.auth[authorization]}${request.auth[date]}${request.auth[authorization]}${request.auth[date]} 是函數 Python 程式碼傳回的值,將作為後端服務的 HEADER 傳送。

    img.png

作業 4:設定 OCI 群組和原則

若要設定 OCI Streaming 的原則,請參閱 OCI Streaming Policies ,您可以使用一般原則,請參閱通用原則

作業 5:測試 API

讓我們在 OCI Streaming 中模擬您模型部署服務的應用程式 OAuth2 要求。

  1. 取得權杖並將從屬端 ID從屬端加密密碼傳送給您的 Oracle Identity Cloud Service 提供者。

    Verb: POST
    URL: https://idcs-xxxxxxxxxxxxxxxxxxxxxxx.identity.oraclecloud.com/oauth2/v1/token
    BODY (x-www-form-urlencoded):
    scope: xxxxxxxxxxxxxxxxxxx.apigateway.us-ashburn-1.oci.customer-oci.com/super-scope
    grant_type: client_credentials
    HEADER
    Authorization: clientID:clientSecret\*
    
    - convert your clientID:clientSecret to a base64 value
    

    img_2.png

  2. 測試對 OCI API 閘道的要求。輸入您的 API 閘道部署端點,然後選取 POST 至您的 REST 要求。您需要在請求的 BODY 中宣告六個 HEADER。

    Content-Type: application/json
    access-control-allow-origin: *
    access-control-allow-method: POST,PUT,GET,HEAD,DELETE,OPTIONS
    access-control-allow-credentials: true
    Date: put an actual date in this format -> Thu, 21 Dec 2023 13:53:59 GMT
    token: put your <access_token> here*
    
    * Remember that your token have 1 hour duration.
    

    img_9.png

    而這裡就是結果。

    img_11.png

    在「日誌」中,您可以看到自訂程式碼授權邏輯的有效負載。

    img_8.png

認可

其他學習資源

探索 docs.oracle.com/learn 上的其他實驗室,或存取 Oracle Learning YouTube 頻道上的更多免費學習內容。此外,請造訪 education.oracle.com/learning-explorer 以成為 Oracle Learning Explorer。

如需產品文件,請造訪 Oracle Help Center