rustauth_plugins/captcha/verify_handlers/
cloudflare_turnstile.rs1use 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}