Hochleistungsfähige Webhook-Verifizierung in Rust mit Axum. Fügen Sie Ihrer Rust-Anwendung in Minuten Besucheridentifikation, Bot Detection und Smart Signals hinzu.
Fügen Sie das SDK mit Ihrem bevorzugten Paketmanager zu Ihrem Projekt hinzu.
npm install axumyarn add axumpnpm add axumMit dem minimalen Setup einsatzbereit werden.
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();}Produktionsreife Muster mit Fehlerbehandlung, Ladezuständen und erweiterter Konfiguration.
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 verfügbaren Optionen zum Initialisieren und Konfigurieren des SDK.
publicKeystringIhr öffentlicher Schlüssel aus dem Dashboard — sicher im Browser auslieferbarendpointstringIndividuelle Endpunkt-URL für Proxy-geroutete Deployments — eine explizite URL hat Vorrang vor regionregionstringDatenregion: us oder eutimeoutMsnumberTimeout für den gesamten getResult()-Aufruf, in MillisekundenlinkedIdstringIhre interne Konto-ID für den angemeldeten Nutzer, damit Besuche auf demselben Gerät verknüpft werden könnentagstringFrei wählbares Label für die Identifikationsanfrage, z. B. checkout oder logindebugbooleanProtokolliert Script-Lebenszyklus und Netzwerkaktivität in der Browser-KonsolescriptUrlstringVollständige Überschreibung der Agent-Script-URL — für Self-Hosting oder Subresource IntegrityVertiefen Sie sich mit der vollständigen API-Referenz, der Webhook-Konfiguration und fortgeschrittenen Leitfäden.
Vollständige API-Referenz, Integrationsleitfäden und Best Practices.
Echtzeit-Ereigniszustellung, Payload-Schema und Signaturprüfung.
Konfigurieren Sie Echtzeit-Ereignisbenachrichtigungen für jede Geräteidentifikation.
Fügen Sie Ihrer Rust-Anwendung in unter 5 Minuten Device-Fingerprinting hinzu.