אימות webhooks בעל ביצועים גבוהים ב-Rust עם Axum. הוסיפו זיהוי מבקרים, זיהוי בוטים ו-smart signals לאפליקציית Rust שלכם תוך דקות.
הוסיפו את ה-SDK לפרויקט שלכם עם מנהל החבילות המועדף עליכם.
npm install axumyarn add axumpnpm add axumהתחילו לעבוד עם ההגדרה המינימלית.
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();}דפוסים מוכנים לייצור עם טיפול בשגיאות, מצבי טעינה ותצורה מתקדמת.
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();}כל האפשרויות הזמינות לאתחול ולתצורת ה-SDK.
publicKeystringהמפתח הציבורי שלכם מלוח המחוונים — בטוח לשליחה בדפדפןendpointstringכתובת נקודת קצה מותאמת אישית לפריסות מנותבות דרך פרוקסי — כתובת מפורשת גוברת על regionregionstringאזור נתונים: us או eutimeoutMsnumberזמן קצוב לכל קריאת getResult(), באלפיות שנייהlinkedIdstringמזהה החשבון הפנימי שלכם עבור המשתמש המחובר, כדי לקשר ביקורים שחולקים מכשירtagstringתווית חופשית המצורפת לבקשת הזיהוי, למשל checkout או logindebugbooleanרושם את מחזור החיים של הסקריפט ואת פעילות הרשת לקונסולת הדפדפןscriptUrlstringדריסה מלאה של כתובת סקריפט הסוכן — לאירוח עצמי או ל-Subresource Integrityהעמיקו עם התיעוד המלא של ה-API, תצורת ה-webhook ומדריכים מתקדמים.
תיעוד API מלא, מדריכי אינטגרציה ושיטות עבודה מומלצות.
מסירת אירועים בזמן אמת, סכמת מטען ואימות חתימה.
הגדירו התראות אירועים בזמן אמת עבור כל זיהוי מכשיר.
הוסיפו טביעת אצבע מכשירים לאפליקציית Rust שלכם בפחות מ-5 דקות.