OAuth2 认证服务器搭建教程
OAuth2 是现代应用中最广泛使用的授权协议,允许第三方应用在不暴露用户密码的情况下获取有限的资源访问权限。本文将使用 Ory Hydra 在搬瓦工 VPS 上搭建生产级的 OAuth2 认证服务器。Ory Hydra 是一个经过安全审计的开源 OAuth2 和 OpenID Connect 提供商,用 Go 语言编写,性能出色。
一、OAuth2 基础概念
- 资源所有者:通常是终端用户。
- 客户端:请求访问资源的应用程序。
- 授权服务器:验证身份并颁发令牌(本文搭建的就是这个)。
- 资源服务器:托管受保护资源的 API 服务。
- 授权码模式:最安全的授权流程,适合服务端应用。
- 客户端凭证模式:适合服务间通信(M2M)。
二、使用 Docker 部署 Ory Hydra
mkdir -p /opt/hydra && cd /opt/hydra
创建 docker-compose.yml:
version: '3.8'
services:
hydra:
image: oryd/hydra:v2.2
restart: always
ports:
- "4444:4444" # 公开 API(面向客户端)
- "4445:4445" # 管理 API(仅内部访问)
environment:
DSN: postgres://hydra:hydra_password@db:5432/hydra?sslmode=disable
URLS_SELF_ISSUER: https://auth.example.com
URLS_CONSENT: https://login.example.com/consent
URLS_LOGIN: https://login.example.com/login
URLS_LOGOUT: https://login.example.com/logout
SECRETS_SYSTEM: 你的32字符以上随机密钥
OIDC_SUBJECT_IDENTIFIERS_SUPPORTED_TYPES: public,pairwise
OIDC_SUBJECT_IDENTIFIERS_PAIRWISE_SALT: 你的随机盐值
SERVE_PUBLIC_CORS_ENABLED: "true"
SERVE_PUBLIC_CORS_ALLOWED_ORIGINS: https://your-app.example.com
LOG_LEVEL: info
depends_on:
- db
command: serve all --dev
db:
image: postgres:16-alpine
restart: always
environment:
POSTGRES_DB: hydra
POSTGRES_USER: hydra
POSTGRES_PASSWORD: hydra_password
volumes:
- hydra_db:/var/lib/postgresql/data
volumes:
hydra_db:
# 启动数据库
docker compose up -d db
# 运行数据库迁移
docker compose exec hydra hydra migrate sql --yes postgres://hydra:hydra_password@db:5432/hydra?sslmode=disable
# 启动所有服务
docker compose up -d
三、Nginx 反向代理
# 公开 API(面向客户端和用户)
server {
listen 443 ssl http2;
server_name auth.example.com;
ssl_certificate /etc/letsencrypt/live/auth.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/auth.example.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:4444;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
# 管理 API(仅限内部访问)
server {
listen 127.0.0.1:4445;
location / {
proxy_pass http://127.0.0.1:4445;
}
}
nginx -t && systemctl reload nginx
四、创建 OAuth2 客户端
# 创建授权码模式客户端(Web 应用)
docker compose exec hydra hydra create oauth2-client \
--endpoint http://127.0.0.1:4445 \
--name "My Web App" \
--grant-type authorization_code,refresh_token \
--response-type code \
--scope openid,offline_access,email,profile \
--redirect-uri https://your-app.example.com/callback \
--token-endpoint-auth-method client_secret_post
# 创建客户端凭证模式(服务间通信)
docker compose exec hydra hydra create oauth2-client \
--endpoint http://127.0.0.1:4445 \
--name "Backend Service" \
--grant-type client_credentials \
--scope api:read,api:write \
--token-endpoint-auth-method client_secret_basic
# 列出所有客户端
docker compose exec hydra hydra list oauth2-clients --endpoint http://127.0.0.1:4445
五、OAuth2 授权流程测试
# 客户端凭证模式测试
curl -X POST https://auth.example.com/oauth2/token \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=client_credentials&client_id=CLIENT_ID&client_secret=CLIENT_SECRET&scope=api:read"
# 验证令牌
curl -X POST https://auth.example.com/oauth2/introspect \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "token=ACCESS_TOKEN"
# 获取 OpenID Connect 发现文档
curl https://auth.example.com/.well-known/openid-configuration
六、登录和同意页面
Hydra 不内置登录 UI,需要自己实现登录和同意页面。Ory 提供了参考实现:
# 部署 Hydra 登录同意 UI 示例
docker run -d \
--name hydra-login-consent \
-p 3001:3000 \
-e HYDRA_ADMIN_URL=http://hydra:4445 \
--network hydra_default \
oryd/hydra-login-consent-node:latest
七、安全加固
- 生产环境务必移除
--dev标志。 - 管理 API(4445 端口)绝不应暴露到公网。
- 定期轮换系统密钥和客户端密钥。
- 启用访问令牌加密和签名。
- 配置合理的令牌有效期。
# 备份数据
docker compose exec db pg_dump -U hydra hydra > /root/backups/hydra_$(date +%Y%m%d).sql
总结
Ory Hydra 是搭建生产级 OAuth2 认证服务器的最佳开源方案之一,经过安全审计且性能出色。在搬瓦工 VPS 上通过 Docker 部署方便快捷。如果你需要更完整的身份认证解决方案(包括用户注册、登录、密码重置等),可以配合 Ory Kratos 使用,或参考 单点登录 SSO 系统搭建。
选购搬瓦工 VPS 请查看 全部方案,购买时使用优惠码 NODESEEK2026 可享受 6.77% 的折扣,通过 bwh81.net 进入官网购买。