Dokümantasyon

Cihaz riski

Giriş, kayıt, parola sıfırlama ve onay sayfalarınızdaki her tarayıcıya Fingerprint'in visitorId'si gibi bir ziyaretçi kimliği ve risk motorunun buna bakışı. Sayfa genel site anahtarınızla kimlik tespiti yapar ve { visitorId, requestId, confidence } alır; sunucunuz güvenilir sonucu requestId ile okur ve girişlere iletir. Ücretli bir eklentidir, siz açana kadar kapalıdır (panelde Device risk).

ParçaKural
visitorIdtqv_…, bu tarayıcı yalnızca sizin çalışma alanınızda: başka bir Touchque müşterisi aynı tarayıcı için başka bir kimlik görür. Silinen site verisinden, tarayıcının özelliklerini gösterdiği gizli pencerelerden ve tarayıcı güncellemelerinden sonra da aynı kalır.
confidenceTarayıcının cihaza bağlı anahtarı imzaladıysa 0.99, saklanan kimliğiyle 0.95, özelliklerinin eşleşmesiyle en çok 0.9 (aynı filo bilgisayarlarında daha düşük), ilk görüşte 0.5–0.6.
requestIddre_…, tek bir kimlik tespiti: bir hesap için, 15 dakika. Başka bir hesap device_report_replayed alır.
networkKimlik tespitinin adresi, risk motorunun gördüğü gibi: ülke, bölge ve şehir (asla koordinat değil), operatör (ASN), ağın türü (isp, hosting, tor) ve tarayıcının saatinin adrese uyup uymadığı (timezoneMismatch: başka ülkede bir VPN ya da proxy).
velocityBu ziyaretçinin sayıları: 24 saatte ve 30 günde hesaplar, 24 saatte kayıtlar ve ülkeler, 7 günde saklanan kimlik sıfırlamaları (risk motorunun), son bir saatte ve günde kimlik tespitleri.
bot"Bot mu?" sorusuna tek cevap: detected (tarayıcı sürüldüğünü söylüyor: webdriver, headless tarayıcı), suspected (imleç yazılım gibi hareket etti, sıfır boyutlu pencere, yazılım grafiği) ya da not_detected, nedenleriyle. Sinyallerin özeti: kararı yine risk motoru verir.
Site anahtarı ve origin'lerSite anahtarı (tqpk_…) geneldir; Touchque yalnızca organizasyonunuzun doğrulanmış alan adlarındaki (Organizasyon → Alan adları) ve listelediğiniz origin'lerdeki sayfalara cevap verir. identify text/plain bir POST'tur, CORS ön isteği yoktur: Touchque API alan adınıza connect-src'de izin verin.
Sayfada bir satır, sunucunuzda bir satır

