Verifikasi webhook berkinerja tinggi di Rust dengan Axum. Tambahkan identifikasi pengunjung, deteksi bot, dan smart signals ke aplikasi Rust Anda dalam hitungan menit.
Tambahkan SDK ke proyek Anda dengan package manager pilihan Anda.
npm install axumyarn add axumpnpm add axumSiap dan berjalan dengan penyiapan minimal.
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();}Pola siap produksi dengan penanganan error, status loading, dan konfigurasi lanjutan.
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();}Semua opsi yang tersedia untuk menginisialisasi dan mengonfigurasi SDK.
publicKeystringKunci publik Anda dari dasbor — aman dikirim di browserendpointstringURL endpoint khusus untuk deployment yang dirutekan melalui proxy — URL eksplisit mengalahkan regionregionstringRegion data: us atau eutimeoutMsnumberBatas waktu untuk seluruh panggilan getResult(), dalam milidetiklinkedIdstringID akun internal Anda untuk pengguna yang masuk, agar kunjungan yang berbagi perangkat bisa ditautkantagstringLabel bebas yang dilekatkan pada permintaan identifikasi, mis. checkout atau logindebugbooleanMencatat siklus hidup skrip dan aktivitas jaringan ke konsol browserscriptUrlstringPenimpaan penuh untuk URL skrip agent — untuk self-hosting atau Subresource IntegrityPelajari lebih dalam dengan referensi API lengkap, konfigurasi webhook, dan panduan lanjutan.
Referensi API lengkap, panduan integrasi, dan praktik terbaik.
Pengiriman event real-time, skema payload, dan verifikasi tanda tangan.
Konfigurasikan notifikasi event real-time untuk setiap identifikasi perangkat.
Tambahkan device fingerprinting ke aplikasi Rust Anda dalam kurang dari 5 menit.