import logging import requests from django.conf import settings logger = logging.getLogger(__name__) SITEVERIFY_URL = "https://challenges.cloudflare.com/turnstile/v0/siteverify" def verify_turnstile(token: str, remote_ip: str | None = None) -> bool: """ Verify a Cloudflare Turnstile token against the siteverify API. Returns True if valid, False otherwise. Skips verification when SSL is disabled (non-HTTPS env) or when CLOUDFLARE_TURNSTILE_SECRET_KEY is not configured. """ if not getattr(settings, "USE_SSL", False): logger.debug("Turnstile: SSL disabled, skipping verification.") return True secret = getattr(settings, "CLOUDFLARE_TURNSTILE_SECRET_KEY", "") if not secret: logger.debug("Turnstile: no secret key configured, skipping verification.") return True payload = {"secret": secret, "response": token} if remote_ip: payload["remoteip"] = remote_ip try: resp = requests.post(SITEVERIFY_URL, data=payload, timeout=5) result = resp.json() if not result.get("success"): logger.warning("Turnstile verification failed: %s", result.get("error-codes")) return bool(result.get("success")) except Exception as e: logger.error("Turnstile: siteverify request failed: %s", e) return False