附註:

使用 OCI API Gateway 和 OCI Functions 自訂 API 安全性

簡介

探索 Oracle Cloud Infrastructure (OCI) Functions 與 OCI API Gateway 之間的無縫協同效應,為您的 API 導入自訂驗證方法,以及函數如何從 API 閘道擷取引數。

OCI API 閘道

OCI API Gateway 服務可讓您發布具有可從您網路內存取之專用端點的 API,如果您想要讓 API 接受網際網路流量,可以使用公用 IP 位址公開這些 API。端點支援 API 驗證、要求和回應轉換、CORS、驗證和授權以及要求限制。

使用 OCI API 閘道服務時,您可以在區域子網路中建立一或多個 API 閘道,以處理來自 API 用戶端的流量,並將其遞送至後端服務。您可以使用單一 API 閘道將多個後端服務 (例如 OCI Load Balancer、OCI Compute 執行處理和 OCI 函數) 連結至單一合併的 API 端點。

OCI 函數

OCI Functions 是一個完全受管理、多租用戶、高度可擴展、隨選、Functions-as-a-Service 平台。它建立在企業級 OCI 上,並由 Fn Project 開放原始碼引擎提供技術支援。如果您想要專注於編寫程式碼以滿足業務需求,請使用 OCI Functions。

注意:

目標

必要條件

作業 1:設定動態群組

登入 OCI 主控台,瀏覽至您的網域,按一下動態群組,然後使用下列資訊建立群組。

作業 2: 建立原則

前往 OCI 主控台,瀏覽至原則並使用下列資訊建立原則。

作業 3:建立 OCI 容器登錄

  1. 移至 OCI 主控台,瀏覽至開發人員服務容器和使用者自建物件,選取容器登錄,然後按一下建立儲存區域,為功能映像檔建立專用儲存區域。

    • 儲存庫名稱:輸入 functions/authorizationfunctionjava

      建立儲存區域

  2. 檢查儲存區域,並記下命名空間

    儲存庫命名空間

  3. 開啟應安裝 OCI CLI 和 Docker 的 OCI Cloud Shell,然後繼續登入登錄。檢查您所在區域的正確 URL。本教學課程使用 Brazil East (Sao Paulo) ,其中登錄 URL 為 gru.ocir.io

    docker login -u 'yourRepositoryNamespace/oracleidentitycloudservice/yourUserLogin' gru.ocir.io
    Password: YOUR_AUTH_TOKEN_CREATED_EARLIER
    

    嵌入式登入

作業 4:建立 Java OCI 函數作為授權程式函數

