Kong OIDC Plugin:Token 驗證筆記

前言 當你的 API 以 OpenID Connect 協定實作 authentication(認證)時,就會使用到 Kong OIDC(OpenID Connect) plugin。本篇要關注的是,當利用 OpenID Connect 協定,讓 Kong 在認證階段自動與 IdP(例如 ADFS)整合,獲取並驗證 JWT Token,保證只有合法使用者能夠存取上游服務的這個過程。 驗證流程 當 Kong 收到來自 consumer 的請求後,會進行以下流程: Issuer Discovery Kong 透過 OIDC plugin 中的 issuer 參數,從 .well-known/openid-configuration URL,自動抓取 IdP 的 Metadata。Metadata 包含 jwks_uri(JSON Web Key Set)endpoint,用於後續公鑰獲取。 若在 plugin 的 extra_jwks_uris 有設定放置公鑰的 URL,Kong 會先依序對每個 extra_jwks_uris URL 嘗試下載 JWKS。若所有 extra_jwks_uris 都無法成功(連線失敗或無對應公鑰),再從 .well-known/openid-configuration 中的 jwks_uri 嘗試;若未設定 extra_jwks_uris,則會直接使用 .well-known Metadata 提供的 jwks_uri。 Token 取得: Kong 會對 ADFS 發起請求並獲取並 JWT Token。 ...

August 11, 2025 · 1 分鐘

IIS 部署多個 API 筆記

概述 本文紀錄如何在已運行一個 API 服務的 IIS 伺服器上,部署第二個(例如測試用)API。 方法:在同一個網站下建立子應用程式 (Sub-application) 這是在現有網站下新增 API 最直接的方法,因為此方法不需要更改 DNS 或防火牆規則(否則你要設定新的 domain name,或是在既有 domain 下使用一個未使用的 port),僅透過 URL 路徑來區分不同的 API。例如: 正式 API 呼叫路徑:http://yourdomain.com/endpoint 測試 API 呼叫路徑:http://yourdomain.com/test-api/endpoint 原理說明:應用程式集區 (Application Pool) 的隔離機制 「應用程式集區」是 IIS 中實現服務隔離的關鍵。它是一個獨立的容器,由 IIS 工作者處理序 (w3wp.exe) 管理。為新的測試 API 建立一個「全新的、獨立的」應用程式集區主要有以下三個好處: 隔離性 (Isolation):最重要的優點。如果測試 API 因錯誤而崩潰,只會影響其自身的集區,正式運行的 API 服務將完全不受影響,確保了主服務的穩定性。 安全性 (Security):可以為不同的集區設定不同的執行身分 (Identity),從而對檔案系統、資料庫等資源進行權限隔離。 獨立設定 (Configuration):每個集區可以有獨立的設定,如 .NET 版本、記憶體上限、CPU 使用率限制等,讓正式與測試環境的配置完全分開。 IIS 設定步驟 開啟 IIS 管理器,在左側窗格中找到您現有的網站。 在網站上按右鍵,選擇「新增應用程式」。 在「新增應用程式」視窗中,填寫以下資訊: 別名 (Alias):設定 URL 路徑,例如 test-api。這將成為新 API 的存取路徑的一部分。 實體路徑 (Physical path):指向您測試 API 發布檔案所在的資料夾。 應用程式集區 (Application Pool): 點擊「選取…」。 在彈出視窗中,點擊「新增…」來建立一個新集區。 為新集區命名(例如 TestApiAppPool)。 (.NET Core 的設定於後面詳述) 確認選取了這個剛剛建立的新集區。 點擊「確定」完成設定。 部署 .NET Core API 的特別注意事項 部署 .NET Core / .NET 5+ 的應用程式時,其運作模式與傳統 ASP.NET Framework 不同,設定上有一處關鍵差異。 ...

August 6, 2025 · 1 分鐘

網路負載平衡中的「非對稱路由」問題

前言 某支 API 要掛載到 APIM 上,我的同事問我這支 API 的後端伺服器有跟 Data plane 同網段嗎?同網段可能會有問題喔~ 我又嗅到新知識的味道了,趕緊來研究跟記錄一下: TCP 4-Tuple 首先必須先簡單提一下這個概念。這概念是指,每個 TCP 連線都是透過四個關鍵資訊組合成唯一識別,分別為: (Client IP, Client Port, Server IP, Server Port) Client IP: 來源 IP 位址 Client Port: 來源埠號 Server IP: 目的地 IP 位址 Server Port: 目的地埠號 或稱 Source & Destination 這四個資訊合起來,可確保網路上每一條 TCP 連線都是獨一無二的。 因此若 TCP 三方交握時,如果接收到的封包其 4-tuple 不符合系統 listen 的條件(如目的 IP 或目的 Port 不正確),該封包會被丟棄,不會產生連線。 情境分析 不同網段(非對稱路由) 假設: Client:10.1.1.10 (網段 A) NLB VIP:10.2.2.100 (網段 B) ...

