附註:
- 此教學課程需要存取 Oracle Cloud。若要註冊免費帳戶,請參閱 Oracle Cloud Infrastructure Free Tier 入門。
- 它使用 Oracle Cloud Infrastructure 證明資料、租用戶及區間的範例值。完成實驗室時,請將這些值取代為您雲端環境特定的值。
使用 OCI API Gateway 將 OCI Streaming 與其他授權方法整合
簡介
我們通常需要我們的應用程式來使用 Oracle Cloud Infrastructure (OCI) REST 服務。有數種方式可以保證元件之間的安全,確保應用程式可以安全地向後端服務認證。
這大部分時間都是 Oracle Cloud 內的原生作業,因為有數種方式可以保護網路及存取現有服務。只需幾項設定即可完成。不過,在某些情況下,應用程式可能會提供額外的安全性和連線需求。本教學課程的使用案例滿足混合雲或多雲案例 (連線至 Oracle Cloud 的內部部署,或連線至其他雲端的 Oracle Cloud) 中非常常見的需求。
讓我們呈現下列案例:
-
透過快速連線 /VPN 連線至 Oracle Cloud 的內部部署網路應用程式。
-
應用程式必須使用 OCI Streaming 服務。
-
OCI 服務沒有符合應用程式用戶可能性的認證機制。
-
應用程式需要使用 OAuth2 進行認證,才能安全地存取服務。
因此,教學課程提供下列解決方案:
-
設定讓 Oracle Identity Cloud Service 雲端自己的身分識別提供者透過 OAuth2 進行認證。
-
將 OCI API 閘道設定為與 Oracle Identity Cloud Service 整合,以透過取得的權杖進行認證。
-
編寫函數程式碼,以產生 OCI Streaming 的認證 (
draft-cavage-http-signatures-08
方法)。 -
建立群組和原則以限制對雲端資源的存取。
-
提供身分識別提供者,讓您可以傳送從屬端 ID 和加密密碼 ID,以及取得認證權杖。
-
提供透過取得的權杖認證的功能性 API 閘道 REST 服務,讓用戶使用 OCI Streaming 服務。
注意: OCI 函數代碼可在此處下載:OAuthOCIService-fn.zip 。
目標
-
允許外部應用程式使用具有 OAuth2 認證的 OCI REST 服務。
-
在 OCI 上提供 OAuth2 認證服務。
-
設定 OCI API 閘道和 OCI 函數,以透過權杖執行 OCI 服務。
必要條件
-
已在網際網路上建立並公開 OCI API 閘道執行處理。如需詳細資訊,請參閱在 Oracle Cloud 中建立您的第一個 API 閘道。
-
OCI API Gateway、OCI Functions 及 OCI PaaS 資源之間的網路連線。
-
VCN/ 子網路
-
安全清單
-
NAT 閘道 / 網際網路閘道
-
公用 / 專用網路
-
-
OCI Functions 與 OCI REST API 的相關知識,用於編寫 OCI 服務的呼叫程式碼。
作業 1:使用 Oracle Identity Cloud Service 設定 OAuth2
-
取得 OCI API 閘道參數:讓我們開始設定 OAuth2 機制。我們必須將 Oracle Identity Cloud Service 從 Oracle Cloud 設定為身分識別提供者,以將您的 OCI API 閘道執行處理整合至身分識別提供者。
-
移至 OCI API Gateway 執行處理並複製主機名稱。此資訊將用於下一個步驟的 Oracle Identity Cloud Service 資源伺服器組態中。
-
-
建立資源應用程式:我們需要為您的應用程式建立 OAuth2 授權者。我們可以與 Oracle Cloud 中的 Oracle Identity Cloud Service 搭配使用。
-
在 OCI 主控台中,前往身分識別與安全並選取同盟。
-
按一下 OracleIdentityCloudSevice 。
-
按一下 Oracle Identity Cloud Service 執行處理的 Oracle Identity Cloud Service 主控台連結。
-
我們將建立兩個應用程式。按一下應用程式和服務。
-
在「應用程式」中,按一下新增。
-
選取機密應用程式,即可開始設定您的資源伺服器。
-
我們將設定第一個應用程式。在資源伺服器應用程式中輸入名稱,然後按一下下一步。
-
按一下以後略過。我們只需要設定資源。
-
輸入您在步驟 1 取得的 API 閘道主機名稱。
-
按一下新增範圍,然後輸入範圍資訊。
-
複查您的範圍資訊,按兩次下一步,然後按一下完成。
-
按一下啟動來啟動您的應用程式。
-
-
建立從屬端應用程式。
-
在應用程式中,按一下新增。
-
選取機密應用程式,即可開始設定您的資源伺服器。
-
輸入您應用程式的名稱,然後按一下下一步。
-
選取立即將應用程式設定為用戶端,為您的用戶端應用程式啟用組態。選取從屬端證明資料、 JWT 宣告以及代表。
注意:如果您要驗證函數代碼中的 OAuth2,則必須設定自我檢查旗標。這會啟用
/oauth2/v1/introspect
Oracle Identity Cloud Service REST API 服務。 -
向下捲動並按一下新增範圍。
-
尋找您在 (
oauth_resource_server
) 之前建立的資源應用程式,然後按一下新增。 -
您可以查看已新增至應用程式的範圍。按下一步。
注意:請注意範圍值,您必須使用它來要求記號。
-
略過資源和 Web 層原則視窗。在授權中,選取強制授權為授權,然後按一下完成。
-
請注意用戶端 ID 和用戶端密碼資訊。您將需要這個權限來取得您的 token。
-
按一下啟用以啟用應用程式,您的 OAuth2 授權者已準備好進行測試。
-
-
取得記號:現在我們可以測試 OAuth2 授權者以取得記號。
-
撰寫授權者的 URL。您可以在瀏覽器中取得 Oracle Identity Cloud Service URL,即可取得此 URL。在 Oracle Identity Cloud Service URL 中,您可以看到類似以下的內容:
https://idcs-xxxxxxxxxxxxx.identity.oraclecloud.com/ui/v1/adminconsole
。 -
您需要 URL 連結,直到
oraclecloud.com
為根端點為止。例如https://idcs-xxxxxxxxxxxxx.identity.oraclecloud.com
。 -
我們需要新增 oAuth 認證路徑。此 URL 將以
POST
REST 要求的形式執行。例如,https://idcs-xxxxxxxxxxxxx.identity.oraclecloud.com/oauth2/v1/token
。您必須輸入一些參數,才能要求權杖。 -
請將證明資料輸入為基本認證、從屬端 ID 以及從屬端密碼。
-
在主體內容中,輸入 grant_type 和 scope 值。請記住,範圍是在 Oracle Identity Cloud Service 組態中擷取。
-
按一下傳送,然後執行
POST
要求並檢視記號。
-
作業 2:設定 OCI 函數以呼叫您的 OCI SDK API
-
瞭解 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 進行認證。
-
瞭解程式碼:此程式碼將與 OCI API Gateway 搭配使用。在您的 API 部署中,我們將在 OCI API 閘道中設定 OCI Streaming 端點,並將其作為 HEADER 授權參數傳送。因此,您可以將此功能用於部署每個 OCI API 閘道所需的許多服務。
-
Python 中的此函數會以認證的格式建立日期與時間。此日期與時間必須產生一次,並用於兩個點。至 OCI Streaming 要求的標頭日期和簽章加密標頭。
-
此為簽名加密的功能。此組件包括使用 OCI IAM 使用者的私密金鑰搭配 SHA-256,然後使用 base64。
-
簽名加密將用於完整的 Authorization HEADER。
-
這是 Oracle Identity Cloud Service OAUTH2 權杖驗證代碼。您必須使用 Oracle Identity Cloud Service 應用程式參數來設定
config.json
檔案。 -
這是函數的起點,並從為此 API 部署 (
streaming_host
和oci_region
) 建立的 OCI IAM 安全性和 OCI Streaming 變數初始化部分資訊。 -
這是此函數的主要部分,有兩個部分。
在第一部分,我們取得 API 閘道要求中傳遞的權杖。在此之後,我們呼叫 auth_idcs() 函數來驗證 Oracle Identity Cloud Service 中的記號。產生 draft-cavage-http-signatures-08 字串之前,請先驗證 Oracle Identity Cloud Service 權杖。如果它不是有效的記號,則回應會提供 401 未授權的錯誤。
在第二個部份中,我們將建立兩個值。日期格式的日期 (d) 將用於建立簽名 (a)。rdata 會使用 OCI API 閘道在 OCI Streaming 上驗證的授權和日期值來建構函數的回應。
-
我們可以在這裡產生 OCI Observability 的日誌,這是選擇性步驟。輸入日誌的 Oracle Cloud Identifier (OCID) 。您必須先建立自訂日誌。
注意:若要在 OCI Observability 中建立自訂日誌,請參閱使用 OCI API Gateway、Functions 及 Observability 來驗證 JSON Content 和 Monitor API 標頭和主體。
-
這是最後一個步驟,並且傳回有效的認證。
這是必須在此函數 (fn) 中載入的
requirements.txt
程式庫。requirements.txt --------------------- fdk>=0.1.54 requests oci cryptography six PyJWT py3_lru_cache simplejson
此為
config.json
檔案。這是 OCI 組態檔。您可以從 OCI CLI 安裝複製此檔案,但請務必修改
key_file
區段並移除 OCI CLI 安裝的路徑。這將用於 Python 程式碼中以產生draft-cavage-http-signatures-08
加密字串。部署函數之前,請先建立兩個變數,然後填入 OCI 串流 OCID 和 OCI 區域值,就像這樣。
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 。
-
設定您的 OCI API 閘道服務。在此範例中,我們將設定 OCI Streaming 服務。在基本資訊中,將路徑前置碼輸入為
/20180418/streams/
,再輸入串流執行處理的 OCID。例如:
/20180418/streams/ocid1.stream.oc1.iad.xxxxxxxxxxxxxxxxxxxxxxxxxxxx
-
在「認證」中,選取單一認證和授權者函數。選取區間和 Oracle Function 作為
get-authorization
。 -
設定您的要求 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
-
若要設定 Oracle Identity Cloud Service 參數的 HEADER,您必須按一下顯示路由要求原則。
-
在 HEADER 轉換中,按一下編輯,然後在兩個參數中輸入行為至
Overwrite
,標頭名稱分別以Authorization
、Date
和值作為${request.auth[authorization]}
和${request.auth[date]}
。${request.auth[authorization]}
和${request.auth[date]}
是函數 Python 程式碼傳回的值,將作為後端服務的 HEADER 傳送。
作業 4:設定 OCI 群組和原則
若要設定 OCI Streaming 的原則,請參閱 OCI Streaming Policies ,您可以使用一般原則,請參閱通用原則。
作業 5:測試 API
讓我們在 OCI Streaming 中模擬您模型部署服務的應用程式 OAuth2 要求。
-
取得權杖並將從屬端 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
-
測試對 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.
而這裡就是結果。
在「日誌」中,您可以看到自訂程式碼授權邏輯的有效負載。
相關連結
認可
- 作者 - Cristiano Hoshikawa (Oracle LAD A-Team 解決方案工程師)
其他學習資源
探索 docs.oracle.com/learn 上的其他實驗室,或存取 Oracle Learning YouTube 頻道上的更多免費學習內容。此外,請造訪 education.oracle.com/learning-explorer 以成為 Oracle Learning Explorer。
如需產品文件,請造訪 Oracle Help Center 。
Integrate OCI Streaming with Other Authorization Methods Using OCI API Gateway
F91396-02
November 2024