注意:請確定選取您的專用子網路。

  1. 前往 OCI 主控台,瀏覽至開發人員服務函數應用程式,然後按一下建立應用程式

    create application

  2. 啟動已安裝 Docker、OCI 以及 Fn Project CLI 的 OCI Cloud Shell,並執行下列命令來起始函數。

    注意:如果您遵循這些工作,就應該已經執行您的 Docker 登入命令 (如果沒有的話),繼續進行「工作 3」中的 Docker 登入步驟。

    移至 OCI 主控台,瀏覽至開發人員服務函數應用程式,選取您的應用程式,然後按一下開始使用。執行下列命令。

    fn list context
    fn use context sa-saopaulo-1
    fn update context oracle.compartment-id PASTE_YOUR_COMPARTMENT_OCID
    fn update context registry gru.ocir.io/PASTE_YOUR_REGISTRY_NAMESPACE/functions
    

    注意:在此教學課程中,我們使用 Brazil East (Sao Paulo) 區域,如果您使用其他區域,則必須變更登錄位置。

  3. 請從此處下載 Java 函數範例程式碼:authorizationfunctionjava.tar 並將其上傳至您的 OCI Cloud Shell,然後繼續解壓縮檔案。

    # check your file is there
    ls -lrt
    # create your directory
    mkdir authorizationfunctionjava
    # unzip the file
    tar -xvf authorizationfunctionjava.tar -C authorizationfunctionjava
    cd authorizationfunctionjava/
    

    解壓縮 tar 檔

    這個簡單的 Java 程式碼會收到兩個參數 tokencustomer。它也會從函數組態中定義的系統環境變數擷取第三個參數。

    注意:請確定 handleRequest (輸入輸入輸入) 方法中的參數名稱與 API 閘道組態中使用的名稱相同。這樣可確保 API 閘道正確地將參數傳遞給授權者函數。

    java 碼

    此程式碼片段會驗證輸入並傳回特定回應。

    validation

    result

    如需有關必要回應格式和參數的詳細資訊,請參閱建立授權者函數

  4. 執行下列命令以建立程式碼並部署函數。

    cd authorizationfunctionjava/
    ls -lart
    fn deploy --app chafikFunctions
    

    建置

    建置

  5. 建立數個組態以儲存您的客戶憑證,以測試功能驗證。

    注意:在本教學課程提供的 Java 範例程式碼中,會使用這些組態變數作為系統環境變數。不過,您可以修改函數代碼以使用替代方法,例如 Fn RuntimeContext 。如需詳細資訊,請參閱搭配使用 Fn RuntimeContext 函數

    加密密碼名稱 / 金鑰 數值
    FN_AAA_KEY 123456
    FN_BBB_KEY 898989
    FN_ORACLE_KEY ABCD1234
  6. 您可以瀏覽至開發人員服務,透過 OCI 主控台設定這些設定值。在函數下,按一下應用程式,選取您的應用程式,然後選取您的函數。在函數詳細資訊頁面中,按一下組態

    組態

    執行 fn 指令。

    fn config function --help
    
    MANAGEMENT COMMAND
    fn config function - Store a configuration key for this function
    
    USAGE
    fn [global options] config function <app-name> <function-name> <key> <value>
    
    DESCRIPTION
    This command sets the configuration of a specific function for an application.
    
    fn config function chafikFunctions authorizationfunctionjava FN_ORACLE_KEY ABCD1234
    
  7. 執行下列命令以呼叫函數。

    # Invoke the function to check if it's working as expected
    echo -n '{"data" : {"customer":"ORACLE", "token": "ABCD1234"}}' | fn invoke chafikFunctions authorizationfunctionjava
    

    注意:初始呼叫最多可能需要 1 分鐘的時間來暖機函數。複查任何其他設定值的組態。如需詳細資訊,請參閱 Reducing Initial Latency Using Provisioned Concurrency

    使用有效和無效的資料進行測試,以驗證函數回應。

    呼叫函數

作業 5:建立 OCI API 閘道和模擬 API 以使用授權器函數

注意:請務必選取您的公用子網路。

  1. 移至 OCI 主控台,瀏覽至開發人員服務API 管理閘道,然後按一下建立閘道

    create application

  2. 移至閘道詳細資訊頁面,記下主機名稱

    閘道主機名稱

  3. 在 API 閘道中建立部署。在基本資訊中,輸入下列資訊。

    • 路徑前置碼:輸入 /authFunction

    注意:將會使用 API 閘道的主機名稱路徑前置碼來形成 API 端點。

    基本資訊

  4. 驗證中,輸入下列資訊。

    • 選取單一認證

    • 選取授權者函數

    • Oracle Functions 應用程式:選取在「工作 4」中建立的應用程式。

    • Oracle 函數:選取在「作業 4」中建立的函數。

    • 選取多引數授權端函數

    • 函數引數:請輸入下列資訊。

      相關資訊環境表格 標頭名稱 引數名稱
      request.headers 客戶 客戶
      request.headers token token

    注意標頭名稱是指呼叫 API 端點時包含在要求標頭中的資訊。引數名稱是傳送給授權者函數的參數名稱,請參閱 Task 4.3 中的 Java 程式碼

    單鑑別

    函數引數

  5. 路線中,使用下列資訊建立模擬測試的單一路線。

    • 路徑:輸入 /mock
    • 方法:選取 GET
    • 後端選項: 選取編輯新增的單一後端
    • 後端類型:選取庫存回應

    路由

  6. 路由中,定義模擬回應,然後按下一步

    • 狀態代碼:輸入 200
    • 主體:輸入 {"mensagem" :"ok"}
    • 標頭名稱:選取內容類型
    • 標頭值:選取 application/json;charset=UTF-8

    模擬

  7. 複查中,驗證組態並按一下儲存變更以完成建立部署。

  8. 執行 curl 命令以測試您的 API。

    # Invoke using <Verb Defined in Route> with the endpoint like: <API Gateway Hostname> + <Deployment Path Prefix> + <Route Path>
    # Send parameters, such as customer and token, in the Header with values configured in Task 4 - Step 5
    curl -i -H "customer: AAA" -H "token: 123456" -X GET https://yourapigatewayhosta.your-region.oci.customer-oci.com/authFunction/mock
    

    呼叫函數

    如果使用無效的資訊呼叫,回應將會是 HTTP/1.1 401 未授權

    401 狀態