July 29, 2025 · 2 分鐘

高可用性叢集(HA cluster)運作模式 - 以 Kong CP 為例

前言 某天我在公司 Kong 測試環境的 control plane 上作業時,才發現其中一台 control plane 的服務竟然沒啟用。好奇之下問了之前負責維護的同事,結果他說:「本來就只會啟用一台啊!」於是我又多學了一課,身為啥都學來者不拒的工程師,當然要記錄下來。 HA cluster 高可用性叢集 根據 wikipedia 的定義:「高可用性叢集(High-availability clusters)是以最短的中斷時間為目標而可靠地運作的,支撐伺服器應用的一組電腦。它們通過使用高可用性軟體來管理叢集中的冗餘電腦,當系統組件出現故障時,這些電腦可以繼續提供服務。」簡單來說,就是有備援主機能在其中一台掛掉時接手,讓服務不中斷。 在接手 Kong 之前,我手上的系統也幾乎都是一個服務同時掛載在由兩個節點組成的 cluster 上,流量會透過 NLB(Network Load Balancer,網路負載平衡器)分流到兩個 node 上。 HA cluster 常見有兩種運作模式:Active-Passive 和 Active-Active。 Active-Passive 模式:一台節點(主節點)負責運行服務並處理所有流量,另一台節點則處於待命(備援)狀態,只有主節點故障時才會接手服務。 Active-Active 模式:兩台或多台節點同時運行服務,互相備援,平時都在積極處理流量。當其中一台節點故障時,其他節點會接手其服務。 所以,這次 control plane 採用的是 Active-Passive 模式。But why? 一定有什麼原因吧?(後來想起其實同事很久以前有說過,但我忘了,且當時也沒說那麼細,所以說做筆記很重要)。 Control plane v PostgreSQL Kong 的 Control Plane 負責集中管理 API Gateway 的所有設定、認證,以及 policy 和各種 plugins 的管理操作。不過 control plane 本身並不保存資料,只是管理和派送設定任務。所有設定與狀態資料都必須儲存在獨立運行的 PostgreSQL 資料庫裡,control plane 會以資料庫客戶端身份,透過網路連線到 PostgreSQL 資料庫伺服器,每次有設定變更、查詢、同步請求時都會讀寫這個資料庫。 根據官方文件1,PostgreSQL 不支援多台主機或多個資料庫 instance 同時掛載、讀寫同一份 data directory,否則可能會有資料毀損的風險。事實上,有人實驗過2,即使強行繞過 PostgreSQL 的檢查機制,在你啟用另一個 instance 時,原本掛載的 instance 也會被強制斷開。 ...

July 25, 2025 · 1 分鐘

簡述 Kong API Gateway Control Plane 與 Data Plane 設置同步機制

我喜歡在文章裡面放張圖,雖然現在 AI 生圖很方便,但還是喜歡放自然一點的,不論是自己拍的或是網路上看到的(from unsplash) 前言 在 Kong API Gateway 的日常維運中,Control plane 與 Data plane 的同步機制是個蠻值得關注的概念。最近在檢視公司架構圖時,我發現到 Control plane 與 Data plane 之間的 policy sync 方向標示為 Data plane 向 Control plane「拉取」最新設置。 簡單畫,公司實際架構圖沒這麼醜 在看到公司架構圖標示 Data plane 會「拉取」設定時,其實我一開始沒有多想,且防火牆確實只開了 Data plane 到 Control plane 的 8005 port。 但後來仔細思考,覺得這種設計有點奇怪——如果是 Data plane 不斷輪詢 Control plane 是否有設定變更,那輪詢頻率要怎麼抓?萬一設定異動很頻繁,會不會造成不必要的流量和效能浪費?而且從系統設計的角度來看,應該是由管理端(Control plane)主動通知執行端(Data plane)有異動才比較合理。這讓我開始思考,究竟同步機制的實際運作方式是什麼? 這些疑問促使我去查官方文件,才發現實際上是 Control plane 主動推送設定(如下圖),和我原本的認知有落差。 Control plane 與 Data plane 先簡單說明一下這兩個東西是什麼。 Kong Gateway 在 hybrid mode 下,有兩個重要的角色,分別為 Controle plane 與 Data plane,其功能分別為: ...

July 18, 2025 · 2 分鐘