使用 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 Action (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 和密钥。
-
enablePasswordDB:启用静态密码身份验证。
-
staticPasswords:定义用于身份验证的静态用户。哈希值是密码的 bcrypt 哈希值。
Note确保哈希值是您所需密码的有效 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 正在指定的端口上监听。
在 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/ # 示例:http://localhost:5555/callback
connectors:
# mockCallback 连接器始终返回用户 'kilgore@kilgore.trout'。
- type: mockCallback
id: mock
name: Mock现在,您可以将 Dex 服务插入到 ~/.github/workflows/ci.yaml 文件中:
[...]
jobs:
test-oauth:
runs-on: ubuntu-latest
steps:
- name: 安装 Dex
run: |
curl -L https://github.com/dexidp/dex/releases/download/v2.37.0/dex_linux_amd64 -o dex
chmod +x dex
- name: 启动 Dex 服务器
run: |
nohup ./dex serve config.yaml > dex.log 2>&1 &
sleep 5 # 给 Dex 启动时间
[...]结论
通过遵循本指南,您已经使用 Docker 将 Dex 设置为 OAuth 模拟服务器。此设置对于测试和开发非常宝贵,允许您模拟 OAuth 流程而无需依赖外部身份认证服务。有关更高级的配置和集成,请参阅 Dex 文档。