Verificare de webhook-uri de înaltă performanță în Rust cu Axum. Adaugă identificarea vizitatorilor, detecția boților și smart signals în aplicația ta Rust în câteva minute.
Adaugă SDK-ul în proiectul tău cu managerul de pachete preferat.
npm install axumyarn add axumpnpm add axumDevii operațional cu configurarea minimă.
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();}Tipare gata de producție, cu gestionarea erorilor, stări de încărcare și configurare avansată.
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();}Toate opțiunile disponibile pentru inițializarea și configurarea SDK-ului.
publicKeystringCheia ta publică din dashboard — sigură de folosit în browserendpointstringURL de endpoint personalizat pentru implementările direcționate prin proxy — un URL explicit are prioritate față de regiuneregionstringRegiunea datelor: us sau eutimeoutMsnumberTimeout pentru întregul apel getResult(), în milisecundelinkedIdstringID-ul tău intern de cont pentru utilizatorul autentificat, ca vizitele de pe același dispozitiv să poată fi corelatetagstringEtichetă liberă atașată cererii de identificare, de ex. checkout sau logindebugbooleanÎnregistrează ciclul de viață al scriptului și activitatea de rețea în consola browseruluiscriptUrlstringSuprascriere completă a URL-ului scriptului agent — pentru self-hosting sau Subresource IntegrityAprofundează cu referința API completă, configurarea webhookurilor și ghiduri avansate.
Referință API completă, ghiduri de integrare și bune practici.
Livrarea evenimentelor în timp real, schema payloadului și verificarea semnăturii.
Configurează notificări în timp real pentru fiecare identificare a unui dispozitiv.
Adaugă fingerprinting de dispozitiv în aplicația ta Rust în mai puțin de 5 minute.