使用 Dex 在測試中模擬 OAuth 服務

Dex 是一個開源的 OpenID Connect (OIDC) 和 OAuth 2.0 身份提供商,可以配置為針對各種後端身份提供商(如 LDAP、SAML 和 OAuth)進行身份驗證。在 Docker 容器中執行 Dex,允許開發人員模擬 OAuth 2.0 伺服器以進行測試和開發。本指南將引導您使用 Docker 容器將 Dex 設定為 OAuth 模擬伺服器。

如今,OAuth 是 Web 服務中身份驗證的首選,其中大部分服務都允許使用 GitHub、Google 或 Apple 等流行的 OAuth 服務進行訪問。使用 OAuth 保證了更高水平的安全性和簡便性,因為它不需要為每個服務建立新的個人資料。這意味著,透過允許應用程式代表使用者訪問資源而無需共享密碼,OAuth 最大限度地降低了憑據洩露的風險。

在本指南中,您將學習如何:

  • 使用 Docker 啟動一個 Dex 容器。
  • 在 GitHub Action (GHA) 中使用模擬 OAuth,而無需依賴外部 OAuth 提供商。

在 Docker 中使用 Dex

官方的 Docker 映象 for Dex 提供了一種部署和管理 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 的設定,包括聯結器、客戶端和儲存。對於模擬伺服器設定,您可以使用以下最小配置

# 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:為簡單起見,使用記憶體儲存。

  • web:Dex 將在埠 5556 上監聽。

  • staticClients:定義一個客戶端應用程式 (example-app) 及其重定向 URI 和金鑰。

  • enablePasswordDB:啟用靜態密碼認證。

  • staticPasswords:定義一個用於認證的靜態使用者。雜湊值是密碼的 bcrypt 雜湊值。

注意

確保雜湊是您所需密碼的有效 bcrypt 雜湊。您可以使用 bcrypt-generator.com 等工具生成它,或者使用像 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 正在指定埠上監聽的輸出。

在 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 文件