使用 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 文件

© . This site is unofficial and not affiliated with Kubernetes or Docker Inc.