Skip to main content

rustauth_plugins/captcha/verify_handlers/
cloudflare_turnstile.rs

1//! Cloudflare Turnstile verification handler.
2
3use serde::Deserialize;
4use serde_json::json;
5
6use super::{service_unavailable, CaptchaVerifyError};
7use crate::captcha::CaptchaOptions;
8
9#[derive(Deserialize)]
10struct SiteVerifyResponse {
11    success: bool,
12}
13
14pub async fn verify(
15    options: &CaptchaOptions,
16    captcha_response: &str,
17    remote_ip: Option<String>,
18) -> Result<bool, CaptchaVerifyError> {
19    let client = options.http_client_ref();
20    let mut body = json!({
21        "secret": options.secret_key,
22        "response": captcha_response,
23    });
24    if let Some(remote_ip) = remote_ip {
25        body["remoteip"] = json!(remote_ip);
26    }
27
28    let response = client
29        .post(options.site_verify_url())
30        .json(&body)
31        .send()
32        .await
33        .map_err(service_unavailable)?;
34    if !response.status().is_success() {
35        return Err(service_unavailable(response.status()));
36    }
37    let data = response
38        .json::<SiteVerifyResponse>()
39        .await
40        .map_err(service_unavailable)?;
41
42    Ok(data.success)
43}