Script etiketi (script.js; site anahtarınız ve sürümünün bütünlük özetiyle, Device risk → Settings; ilk adı olan …/device.js'i yükleyen sayfalar aynı özetle çalışmaya devam eder) sayfa yüklenince tarayıcıyı tanır ve requestId'yi her formdaki gizli touchque_request_id alanına koyar, sonradan eklenen formlar dahil; 10 dakikada bir ve her gönderimden sonra yenisini alır. Gönderimde requestId'nin ardına bir nokta ve imlecin ve parmakların nasıl hareket ettiğini ekler: tarayıcının hesapladığı 18 karakterlik sayılar (sıçrayan imleçteki basışlar ve süreleri, uzun çizgilerin ve kaydırmaların ne kadar düz olduğu, dokunuşların süresi); asla bir konum ya da yol değil. data-pointer="off" bunu kapatır. Sunucunuz bu alanı geldiği gibi deviceRisk.check'e verir. Tek sayfalık uygulamalar window.TouchqueDevice'ı okur (ready, value(), requestId, refresh()); 1.6.0 sürümündeki etiket window.TouchQueDevice adını kullanıyordu.

<script src="https://cdn.touchque.com/device/v2.0.0/script.js" data-site-key="tqpk_…" data-purpose="sign_in"
        integrity="sha384-a69uLWQn3eccd/RGOZIKDLN16dOQIXvX2eGDlOUYpmMMq4QVyqiTcuoRgT17JGLG" crossorigin="anonymous" async></script>
Etiketi kaldırmak doğrulama getirir, asla geçiş değil. requestId'leri yalnızca Touchque sunucusu üretir; bir hesap için kullanılır, sitenizin origin'ine ve 15 dakikaya bağlıdır. Sayfadaki değere asla güvenilmez: sunucunuz kararı requestId ile okur, risk motoru karar verir. Etiketi olmayan ya da engellenmiş bir sayfa requestId göndermez: kontrol yine cevap verir (report: missing, unknown ya da expired) ve device_identification_missing yalnızca numara eşleştirmeli bir doğrulama ister, diğerleri gibi gölge modunda başlar.
Tek karar verici. Touchque risk motoru ziyaretçi başına sayar (hesaplar, kayıtlar, ülkeler, saklanan kimlik sıfırlamaları), tarayıcının saatini adresle karşılaştırır ve karar verir: girişlerde (deviceRiskRequestId ile login.request, risk.check) ve hesaptan önceki sayfalarda (POST /device-risk/check). Her sinyal yalnızca daha fazlasını ister: numara eşleştirmeli onay ya da passkey, kayıtta sizin ek kontrolünüz. Hiçbiri tek başına engellemez, hiçbiri bir kontrolü atlatmaz ve sinyal olan bir giriş asla sessiz olmaz. Sinyaller gölge modunda başlar (raporlanır, enforced: false); yöneticinizin "Her zaman doğrula" işaretlediği ziyaretçi hemen sorar.
Sinyaller
codeAnlamİstediği
device_tamperedTarayıcı fonksiyonları kodla değiştirilmiş ya da özellikler birbiriyle çelişiyor (anti-detect tarayıcı, sahteleme eklentisi).number_match
device_virtualSanal makine, yazılımsal grafik, başsız ya da otomatik tarayıcı.number_match
device_geo_mismatchTarayıcının saati adresin saat diliminden 2 saat ya da daha fazla farklı (proxy, VPN, uzaktan erişim).passkey
device_many_accountsBir ziyaretçide 24 saatte 3, 30 günde 6 hesap (aynı modeldeki filo bilgisayarlarında sayılmaz).number_match
device_signup_burstBir ziyaretçiden 24 saatte 3 kayıt.number_match
device_id_resetsSaklanan kimlik 7 günde iki kez silinip aynı ziyaretçi olarak geri gelmiş (gizli pencereler sayılmaz).number_match
device_many_countriesBir ziyaretçi için 24 saatte 3 ülkeden adres.number_match
device_wrong_siteKimlik tespiti sizin olmayan bir sitede yapılmış (benzer alan adı ya da proxy sayfası).passkey
device_report_replayedBaşka bir hesap için kullanılan kimlik tespiti ya da iki kez gönderilen rapor.passkey
device_private_windowGizli pencere: yalnızca bağlam, tek başına asla sormaz.none
device_step_up_by_adminYöneticiniz ziyaretçiyi "Her zaman doğrula" olarak işaretledi: hemen uygulanır.number_match
device_identification_missingSunucunuz kimlik tespiti göndermeyen ya da doğrulanamayan (bilinmeyen, süresi dolmuş, başka çalışma alanının) bir sayfayı kontrol etti: etiket kaldırılmış ya da engellenmiş. Reklam engelleyiciler dürüst kullanıcılarda da bunu yapar.number_match
device_pointer_syntheticİmleç ya da parmak el gibi değil yazılım gibi hareket etti: her basış imlecin az önce sıçradığı yere düştü ve 10 ms'den kısa sürdü, 10 ms'den kısa dokunuşlar ya da cetvel gibi düz çizgiler ve kaydırmalar (Playwright, Puppeteer, Selenium, AI tarayıcı ajanları). Etiketin formla gönderdiği sayılardan; asla bir konum ya da yol değil. Hiç hareket olmaması (klavye, ekran okuyucu) asla sinyal değildir; Voice Control ve Switch Control da böyle hareket eder, bu yüzden yalnızca sorar.number_match
Ne okunur, ne saklanır

Sayfa kaba özellikleri okur (işletim sistemi, tarayıcı ailesi ve ana sürümü, saat dilimi, diller, ekran boyutu, çekirdek sayısı, bellek sınıfı, dokunma noktaları, ekran kartının adı), tarayıcının bir deneme metnini nasıl çizdiğinin, bir deneme sesini nasıl çaldığının, 25 yaygın yazı tipinden hangilerine sahip olduğunun, birkaç Math sonucunun ve WebGL sınırlarının kısa özetlerini, ayrıca bulguları (değiştirilmiş tarayıcı fonksiyonları, sanal makine, başsız tarayıcı, tespit edilebildiği yerde gizli pencere). Touchque ham özellik saklamaz: yalnızca sizin çalışma alanınıza ait bir anahtarla anahtarlanmış özetler, kaba etiketler, hesap, ülke ve adresin ağının anahtarlanmış özeti; sizin seçtiğiniz 30–90 gün boyunca; adresin kendisi en çok bir gün. Asla MAC adresi, seri numarası ya da müşteriler arası cihaz grafiği yok.

Kullanıcılarınıza söyleyin. Yalnızca giriş, kayıt, parola sıfırlama ve onay sayfalarında kullanın ve aydınlatma metninizde belirtin. Türkiye'de (KVKK) hesap güvenliği meşru menfaate (md. 5/2(f)) dayanabilir; AB'de cihazı okumak, kullanıcının istediği bir girişin güvenliği için kesinlikle gerekli değilse rıza ister (ePrivacy md. 5(3)) ve tanınan bir cihaza daha az kontrol uygulamak bu istisnaya girmez. Hukukçunuza danışın. Başlangıç metni Device risk → Settings altında.
Kendi alan adınızdan

Reklam engelleyiciler ve tarayıcı gizlilik listeleri bilinen üçüncü taraf parmak izi adreslerine giden betikleri ve çağrıları dürüst ziyaretçiler için de düşürür (onlar da Identification missing alır, en fazla ek doğrulama). Büyük siteler etiketi ve identify çağrısını Fingerprint'in vekil (proxy) entegrasyonları gibi kendi alan adlarından sunar: GET /_tq/device/vX.Y.Z/script.js, https://cdn.touchque.com/device/vX.Y.Z/script.js adresine (aynı baytlar, bu yüzden aynı bütünlük özeti), POST /_tq/device-risk/identify ise https://api.touchque.com/device-risk/identify adresine gider. Etiket sizin alan adınızı gösterir ve Content-Security-Policy için yalnızca 'self' yeter:

<script src="https://www.example.com/_tq/device/v2.0.0/script.js" data-site-key="tqpk_…" data-purpose="sign_in" data-api="https://www.example.com/_tq"
        integrity="sha384-a69uLWQn3eccd/RGOZIKDLN16dOQIXvX2eGDlOUYpmMMq4QVyqiTcuoRgT17JGLG" crossorigin="anonymous" async></script>

Vekil sırrı: vekilinizin arkasında her ziyaretçi Touchque'ya vekilinizin adresinden gelir. Ziyaretçinin adresini X-Touchque-Client-IP, çalışma alanınızın vekil sırrını X-Touchque-Proxy-Secret olarak gönderin (tqps_…, sahip ve yöneticiler için Device risk → Settings; API anahtarıyla GET /device-risk/settings). Touchque o zaman ziyaretçinin adresini kaydeder ve puanlar, adres başına sınırı (dakikada 60 kimlik tespiti) vekilinize değil ona uygular. Sırrı API anahtarı gibi sunucuda tutun; asla sayfada ya da git'te değil. Yanlış sır 403 proxy_secret_invalid döner; site anahtarını değiştirmek sırrı da değiştirir. Sır olmadan da vekil çalışır, ama her ziyaretçi vekilin tek adresine sayılır: yalnızca küçük siteler için. Kendi çerezlerinizi yolda düşürün, Origin başlığını geldiği gibi iletin (Touchque onu alan adlarınız ve origin listenizle karşılaştırır) ve sunucunuzda ziyaretçinin adresini deviceRisk.check'e clientIp olarak verin.

location /_tq/device/ {
    proxy_pass https://cdn.touchque.com/device/;
    proxy_ssl_server_name on;
    proxy_set_header Cookie "";
    proxy_set_header Authorization "";
}
location = /_tq/device-risk/identify {
    limit_except POST { deny all; }
    proxy_pass https://api.touchque.com/device-risk/identify;
    proxy_ssl_server_name on;
    proxy_set_header Cookie "";
    proxy_set_header Authorization "";
    proxy_set_header X-Forwarded-For "";
    proxy_set_header X-Touchque-Proxy-Secret "tqps_…";   # Device risk → Settings; keep this file out of git
    proxy_set_header X-Touchque-Client-IP $remote_addr;  # behind a load balancer: set_real_ip_from + real_ip_header first
}

Sınırlar: bir ziyaretçi adresi dakikada 60 kimlik tespiti yapabilir; bir site anahtarı ve bir çalışma alanının deviceRisk.check çağrıları ayrı ayrı dakikada 1.200. Sınırın üstünde çağrı 429 ve Retry-After döner. Kendi sayınız Device risk → Settings'te görünür (GET /device-risk/settings içinde ratePerMinute); daha büyük bir site beklenen trafiğiyle desteğe (support@touchque.com) yazar, Touchque çalışma alanı için yükseltir.

Vercel yönlendirmeleri (rewrites) vekil sırrını ekleyemez: küçük siteler için kullanın, yoğun trafikte identify yolu için Next.js middleware'ini (Vercel'de de çalışır) seçin. Doğrulanmış bir Touchque Login özel alan adınız varsa vekile gerek yok: Touchque iki yolu da orada sunar ve Device risk → Settings etiketi data-api="https://login.example.com/_tq" ile gösterir.

