# Kong 认证与鉴权配置指南

Kong 提供了多种认证和鉴权机制来保护您的 API 服务。以下是 Kong 的主要认证鉴权方式及其配置方法。

## 1. 基本认证 (Basic Authentication)

### 启用基本认证插件
```bash
curl -X POST http://localhost:8001/services/{service}/plugins \
  --data "name=basic-auth" \
  --data "config.hide_credentials=true"
```

### 创建消费者
```bash
curl -X POST http://localhost:8001/consumers \
  --data "username=johndoe"
```

### 添加凭证
```bash
curl -X POST http://localhost:8001/consumers/johndoe/basic-auth \
  --data "username=john" \
  --data "password=doe"
```

### 测试请求
```bash
curl -i -X GET http://localhost:8000/{route-path} \
  -H "Authorization: Basic $(echo -n 'john:doe' | base64)"
```

## 2. JWT 认证 (JSON Web Tokens)

### 启用 JWT 插件
```bash
curl -X POST http://localhost:8001/services/{service}/plugins \
  --data "name=jwt" \
  --data "config.claims_to_verify=exp" \
  --data "config.key_claim_name=kid"
```

### 创建消费者
```bash
curl -X POST http://localhost:8001/consumers \
  --data "username=jwt-user"
```

### 生成 JWT 凭证
```bash
curl -X POST http://localhost:8001/consumers/jwt-user/jwt
```

### 使用 JWT 访问
```bash
curl -i -X GET http://localhost:8000/{route-path} \
  -H "Authorization: Bearer <JWT_TOKEN>"
```

## 3. OAuth2 认证

### 启用 OAuth2 插件
```bash
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"
```

### 创建消费者
```bash
curl -X POST http://localhost:8001/consumers \
  --data "username=oauth2-user"
```

### 创建 OAuth2 应用
```bash
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"
```

### 获取访问令牌
```bash
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 插件
```bash
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 插件
```bash
curl -X POST http://localhost:8001/services/{service}/plugins \
  --data "name=acl" \
  --data "config.allow=group1,group2" \
  --data "config.hide_groups_header=true"
```

### 为消费者添加 ACL 组
```bash
curl -X POST http://localhost:8001/consumers/{consumer}/acls \
  --data "group=group1"
```

## 6. 组合认证策略

Kong 支持多种认证方式的组合使用：

```bash
# 启用基本认证
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. 高级配置技巧

### 匿名访问控制
```bash
curl -X POST http://localhost:8001/services/{service}/plugins \
  --data "name=key-auth" \
  --data "config.anonymous=<anonymous-consumer-id>"
```

### 跨域认证 (CORS)
```bash
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"
```

### 速率限制保护认证端点
```bash
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 网关系统。