sudo yum install -y https://github.com/apache/apisix/releases/download/2.7/apisix-2.7-0.x86_64.rpm
2021 年 12 月 21 日,作者:Xinxin Zhu & Yilin Zeng
本文詳細說明如何透過 OpenID-Connect 協議和 Keycloak 在 Apache APISIX 中進行身份驗證。
Keycloak 是一個開源的身份和存取管理解決方案,適用於現代應用程式和服務。Keycloak 支援單一登入 (Single-Sign On),使服務可以透過 OpenID Connect、OAuth 2.0 等協議與 Keycloak 介接。Keycloak 也支援與不同的身份驗證服務整合,例如 Github、Google 和 Facebook。
此外,Keycloak 還支援使用者聯合身分驗證,可以透過 LDAP 和 Kerberos 匯入使用者。有關 Keycloak 的更多資訊,請參閱官方文件。
Apache APISIX 是一個動態、即時、高效能的 API 閘道,提供豐富的流量管理功能。該專案提供負載平衡、動態上游、金絲雀發布、熔斷、身份驗證、可觀察性以及許多有用的外掛程式。此外,閘道支援動態外掛程式變更以及熱更新。Apache APISIX 的 OpenID Connect 外掛程式允許使用者透過 OpenID Connect 將傳統身份驗證模式替換為集中式身份驗證模式。
Apache APISIX 執行環境需要 NGINX 和 etcd 的相依性。
在安裝 Apache APISIX 之前,請根據您使用的作業系統安裝相依性。我們提供了 CentOS7、Fedora 31 和 32、Ubuntu 16.04 和 18.04、Debian 9 和 10 以及 macOS 的相依性安裝說明。有關更多詳細資訊,請參閱安裝相依性。
此安裝方法適用於 CentOS 7;請執行以下命令安裝 Apache APISIX。
sudo yum install -y https://github.com/apache/apisix/releases/download/2.7/apisix-2.7-0.x86_64.rpm
執行以下命令來初始化 NGINX 設定檔和 etcd。
make init
執行以下命令來啟動 Apache APISIX。
apisix start
這裡我們使用 docker
來啟動 Keycloak。
docker run -p 8080:8080 -e KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD=password -e DB_VENDOR=h2 -d jboss/keycloak:9.0.2
執行後,您需要驗證 Keycloak 是否已成功啟動。
docker ps
啟動 Keycloak 後,請使用您的瀏覽器存取「http://127.0.0.1:8080/auth/admin/」,並輸入 admin/password
帳戶密碼以登入管理員主控台。
首先,您需要建立一個名為 apisix_test_realm
的領域。在 Keycloak 中,領域是專用於管理專案的工作區,不同領域的資源彼此隔離。
Keycloak 中的領域分為兩類:一類是 master realm
,它是在 Keycloak 首次啟動時建立的,用於管理管理員帳戶和建立其他領域;另一類是 other realm
,它是由 master realm 中的管理員建立的,可用於在此領域中建立、管理和使用使用者和應用程式。第二類是其他領域,由 master realm 中的管理員建立,使用者和應用程式可以在其中建立、管理和使用。如需更多詳細資訊,請參閱 Keycloak 中的領域和使用者部分。
下一步是建立 OpenID Connect Client
。在 Keycloak 中,Client 指的是允許向 Keycloak 發起身份驗證的客戶端。
在此範例場景中,Apache APISIX
等同於一個負責向 Keycloak 發起身份驗證請求的客戶端,因此我們建立一個名為 apisix
的客戶端。有關客戶端的更多詳細資訊,請參閱 Keycloak OIDC 客戶端。
建立客戶端後,您需要為該客戶端設定 Apache APISIX 存取類型。
在 Keycloak 中,有三種存取類型
機密 (Confidential):用於需要執行瀏覽器登入的應用程式,客戶端將透過 client secret
取得 access token
,主要用於由伺服器呈現的 Web 系統。
公開 (Public):用於需要執行瀏覽器登入的應用程式,主要用於使用 vue 和 react 實作的前端專案。
僅限持有者 (Bearer-only):用於不需要執行瀏覽器登入的應用程式,僅允許使用 bearer token
存取,主要用於 RESTful API 場景。
有關客戶端設定的更多詳細資訊,請參閱 Keycloak OIDC 客戶端進階設定。
由於我們使用 Apache APISIX 作為伺服器端的客戶端,我們可以選擇「機密」存取類型或「僅限持有者」存取類型。在下面的示範中,我們使用「機密」存取類型作為範例。
Keycloak 支援與其他第三方使用者系統介接,例如 Google 和 Facebook,或者使用 LDAP 匯入或手動建立使用者。在這裡,我們將使用「手動建立使用者」進行示範。
然後在「認證 (Credentials)」頁面中設定使用者的密碼。
設定 Keycloak 後,您需要建立路由並開啟 Openid-Connect
外掛程式。有關此外掛程式設定的詳細資訊,請參閱Apache APISIX OpenID-Connect 外掛程式。
在上面的設定中。
client_id
是之前建立客戶端時使用的名稱,即 apisix
client_secret
應從 Clients-apisix-Credentials 中取得,例如:d5c42c50-3e71-4bbbe-aa9e-31083ab29da4
。
前往「領域設定 (Realm Settings)」-「一般 (General)」-「端點 (Endpoints)」,選擇「OpenID 端點設定 (OpenID Endpoint Configuration)」連結並複製該連結指向的位址,例如:`http://127.0.0.1:8080/auth/realms/apisix_test_realm/.well-known/openid-configuration`。
使用以下命令存取 Apache APISIX 管理介面以建立路由,將上游設定為 httpbin.org
,並啟用 OpenID Connect 外掛程式進行身份驗證。
注意:如果您在建立客戶端時選擇 bearer-only
作為存取類型,則在設定路由時需要將 bearer_only
設定為 true,以便存取 Apache APISIX 時不會跳轉到 Keycloak 登入畫面。
curl -XPOST 127.0.0.1:9080/apisix/admin/routes -H "X-Api-Key: edd1c9f034335f136f87ad84b625c8f1" -d '{ "uri":"/*", "plugins":{ "openid-connect":{ "client_id":"apisix", "client_secret":"d5c42c50-3e71-4bbe-aa9e-31083ab29da4", "discovery":"http://127.0.0.1:8080/auth/realms/apisix_test_realm/.well-known/openid-configuration", "scope":"openid profile", "bearer_only":false, "realm":"apisix_test_realm", "introspection_endpoint_auth_method":"client_secret_post", "redirect_uri":"http://127.0.0.1:9080/" } }, "upstream":{ "type":"roundrobin", "nodes":{ "httpbin.org:80":1 } } }'
完成上述設定後,我們準備在 Apache APISIX 中執行相關的存取測試。
使用您的瀏覽器存取 http://127.0.0.1:9080/image/png
。
由於已啟用 OpenID-Connect 外掛程式且 bearer-only
設定為 false
,因此當您第一次存取此路徑時,Apache APISIX 會將您重新導向至 Keycloak 中 apisix_test_realm
設定的登入畫面並發出使用者登入請求。
輸入在 Keycloak 設定期間建立的使用者 peter 以完成使用者登入。
成功登入後,瀏覽器會再次將連結重新導向至 http://127.0.0.1:9080/image/png
並成功存取影像內容。該內容與上游 http://httpbin.org/image/png
的內容相同。
測試完成後,請使用您的瀏覽器存取 http:/127.0.0.1:9080/logout
以登出您的帳戶。
注意:登出路徑可以使用 OpenID-Connect 外掛程式設定中的 logout_path
指定,預設為 logout
。
本文說明了如何使用 OpenID-Connect 協議和 Keycloak 在 Apache APISIX 中進行身份驗證的步驟。透過與 Keycloak 整合,Apache APISIX 可以設定為驗證使用者和應用程式服務,這大大減少了開發工作。
有關 Apache APISIX 中身份驗證實作的更多資訊,請參閱Apache APISIX 部落格。