使用 Dex 在測試中模擬 OAuth 服務
Dex 是一個開源的 OpenID Connect (OIDC) 和 OAuth 2.0 身份提供者,可以設定為對各種後端身份提供者進行驗證,例如 LDAP、SAML 和 OAuth。在 Docker 容器中執行 Dex,讓開發者可以模擬 OAuth 2.0 伺服器進行測試和開發。本指南將帶您瞭解如何使用 Docker 容器將 Dex 設定為 OAuth 模擬伺服器。
如今 OAuth 是 Web 服務中首選的身份驗證方式,大多數服務都提供了使用流行的 OAuth 服務(如 GitHub、Google 或 Apple)進行登入的功能。使用 OAuth 可確保更高層級的安全性和簡化流程,因為無需為每個服務建立新的設定檔。這意味著,透過允許應用程式在使用者授權下存取資源而無需共享密碼,OAuth 最大限度地降低了憑證洩露的風險。
在本指南中,您將學習如何:
- 使用 Docker 啟動 Dex 容器。
- 在 GitHub Actions (GHA) 中使用模擬 OAuth,而無需依賴外部 OAuth 提供者。
在 Docker 中使用 Dex
官方的 Dex Docker 映像檔提供了一種部署和管理 Dex 執行個體的便捷方式。Dex 適用於各種 CPU 架構,包括 amd64、armv7 和 arm64,確保與不同裝置和平台的相容性。您可以在 Dex 文件網站上瞭解更多關於 Dex 獨立執行的資訊。
先決條件
Docker Compose:建議用於管理多容器 Docker 應用程式。
使用 Docker 設定 Dex
首先為您的 Dex 專案建立一個目錄
mkdir dex-mock-server
cd dex-mock-server請按照以下結構組織您的專案
dex-mock-server/
├── config.yaml
└── compose.yaml建立 Dex 設定檔:config.yaml 檔案定義了 Dex 的設定,包括連接器 (connectors)、用戶端 (clients) 和儲存 (storage)。對於模擬伺服器設定,您可以使用以下最小化配置
# config.yaml
issuer: https://:5556/dex
storage:
type: memory
web:
http: 0.0.0.0:5556
staticClients:
- id: example-app
redirectURIs:
- 'https://:5555/callback'
name: 'Example App'
secret: ZXhhbXBsZS1hcHAtc2VjcmV0
enablePasswordDB: true
staticPasswords:
- email: "admin@example.com"
hash: "$2a$10$2b2cU8CPhOTaGrs1HRQuAueS7JTT5ZHsHSzYiFPm1leZck7Mc8T4W"
username: "admin"
userID: "1234"說明
issuer:Dex 的公開 URL。
storage:為簡單起見,使用記憶體內儲存 (in-memory storage)。
web:Dex 將監聽 5556 連接埠。
staticClients:定義一個用戶端應用程式 (example-app) 及其重新導向 URI 和金鑰 (secret)。
enablePasswordDB:啟用靜態密碼驗證。
staticPasswords:定義一個用於驗證的靜態使用者。雜湊值是密碼的 bcrypt 雜湊。
注意確保雜湊值是您所需密碼的有效 bcrypt 雜湊。您可以使用 bcrypt-generator.com 等工具產生,或使用 CLI 工具(如下例中的 htpasswd):
echo password | htpasswd -BinC 10 admin | cut -d: -f2
設定好 Docker Compose 後,啟動 Dex
# docker-compose.yaml
services:
dex:
image: dexidp/dex:latest
container_name: dex
ports:
- "5556:5556"
volumes:
- ./config.yaml:/etc/dex/config.yaml
command: ["dex", "serve", "/etc/dex/config.yaml"]現在可以使用 docker compose 指令執行容器。
docker compose up -d此指令將下載 Dex Docker 映像檔(如果尚未取得)並在背景模式下啟動容器。
要驗證 Dex 是否正在執行,請檢查記錄檔以確保 Dex 成功啟動
docker compose logs -f dex您應該會看到顯示 Dex 正在監聽指定連接埠的輸出。
在 GitHub Actions (GHA) 中使用 Dex OAuth 測試
要測試 OAuth 流程,您需要一個設定為對 Dex 進行驗證的用戶端應用程式。最典型的用例之一是在 GitHub Actions 內部使用它。由於 Dex 支援模擬驗證,您可以按照文件中的建議預定義測試使用者。config.yaml 檔案看起來應該像這樣
issuer: http://127.0.0.1:5556/dex
storage:
type: memory
web:
http: 0.0.0.0:5556
oauth2:
skipApprovalScreen: true
staticClients:
- name: TestClient
id: client_test_id
secret: client_test_secret
redirectURIs:
- http://{ip-your-app}/path/to/callback/ # example: https://:5555/callback
connectors:
# mockCallback connector always returns the user 'kilgore@kilgore.trout'.
- type: mockCallback
id: mock
name: Mock現在您可以將 Dex 服務插入到您的 ~/.github/workflows/ci.yaml 檔案中
[...]
jobs:
test-oauth:
runs-on: ubuntu-latest
steps:
- name: Install Dex
run: |
curl -L https://github.com/dexidp/dex/releases/download/v2.37.0/dex_linux_amd64 -o dex
chmod +x dex
- name: Start Dex Server
run: |
nohup ./dex serve config.yaml > dex.log 2>&1 &
sleep 5 # Give Dex time to start
[...]結論
遵循本指南,您已使用 Docker 將 Dex 設定為 OAuth 模擬伺服器。此設定對於測試和開發非常寶貴,可讓您在不依賴外部身份提供者的情況下模擬 OAuth 流程。有關更進階的配置和整合,請參閱 Dex 文件。