附註:
- 此教學課程需要存取 Oracle Cloud。若要註冊免費帳戶,請參閱 Oracle Cloud Infrastructure Free Tier 入門。
- 它使用 Oracle Cloud Infrastructure 證明資料、租用戶及區間的範例值。完成實驗室時,請將這些值取代為您雲端環境特定的值。
使用 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。
注意:
本教程僅為教育和研究目的而設計。它為學習者提供一個環境,讓他們在受控制的環境中實驗並取得實際經驗。請務必注意,本實驗室中使用的安全組態和措施可能不適用於實際情況。
真實世界應用程式的安全考量通常更複雜且動態。因此,在實作此處在生產環境中示範的任何技術或組態之前,必須進行全面的安全評估和複查。此複查應涵蓋所有安全層面,包括存取控制、加密、監督與合規性,以確保系統符合組織的安全原則和標準。
從實驗室環境轉變為實際部署時,安全性應永遠是首要任務。
目標
- 使用 OCI 函數作為授權者函數建立具有模擬回應的 API 閘道,以實行自訂安全驗證,並將特定參數傳回 API 閘道。
必要條件
-
具有管理權限的 Oracle 帳戶。
-
在您的使用者中建立認證權杖。如需詳細資訊,請參閱產生認證權杖以啟用 Oracle Cloud Infrastructure Registry 的登入。
-
用以建立資源的區間。
注意:請記下區間名稱和區間 ID 。
-
具有專用和公用子網路的 VCN。如需詳細資訊,請參閱建立虛擬雲端網路。
-
部署在您 VCN 專用子網路中的函數應用程式。如需詳細資訊,請參閱函數 QuickStart 指南。
-
在您 VCN 的公用子網路中建立的 API 閘道。如需詳細資訊,請參閱 API Gateway QuickStart Guide 。
-
我們將使用 API 閘道中已知的虛擬後端作為庫存回應。如需詳細資訊,請參閱將庫存回應新增為 API 閘道後端。
-
使用您的瀏覽器存取 OCI Cloud Shell。如需詳細資訊,請參閱 OCI Cloud Shell 。
-
設定您的安全清單以允許在專用子網路與公用子網路之間存取。
作業 1:設定動態群組
登入 OCI 主控台,瀏覽至您的網域,按一下動態群組,然後使用下列資訊建立群組。
-
群組名稱:輸入
MyFunctions
。ALL {resource.type = 'fnfunc', resource.compartment.id = 'pasteYourCompartmentOCID'}
-
群組名稱:輸入
MyApiGateway
。ALL {resource.type = 'ApiGateway', resource.compartment.id = 'pasteYourCompartmentOCID'}
作業 2: 建立原則
前往 OCI 主控台,瀏覽至原則並使用下列資訊建立原則。
-
原則名稱:輸入
FunctionsPolicies
。Allow dynamic-group MyFunctions to read repos in compartment YOUR-COMPARTMENT-NAME
-
原則名稱:輸入
ApiGatewayPolicies
。Allow dynamic-group MyApiGateway to use functions-family in compartment YOUR-COMPARTMENT-NAME
作業 3:建立 OCI 容器登錄
-
移至 OCI 主控台,瀏覽至開發人員服務的容器和使用者自建物件,選取容器登錄,然後按一下建立儲存區域,為功能映像檔建立專用儲存區域。
-
儲存庫名稱:輸入
functions/authorizationfunctionjava
。
-
-
檢查儲存區域,並記下命名空間。
-
開啟應安裝 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 函數作為授權程式函數
注意:請確定選取您的專用子網路。
-
前往 OCI 主控台,瀏覽至開發人員服務、函數、應用程式,然後按一下建立應用程式。
-
啟動已安裝 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) 區域,如果您使用其他區域,則必須變更登錄位置。
-
請從此處下載 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/
這個簡單的 Java 程式碼會收到兩個參數
token
和customer
。它也會從函數組態中定義的系統環境變數擷取第三個參數。注意:請確定 handleRequest (輸入輸入輸入) 方法中的參數名稱與 API 閘道組態中使用的名稱相同。這樣可確保 API 閘道正確地將參數傳遞給授權者函數。
此程式碼片段會驗證輸入並傳回特定回應。
如需有關必要回應格式和參數的詳細資訊,請參閱建立授權者函數。
-
執行下列命令以建立程式碼並部署函數。
cd authorizationfunctionjava/ ls -lart fn deploy --app chafikFunctions
-
建立數個組態以儲存您的客戶憑證,以測試功能驗證。
注意:在本教學課程提供的 Java 範例程式碼中,會使用這些組態變數作為系統環境變數。不過,您可以修改函數代碼以使用替代方法,例如 Fn RuntimeContext 。如需詳細資訊,請參閱搭配使用 Fn RuntimeContext 函數。
加密密碼名稱 / 金鑰 數值 FN_AAA_KEY 123456 FN_BBB_KEY 898989 FN_ORACLE_KEY ABCD1234 -
您可以瀏覽至開發人員服務,透過 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
-
執行下列命令以呼叫函數。
# 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 以使用授權器函數
注意:請務必選取您的公用子網路。
-
移至 OCI 主控台,瀏覽至開發人員服務、 API 管理、閘道,然後按一下建立閘道。
-
移至閘道詳細資訊頁面,記下主機名稱。
-
在 API 閘道中建立部署。在基本資訊中,輸入下列資訊。
- 路徑前置碼:輸入
/authFunction
。
注意:將會使用 API 閘道的主機名稱和路徑前置碼來形成 API 端點。
- 路徑前置碼:輸入
-
在驗證中,輸入下列資訊。
-
選取單一認證。
-
選取授權者函數。
-
Oracle Functions 應用程式:選取在「工作 4」中建立的應用程式。
-
Oracle 函數:選取在「作業 4」中建立的函數。
-
選取多引數授權端函數。
-
函數引數:請輸入下列資訊。
相關資訊環境表格 標頭名稱 引數名稱 request.headers 客戶 客戶 request.headers token token
注意:標頭名稱是指呼叫 API 端點時包含在要求標頭中的資訊。引數名稱是傳送給授權者函數的參數名稱,請參閱 Task 4.3 中的 Java 程式碼
-
-
在路線中,使用下列資訊建立模擬測試的單一路線。
- 路徑:輸入
/mock
。 - 方法:選取 GET 。
- 後端選項: 選取編輯新增的單一後端。
- 後端類型:選取庫存回應。
- 路徑:輸入
-
在路由中,定義模擬回應,然後按下一步。
- 狀態代碼:輸入 200 。
- 主體:輸入 {"mensagem" :"ok"} 。
- 標頭名稱:選取內容類型。
- 標頭值:選取 application/json;charset=UTF-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 未授權。
作業 6:使用 OCI API 閘道從授權者函數擷取參數和範圍
注意:請參閱在「工作 4」中下載的 Java 程式碼。此工作說明如何在 API 閘道內使用
result.context
和result.scope
。
-
從授權者函數擷取相關資訊環境值。
假設您需要從授權者函數擷取資訊,並在 API 閘道內使用該資訊。例如,您可能想要使用授權權杖來呼叫後端服務。
注意:在此實驗室示範中,會傳回回應標頭中的資訊。
-
前往 OCI 主控台,瀏覽至開發人員服務、 API 管理、閘道,然後選取您的閘道。按一下部署,選取在「任務 5」中建立的部署,然後按一下編輯。
-
瀏覽至路由,然後按一下顯示路由回應原則。
-
在回應政策的標頭轉換下,按一下新增以繼續。
-
在回應標頭轉換頁面中,依照下列影像所示設定您的 API 閘道,然後按一下套用變更。
Java 程式碼的兩個參數都將包含在 API 回應標頭中。
- 標頭名稱:此欄位指定 API 回應中標頭屬性的名稱。
- 值:此欄位指定從授權者函數擷取的屬性名稱。
請使用以下格式:
${request.auth[attributeNameFromAuthorizerFunction]} #examples ${request.auth[valor01]} ${request.auth[valor02]}
-
複查表頭回應設定。按下一步以複查變更,然後按一下儲存變更以套用。
-
測試 API 並檢查回應標頭。
-
讓我們釐清如何使用授權者函數中的範圍值來增強安全性。
注意:在授權的相關資訊環境中,範圍是指授予使用者或應用程式的特定權限或存取層次。
授權者函數會傳回此 API 呼叫的所有可用範圍 (在我們的範例中,這是硬式編碼)。
對於 API 閘道部署中的某些路由,您可能只允許特定範圍增強安全性。
移至 OCI 主控台,瀏覽至開發人員服務、 API 管理、閘道,然後選取您的閘道。按一下部署,選取在「任務 5」中建立的部署,然後按一下編輯。
-
瀏覽至路由,然後按一下顯示路由要求原則。
-
在要求原則的授權底下,按一下編輯。
-
在授權原則中,選取任一作為授權類型,新增授權者函數傳回的所有允許的範圍,然後按一下套用變更。
-
在複查中複查您的變更,按一下下一步,然後按一下儲存變更以套用您的修改。
-
測試 API 並確認 API 運作中。範圍是由授權者函數傳回。
-
將 API 閘道變更為使用授權者函數未傳回的範圍。
複查您的變更,按一下下一步,然後按一下儲存變更以套用您的修改。
-
測試 API 並驗證結果。
回應將是「找不到 404 HTTP」狀態。
檢查授權者的運作是否正確,因為傳回兩個標頭。不過,路由後端因要求原則中的範圍授權驗證而失敗。
相關連結
認可
-
作者 - Rodrigo Chafik Choueiri (Oracle LAD A-Team 解決方案工程師)
-
貢獻者 - Joao Tarla (Oracle LAD A-Team 解決方案工程師)、Sillas Lima (Oracle LAD 解決方案架構師)
其他學習資源
探索 docs.oracle.com/learn 上的其他實驗室,或存取 Oracle Learning YouTube 頻道上的更多免費學習內容。此外,請造訪 education.oracle.com/learning-explorer 以成為 Oracle Learning Explorer。
如需產品文件,請造訪 Oracle Help Center 。
Customize your API Security using OCI API Gateway and OCI Functions
G25987-01
February 2025
Copyright ©2025, Oracle and/or its affiliates.