Skip to main content

Kong 认证与鉴权配置指南

Kong 提供了多种认证和鉴权机制来保护您的 API 服务。以下是 Kong 的主要认证鉴权方式及其配置方法。

1. 基本认证 (Basic Authentication)

启用基本认证插件

curl -X POST http://localhost:8001/services/{service}/plugins \
  --data "name=basic-auth" \
  --data "config.hide_credentials=true"

创建消费者

curl -X POST http://localhost:8001/consumers \
  --data "username=johndoe"

添加凭证

curl -X POST http://localhost:8001/consumers/johndoe/basic-auth \
  --data "username=john" \
  --data "password=doe"

测试请求

curl -i -X GET http://localhost:8000/{route-path} \
  -H "Authorization: Basic $(echo -n 'john:doe' | base64)"

2. JWT 认证 (JSON Web Tokens)

启用 JWT 插件

curl -X POST http://localhost:8001/services/{service}/plugins \
  --data "name=jwt" \
  --data "config.claims_to_verify=exp" \
  --data "config.key_claim_name=kid"

创建消费者

curl -X POST http://localhost:8001/consumers \
  --data "username=jwt-user"

生成 JWT 凭证

curl -X POST http://localhost:8001/consumers/jwt-user/jwt

使用 JWT 访问

curl -i -X GET http://localhost:8000/{route-path} \
  -H "Authorization: Bearer <JWT_TOKEN>"

3. OAuth2 认证

启用 OAuth2 插件

curl -X POST http://localhost:8001/services/{service}/plugins \
  --data "name=oauth2" \
  --data "config.enable_authorization_code=true" \
  --data "config.enable_client_credentials=true" \
  --data "config.mandatory_scope=true" \
  --data "config.scopes=email,phone,address" \
  --data "config.token_expiration=7200"

创建消费者

curl -X POST http://localhost:8001/consumers \
  --data "username=oauth2-user"

创建 OAuth2 应用

curl -X POST http://localhost:8001/consumers/oauth2-user/oauth2 \
  --data "name=MyApp" \
  --data "redirect_uris=http://myapp.com/callback" \
  --data "client_id=CLIENT_ID" \
  --data "client_secret=CLIENT_SECRET"

获取访问令牌

curl -X POST http://localhost:8000/{route-path}/oauth2/token \
  --data "grant_type=client_credentials" \
  --data "client_id=CLIENT_ID" \
  --data "client_secret=CLIENT_SECRET" \
  --data "scope=email"

4. Keycloak 集成 (OpenID Connect)

启用 OIDC 插件

curl -X POST http://localhost:8001/services/{service}/plugins \
  --data "name=openid-connect" \
  --data "config.issuer=https://keycloak.example.com/auth/realms/myrealm" \
  --data "config.client_id=CLIENT_ID" \
  --data "config.client_secret=CLIENT_SECRET" \
  --data "config.auth_methods=authorization_code,bearer" \
  --data "config.scopes=openid,profile,email" \
  --data "config.redirect_uri=https://myapp.com/callback"

5. ACL 访问控制

启用 ACL 插件

curl -X POST http://localhost:8001/services/{service}/plugins \
  --data "name=acl" \
  --data "config.allow=group1,group2" \
  --data "config.hide_groups_header=true"

为消费者添加 ACL 组

curl -X POST http://localhost:8001/consumers/{consumer}/acls \
  --data "group=group1"

6. 组合认证策略

Kong 支持多种认证方式的组合使用:

# 启用基本认证
curl -X POST http://localhost:8001/services/{service}/plugins \
  --data "name=basic-auth"

# 启用 JWT 认证
curl -X POST http://localhost:8001/services/{service}/plugins \
  --data "name=jwt" \
  --data "config.anonymous=<anonymous-consumer-id>"

7. 高级配置技巧

匿名访问控制

curl -X POST http://localhost:8001/services/{service}/plugins \
  --data "name=key-auth" \
  --data "config.anonymous=<anonymous-consumer-id>"

跨域认证 (CORS)

curl -X POST http://localhost:8001/services/{service}/plugins \
  --data "name=cors" \
  --data "config.origins=*" \
  --data "config.methods=GET,POST" \
  --data "config.headers=Accept,Authorization" \
  --data "config.credentials=true"

速率限制保护认证端点

curl -X POST http://localhost:8001/services/{service}/plugins \
  --data "name=rate-limiting" \
  --data "config.minute=5" \
  --data "config.policy=local"

8. 生产环境最佳实践

  1. 使用 HTTPS:所有认证流量必须加密
  2. 定期轮换密钥:特别是 JWT 签名密钥和 OAuth2 密钥
  3. 最小权限原则:只授予必要的权限
  4. 监控认证尝试:检测暴力破解行为
  5. 结合 WAF:使用 Web 应用防火墙增强保护
  6. 日志审计:记录所有认证相关活动

9. 故障排除

常见问题1:认证失败

  • 检查消费者是否已创建
  • 验证凭证是否正确
  • 检查插件配置是否正确
  • 查看 Kong 错误日志

常见问题2:JWT 过期

  • 检查令牌有效期
  • 验证签名算法是否匹配
  • 确认密钥是否正确

常见问题3:OAuth2 回调问题

  • 检查 redirect_uri 是否匹配
  • 验证客户端 ID 和密钥
  • 确保授权范围正确

通过合理配置这些认证机制,您可以构建一个安全可靠的 API 网关系统。