使用 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 提供商。
将 Dex 与 Docker 结合使用
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 的设置,包括连接器、客户端和存储。对于模拟服务器设置,您可以使用以下最小配置:
# config.yaml
issuer: http://localhost:5556/dex
storage:
type: memory
web:
http: 0.0.0.0:5556
staticClients:
- id: example-app
redirectURIs:
- 'http://localhost: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 和 secret。
enablePasswordDB:启用静态密码身份验证。
staticPasswords:定义一个用于身份验证的静态用户。hash 是密码的 bcrypt 哈希。
注意
确保哈希是您所需密码的有效 bcrypt 哈希。您可以使用 bcrypt-generator.com 等工具生成,或使用 htpasswd 等 CLI 工具,例如以下示例:
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: http://localhost: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 文档。