This commit is contained in:
Lizandro Guarnizo
2026-05-12 10:29:00 -05:00
parent f1d73ae63b
commit 40131e7266
3 changed files with 204 additions and 35 deletions
+38 -9
View File
@@ -12,13 +12,18 @@ import (
const cloudflareBaseURL = "https://api.cloudflare.com/client/v4"
// CloudflareClient es el cliente HTTP para la API de Cloudflare.
// Soporta dos modos de autenticación:
// - API Token (recomendado): Authorization: Bearer <token>
// - Global API Key (legacy): X-Auth-Email + X-Auth-Key
type CloudflareClient struct {
token string
token string // API Token o Global API Key
email string // Solo para Global API Key
globalKey bool // true = usar X-Auth-Email + X-Auth-Key
accountID string
httpClient *http.Client
}
// NewCloudflareClient crea un cliente con el API Token.
// NewCloudflareClient crea un cliente con API Token (Bearer).
func NewCloudflareClient(token, accountID string) *CloudflareClient {
return &CloudflareClient{
token: token,
@@ -29,14 +34,40 @@ func NewCloudflareClient(token, accountID string) *CloudflareClient {
}
}
// get realiza una petición GET autenticada y devuelve el body.
// NewCloudflareClientGlobalKey crea un cliente con Global API Key (X-Auth-Email + X-Auth-Key).
func NewCloudflareClientGlobalKey(email, apiKey, accountID string) *CloudflareClient {
return &CloudflareClient{
token: apiKey,
email: email,
globalKey: true,
accountID: accountID,
httpClient: &http.Client{
Timeout: 20 * time.Second,
},
}
}
// IsGlobalKey indica si el cliente usa Global API Key en lugar de API Token.
func (c *CloudflareClient) IsGlobalKey() bool { return c.globalKey }
// addAuth aplica los headers de autenticación correctos según el tipo de credencial.
func (c *CloudflareClient) addAuth(req *http.Request) {
if c.globalKey {
req.Header.Set("X-Auth-Email", c.email)
req.Header.Set("X-Auth-Key", c.token)
} else {
req.Header.Set("Authorization", "Bearer "+c.token)
}
req.Header.Set("Content-Type", "application/json")
}
// get realiza una petición GET autenticada y decodifica el result.
func (c *CloudflareClient) get(path string, dest interface{}) error {
req, err := http.NewRequest(http.MethodGet, cloudflareBaseURL+path, nil)
if err != nil {
return fmt.Errorf("cloudflare: crear request: %w", err)
}
req.Header.Set("Authorization", "Bearer "+c.token)
req.Header.Set("Content-Type", "application/json")
c.addAuth(req)
resp, err := c.httpClient.Do(req)
if err != nil {
@@ -258,8 +289,7 @@ func (c *CloudflareClient) getWithInfo(path string, dest interface{}) (cfResultI
if err != nil {
return cfResultInfo{}, fmt.Errorf("cloudflare: crear request: %w", err)
}
req.Header.Set("Authorization", "Bearer "+c.token)
req.Header.Set("Content-Type", "application/json")
c.addAuth(req)
resp, err := c.httpClient.Do(req)
if err != nil {
@@ -381,8 +411,7 @@ func (c *CloudflareClient) doRequest(method, path string, payload interface{}, d
if err != nil {
return fmt.Errorf("cloudflare: crear request: %w", err)
}
req.Header.Set("Authorization", "Bearer "+c.token)
req.Header.Set("Content-Type", "application/json")
c.addAuth(req)
resp, err := c.httpClient.Do(req)
if err != nil {