使用 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 文档。