本文介紹了Apache APISIX 如何與 Hydra 整合實現集中式身份認證。
背景介紹
Apache APISIX
Apache APISIX 是一個開源的雲原生 API 閘道器,作為 API 閘道器,它兼具動態、實時、高效能等特點,提供了負載均衡、動態上游、灰度釋出、服務熔斷、身份認證、可觀測性等豐富的流量管理功能。你可以使用 APISIX 來處理傳統的南北向流量,以及服務間的東西向流量,也可以當做 K8s Ingress controller 來使用。
APISIX 的 OpenID Connect 外掛支援 OpenID Connect 協議,使用者可以使用該外掛讓 APISIX 對接眾多鑑權服務提供商,作為集中式認證閘道器部署於企業中。
Hydra
Ory Hydra 是支援 OAuth 2.0 和 OpenID Connect 協議的身份提供商之一,基於 OAuth 2.0 授權框架以及 Open ID Connect Core 1.0 框架實現,兼具開源與雲原生特性。它可以與任何登入系統整合,通過 OAuth 2.0 Acces、Refresh 和 ID Tokens,使得第三方能夠輕鬆訪問你的 API,實現使用者隨時隨地與任何應用程式的互動。
Ory Hydra 採用 Go 語言編寫,為幾乎所有語言都提供了 SDK,包括 Dart、.NET、Go、Java、PHP、Python、Ruby、Rust 和 Typescript。它適用於任何登入系統,並且可以輕鬆自定義登入體驗。
簡介
OpenID 是一種集中認證模式,它是一個去中心化的身份認證系統。使用 OpenID 的好處是,使用者只需要在一個 OpenID 身份提供方的網站上註冊和登入,使用一份賬戶密碼資訊即可訪問不同應用。
通過 APISIX 支援的 openid-connect
外掛,可以與支援 OpenID Connect 協議的認證程式整合。比如 Ory Hydra。
Ory Hydra 的最大優勢之一是:它實現了 OAuth 和 OpenID Connect 標準,而不是強制你使用“Hydra 使用者管理”(登入、登出、配置檔案管理、註冊)、特定模板引擎或者預定義的前端。
它允許使用你的程式所需的身份驗證機制(基於令牌的 2FA、SMS 2FA 等),並且在你的技術堆疊中實現使用者管理和登入。當然你也可以使用現有的解決方案,例如 authboss。它為你提供 OAuth 2.0 和 OpenID Connect 的所有優勢功能,同時對業務邏輯和技術堆疊的侵入性最小。
OAuth 2.0 適用於多種環境和多用途場景。以下資訊可能會幫助你確定 OAuth 2.0 和 Hydra 是否適合某個用例:https://www.ory.sh/docs/hydra
- 允許第三方的合作方訪問你的 API。
- 成為像 Google、Facebook 或 Microsoft 這樣的身份提供者。
- 使瀏覽器、移動裝置或可穿戴應用程式能夠訪問你的 API:執行 OAuth2 提供程式可以很好地實現這一點。你不必在裝置上儲存密碼,並且可以隨時撤銷訪問令牌。
- 想限制後端服務可以相互讀取的資訊型別。例如,只允許評論服務獲取使用者配置檔案更新,但不能讀取使用者密碼。
如何操作
接下來,將使用真實示例為你展示 APISIX 如何與 Hydra 整合。在該示例中將使用 Docker 執行所需的環境,請在執行本操作前安裝完成 Docker。
步驟一:建立並執行資料庫
為了快速部署測試環境,我們將使用 Docker 執行 PostgreSQL 作為 Hydra 的資料庫。建議不要在生產環境使用 Docker 執行資料庫。
docker network create hydraguide && \
docker run \
--network hydraguide \
--name ory-hydra-example--postgres \
-e POSTGRES_USER=hydra \
-e POSTGRES_PASSWORD=secret \
-e POSTGRES_DB=hydra \
-d postgres:9.6
上述命令將建立一個名稱為 hydraguide
的網路,並且啟動一個名稱為 ory-hydra-example--postgres
的 Postgres 例項,該例項建立了資料庫hydra
,使用者hydra
和使用者密碼secret
。
步驟二:部署 Hydra
該步驟中會分別將 4444
和 4445
對映到 5444
和 5445
埠,請確保這些埠未被佔用。
- 系統金鑰只能針對新資料庫設定,不支援金鑰輪換。 此金鑰用於加密資料庫,每次程式(重新)啟動時都需要設定為相同的值。 你可以使用
/dev/urandom
生成金鑰。但請確保在你定義它的時候,該金鑰都必須相同。 例如,你可以將值儲存在某處:
export SECRETS_SYSTEM=$(export LC_CTYPE=C; cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1)
通過配置環境變數,設定 Hydra 的資料庫 URL 指向 Postgres 例項。
export DSN=postgres://hydra:secret@ory-hydra-example--postgres:5432/hydra?sslmode=disable
- Ory Hydra 沒有自動遷移 SQL,因此你需要手動執行遷移資料庫的操作。
docker pull oryd/hydra:v1.10.6 && \
docker run -it --rm \
--network hydraguide \
oryd/hydra:v1.10.6 \
migrate sql --yes $DSN
- 通過以下命令執行 Hydra 伺服器。更多資訊,請參考 deploy-ory-hydra。
docker run -d \
--name ory-hydra-example--hydra \
--network hydraguide \
-p 5444:4444 \
-p 5445:4445 \
-e SECRETS_SYSTEM=$SECRETS_SYSTEM \
-e DSN=$DSN \
-e URLS_SELF_ISSUER=https://localhost:5444/ \
-e URLS_CONSENT=http://localhost:9020/consent \
-e URLS_LOGIN=http://localhost:9020/login \
oryd/hydra:v1.10.6 serve all
你可以使用如下命令檢視 Hydra 的日誌。如果你未指定 Hydra 的密碼,可以在日誌中查到相關資訊,否則將無法重新啟動 Hydra。
docker logs ory-hydra-example--hydra
你也可以使用以下命令檢視 Hydra 相關介紹及操作命令。
docker run -it --rm --entrypoint hydra oryd/hydra:v1.10.6 help serve
步驟三:部署登入和驗證程式
Login Provider 和 Consent Provider 可以是兩個獨立的 Web 服務。 Hydra 提供了示例程式,它在一個應用程式中結合了這兩個功能。 接下來。我們將使用 Docker 部署該應用程式。
docker pull oryd/hydra-login-consent-node:v1.10.6 && \
docker run -d \
--name ory-hydra-example--consent \
-p 9020:3000 \
--network hydraguide \
-e HYDRA_ADMIN_URL=https://ory-hydra-example--hydra:4445 \
-e NODE_TLS_REJECT_UNAUTHORIZED=0 \
oryd/hydra-login-consent-node:v1.10.6
你可以使用以下命令檢查程式是否執行正常:
docker logs ory-hydra-example--consent
正常返回結果:
> hydra-login-consent-logout@0.0.0 serve /usr/src/app
> node lib/app.js
Listening on http://0.0.0.0:3000
步驟四:執行 OAuth 2.0 授權程式碼流程
Hydra 支援通過 CLI 設定 OAuth 2.0 使用者和 OAuth 2.0 回撥 URL 的功能,一般情況下,這是一個請求訪問伺服器上的使用者資源的第三方應用程式。
配置 APISIX openid-connect
外掛時需要提供這些資訊:
id
對應的是下述路由中外掛配置的client_id
。secret
對應的是下述路由中外掛配置的client_secret
。scope
對應的是下述路由中外掛配置的scope
。
docker run --rm -it \
-e HYDRA_ADMIN_URL=https://ory-hydra-example--hydra:4445 \
-- network hydraguide \
oryd/hydra:v1.10.6 \
clients create --skip-tls-verify \
--id facebook-photo-backup \
--secret some-secret \
--grant-types authorization_code,refresh_token,client_credentials,implicit \
--response-types token,code,id_token \
--scope openid,offline,photos.read \
--callbacks http://127.0.0.1:9010/callback
以下示例將執行一個 OAuth 2.0 授權流程。為簡化此操作,Hydra CLI 提供了一個名為 hydra token user
的輔助命令。
docker run --rm -it \
--network hydraguide \
-p 9010:9010 \
oryd/hydra:v1.10.6 \
token user --skip-tls-verify \
--port 9010 \
--auth-url https://localhost:5444/oauth2/auth \
--token-url https://localhost:5444/oauth2/token \
--client-id facebook-photo-backup \
--client-secret some-secret \
--scope openid,offline,photos.read
返回結果如下則表示配置正常:
Setting up home route on http://127.0.0.1:9010/
Setting up callback listener on http://127.0.0.1:9010/callback
Press ctrl + c on Linux / Windows or cmd + c on OSX to end the process.
If your browser doesn't open automatically, navigate to:
http://127.0.0.1:9010/
該步驟完成後將會啟動一個使用者登入程式,我們將在下一步驟中使用該程式。
步驟五:啟動 APISIX 並配置路由
如果你還沒有安裝 APISIX,請參考:安裝 APISIX。
安裝完成後,僅需建立路由並配置openid-connect
外掛即可。為了更直觀地驗證效果,我們還需要啟動了一個 NGINX 服務當做上游,你也可以使用已有的上游服務。
注意:本示例中的 APISIX 是安裝在宿主機上,如果是使用 Docker 啟動的 APISIX,可能會出現網路問題。
- 首先使用 Docker 建立一個 NGINX 上游。
docker run -d --name test-nginx -p 8083:80 nginx
- 通過以下命令建立路由,並配置
openid-connect
外掛。
其中 client_id
和 client_secret
和 scope
是步驟四中設定的 ID。你可以參考 Preparing for Production 獲取其他資訊。從上述頁面,我們可以看到 discovery
的地址為 https://{IP:Port}/.well-known/openid-configuration
。
curl http://127.0.0.1:9080/apisix/admin/routes/1 \
-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"uri":"/*",
"plugins":{
"openid-connect":{
"client_id":"facebook-photo-backup",
"client_secret":"some-secret",
"discovery":"https://127.0.0.1:5444/.well-known/openid-configuration",
"scope":"openid",
"token_endpoint_auth_method": "client_secret_basic",
"bearer_only": false,
"redirect_uri":"http://127.0.0.1:9080/callback"
}
},
"upstream":{
"type":"roundrobin",
"nodes":{
"127.0.0.1:8083":1
}
}
}'
步驟六:訪問 APISIX
- 在瀏覽器中輸入http://127.0.0.1:9080/index.html,由於已經開啟了
openid-connect
外掛,所以頁面被重定向到登入頁面。輸入使用者驗證程式中預設的賬號密碼。
- 選擇認證協議,並允許訪問。
- 登入成功之後,就可以訪問到上游服務的頁面。
總結
本文主要介紹了 Hydra 如何與 APISIX 進行整合以及 Hydra 的應用場景。你只需要在伺服器上安裝 Hydra 相關的程式,就可以直接使用它作為你的身份認證程式。這種認證方式可以減少學習和維護成本,也為使用者提供了安全和精簡的體驗。
參考:
https://www.ory.sh/docs/hydra...
https://www.ory.sh/docs/hydra...