Hoogperformante webhookverificatie in Rust met Axum. Voeg binnen enkele minuten bezoekersidentificatie, botdetectie en smart signals toe aan je Rust-applicatie.
Voeg de SDK toe aan je project met je favoriete package manager.
npm install axumyarn add axumpnpm add axumGa van start met de minimale setup.
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();}Productieklare patronen met foutafhandeling, laadstatussen en geavanceerde configuratie.
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();}Alle beschikbare opties voor het initialiseren en configureren van de SDK.
publicKeystringJe public key uit het dashboard — veilig om in de browser mee te sturenendpointstringAangepaste endpoint-URL voor proxy-gerouteerde deployments — een expliciete URL gaat vóór regionregionstringDataregio: us of eutimeoutMsnumberTime-out voor de hele getResult()-call, in millisecondenlinkedIdstringJe interne account-ID van de ingelogde gebruiker, zodat bezoeken vanaf hetzelfde apparaat gekoppeld kunnen wordentagstringVrij label dat aan het identificatieverzoek wordt gekoppeld, bijv. checkout of logindebugbooleanLogt de levenscyclus van het script en netwerkactiviteit naar de browserconsolescriptUrlstringVolledige override van de URL van het agentscript — voor self-hosting of Subresource IntegrityGa dieper met de volledige API-referentie, webhookconfiguratie en geavanceerde gidsen.
Volledige API-referentie, integratiegidsen en best practices.
Realtime event-levering, payload-schema en handtekeningverificatie.
Configureer realtime eventmeldingen voor elke device-identificatie.
Voeg in minder dan 5 minuten device-fingerprinting toe aan je Rust-applicatie.