Verifica dei webhook ad alte prestazioni in Rust con Axum. Aggiunga identificazione dei visitatori, bot detection e smart signals alla sua applicazione Rust in pochi minuti.
Aggiunga l'SDK al suo progetto con il gestore di pacchetti che preferisce.
npm install axumyarn add axumpnpm add axumDiventi operativo con la configurazione minima.
use axum::{body::Bytes, http::HeaderMap, routing::post, Router};async fn webhook(headers: HeaderMap, body: Bytes) -> &'static str { // verify headers["x-tracio-signature"] against body, then act println!("{}", String::from_utf8_lossy(&body)); "OK"}#[tokio::main]async fn main() { let app = Router::new().route("/webhook/tracio", post(webhook)); let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap(); axum::serve(listener, app).await.unwrap();}Pattern pronti per la produzione con gestione degli errori, stati di caricamento e configurazione avanzata.
use axum::{body::Bytes, http::{HeaderMap, StatusCode}, routing::post, Router};use hmac::{Hmac, Mac};use sha2::Sha256;use serde::Deserialize;type HmacSha256 = Hmac<Sha256>;#[derive(Deserialize)]struct Bot { result: String,}#[derive(Deserialize)]struct Event { #[serde(rename = "visitorId")] visitor_id: String, bot: Bot,}// Recompute the HMAC-SHA256 over "<t>.<rawBody>" and compare it.fn verify(body: &[u8], header: &str, secret: &[u8]) -> bool { let (mut t, mut v1) = ("", ""); for kv in header.split(',') { match kv.split_once('=') { Some(("t", val)) => t = val, Some(("v1", val)) => v1 = val, _ => {} } } let mut mac = HmacSha256::new_from_slice(secret).unwrap(); mac.update(t.as_bytes()); mac.update(b"."); mac.update(body); match hex::decode(v1) { Ok(sig) => mac.verify_slice(&sig).is_ok(), Err(_) => false, }}async fn webhook(headers: HeaderMap, body: Bytes) -> Result<&'static str, StatusCode> { let secret = std::env::var("TRACIO_WEBHOOK_SECRET").unwrap_or_default(); let sig = headers .get("x-tracio-signature") .and_then(|v| v.to_str().ok()) .unwrap_or(""); if !verify(&body, sig, secret.as_bytes()) { return Err(StatusCode::UNAUTHORIZED); } let event: Event = serde_json::from_slice(&body).map_err(|_| StatusCode::BAD_REQUEST)?; if event.bot.result == "bot" { println!("flagging bot visitor {}", event.visitor_id); } Ok("OK")}#[tokio::main]async fn main() { let app = Router::new().route("/webhook/tracio", post(webhook)); let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap(); axum::serve(listener, app).await.unwrap();}Tutte le opzioni disponibili per inizializzare e configurare l'SDK.
publicKeystringLa sua chiave pubblica dalla dashboard — può essere distribuita nel browser in sicurezzaendpointstringURL endpoint personalizzato per i deployment instradati tramite proxy — un URL esplicito prevale su regionregionstringRegione dati: us o eutimeoutMsnumberTimeout dell'intera chiamata getResult(), in millisecondilinkedIdstringIl suo ID account interno per l'utente autenticato, così le visite che condividono un dispositivo possono essere collegatetagstringEtichetta libera associata alla richiesta di identificazione, es. checkout o logindebugbooleanRegistra il ciclo di vita dello script e l'attività di rete nella console del browserscriptUrlstringOverride completo dell'URL dello script agent — per self-hosting o Subresource IntegrityApprofondisca con il riferimento API completo, la configurazione dei webhook e le guide avanzate.
Riferimento API completo, guide all'integrazione e best practice.
Recapito degli eventi in tempo reale, schema del payload e verifica della firma.
Configuri notifiche di eventi in tempo reale per ogni identificazione del dispositivo.
Aggiunga il fingerprinting del dispositivo alla sua applicazione Rust in meno di 5 minuti.