作業 6:使用 OCI API 閘道從授權者函數擷取參數和範圍

注意:請參閱在「工作 4」中下載的 Java 程式碼。此工作說明如何在 API 閘道內使用 result.contextresult.scope

  1. 從授權者函數擷取相關資訊環境值。

    環境定義變數

    假設您需要從授權者函數擷取資訊,並在 API 閘道內使用該資訊。例如,您可能想要使用授權權杖來呼叫後端服務。

    注意:在此實驗室示範中,會傳回回應標頭中的資訊。

  2. 前往 OCI 主控台,瀏覽至開發人員服務API 管理閘道,然後選取您的閘道。按一下部署,選取在「任務 5」中建立的部署,然後按一下編輯

    編輯部署

  3. 瀏覽至路由,然後按一下顯示路由回應原則

    路由響應

  4. 回應政策標頭轉換下,按一下新增以繼續。

    add button - 新增按鈕

  5. 回應標頭轉換頁面中,依照下列影像所示設定您的 API 閘道,然後按一下套用變更

    Java 程式碼的兩個參數都將包含在 API 回應標頭中。

    • 標頭名稱:此欄位指定 API 回應中標頭屬性的名稱。
    • 值:此欄位指定從授權者函數擷取的屬性名稱。

    請使用以下格式:

    ${request.auth[attributeNameFromAuthorizerFunction]}
    
    #examples
    ${request.auth[valor01]}
    ${request.auth[valor02]}
    

    標頭設定

  6. 複查表頭回應設定。按下一步以複查變更,然後按一下儲存變更以套用。

    核對標頭設定

  7. 測試 API 並檢查回應標頭。

    標頭回應

  8. 讓我們釐清如何使用授權者函數中的範圍值來增強安全性。

    注意:在授權的相關資訊環境中,範圍是指授予使用者或應用程式的特定權限或存取層次。

    環境定義變數

    授權者函數會傳回此 API 呼叫的所有可用範圍 (在我們的範例中,這是硬式編碼)。

    對於 API 閘道部署中的某些路由,您可能只允許特定範圍增強安全性。

    移至 OCI 主控台,瀏覽至開發人員服務API 管理閘道,然後選取您的閘道。按一下部署,選取在「任務 5」中建立的部署,然後按一下編輯

    編輯部署

  9. 瀏覽至路由,然後按一下顯示路由要求原則

    路由請求

  10. 要求原則授權底下,按一下編輯

    編輯按鈕

  11. 授權原則中,選取任一作為授權類型,新增授權者函數傳回的所有允許的範圍,然後按一下套用變更

    授權原則

  12. 複查中複查您的變更,按一下下一步,然後按一下儲存變更以套用您的修改。

    授權原則

  13. 測試 API 並確認 API 運作中。範圍是由授權者函數傳回。

    測試成功

  14. 將 API 閘道變更為使用授權者函數未傳回的範圍。

    複查您的變更,按一下下一步,然後按一下儲存變更以套用您的修改。

    範疇失效

  15. 測試 API 並驗證結果。

    授權原則

    回應將是「找不到 404 HTTP」狀態。

    檢查授權者的運作是否正確,因為傳回兩個標頭。不過,路由後端因要求原則中的範圍授權驗證而失敗。

認可

其他學習資源

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

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