Yoğun bir sitede milyonlarca kimlik tespiti olur, bu yüzden hiçbir şey hepsini listelemez: GET /device-risk/events (her SDK'da deviceRisk.searchEvents, panelde Identifications sekmesi) saklama süreniz içinde en çok 90 günlük (varsayılan 7) bir aralık için en yeniden başlayarak tek bir sayfa döner; sinyal, stepUp, sayfa (kind), origin, ip (bir adres ya da 203.0.113.0/24 gibi bir CIDR aralığı; asla geri dönmez), hesap, visitorId ya da requestId ile süzer, her biri bir indeks üzerinde. nextCursor null olana kadar onu cursor olarak geri verin (sayfa başına 1–100); from/to'yu kaydırarak sayfalamayın. Çok fazla okuyacak bir arama 422 search_too_broad döner: aralığı daraltın ya da bir filtre ekleyin. Hepsi birden için: bir veri talebi (Organizasyon → Veri talepleri, JSON ya da CSV, kimlik tespiti başına bir satır, adres yok), webhook'lar ve log akışı.

İzleme ve uyarılar

Device risk → Overview son 30 günü, 90 günü ya da 12 ayı gün gün (adım artırmalarıyla kimlik tespitleri, uygulanan kısmıyla sinyaller; kimlik tespitlerinden daha uzun, 400 gün saklanan günlük sayılardan) ve sayfa açıkken 10 saniyede bir yenilenen son kimlik tespitlerini gösterir. Uyarılar (Device risk → Settings → Alerts) bir şey olduğunda ekibinize haber verir; her kuralın açma/kapama düğmesi ve eşiği vardır, saatte en çok bir kez uyarır. Webhook'unuza ve (bir e-posta göndericisi kurulunca) organizasyonunuzun sahip ve yöneticilerine e-postayla gider. Uyarı bir girişi asla değiştirmez: onlara risk motoru karar verir.

UyarıNe zamanVarsayılan
signup_burstBir ziyaretçi 24 saatte bu kadar kayıt oldu5
many_accountsBir ziyaretçide 24 saatte bu kadar hesap5
tamper_spikeBir saatte bu kadar değiştirilmiş ya da sanal tarayıcılı kimlik tespiti20
Webhook'lar ve log akışları

Webhook'unuz (Developers → Webhooks), bir kimlik tespiti ya da kontrol daha fazlasını isteyen bir sinyal verdiğinde DEVICE_RISK_SIGNAL (uygulanan ya da gölgede; aynı ziyaretçinin aynı sinyallerle sayfa yüklemeleri 10 dakikada bir, her kontrol), bir uyarı tetiklendiğinde DEVICE_RISK_ALERT alır. Diğer olaylar gibi imzalıdır. requestId, visitorId, sayfa, biliniyorsa hesap, güven, sinyaller ve vaka koduyla motorun kararını taşır; asla bir özellik değil. Log akışı olan bir SSO organizasyonunda (Splunk, Datadog, Sentinel, webhook, S3) aynı olaylar o akışa da gider, kategori device_risk.

Uç noktalar
EndpointKim
POST /device-risk/identifySayfa (site anahtarı)
GET /device-risk/events/{requestId}Sunucunuz: güvenilir kimlik tespiti ve motorun kararı
POST /device-risk/checkSunucunuz: bir hesap için kimlik tespiti (kayıt, sıfırlama)
login.request, risk.checkdeviceRiskRequestId
GET /device-risk/eventsSunucunuz ya da panel: kimlik tespitlerinde arama (filtreler, opak imleç)
GET /device-risk/trendOverview grafiği, 30, 90 ya da 365 gün
GET /device-risk/recentSon kimlik tespitleri (Overview'daki canlı akış)
DEVICE_RISK_SIGNAL, DEVICE_RISK_ALERTSunucunuza webhook olayları
// Sayfa: kayıt, giriş, parola sıfırlama ya da onay formu gönderilirken (script etiketi olmadan)
import { deviceRisk, REQUEST_ID_FIELD } from '@touchque/web';
const id = await deviceRisk.identify({ siteKey: 'tqpk_…', purpose: 'sign_up' });   // { visitorId, requestId, confidence }
form.elements[REQUEST_ID_FIELD].value = id?.requestId ?? '';   // gizli touchque_request_id alanı, etiketin doldurduğu alan

// Sunucunuz (Node): sayfanın kopyasına asla güvenmeyin; eksik ya da boş da bir cevaptır
const r = await tq.deviceRisk.check(req.body.touchque_request_id, { event: 'sign_up', externalUsername: email, clientIp: req.ip });
if (r.stepUp) askForEmailCode();          // daha fazlasını iste, asla reddetme
if (r.requestId) {
  const event = await tq.deviceRisk.getEvent(r.requestId);   // güvenilir kimlik tespiti
}

// Girişlerde check yerine: alanı login.request'e geldiği gibi verin
await tq.login.request({ externalUsername, type: 'LOGIN', clientIp: req.ip, deviceRiskRequestId: req.body.touchque_request_id });