1. Thu thập trên trình duyệt
Trình tải công khai là bản phát hành trên trình duyệt duy nhất hiện được xác minh. Trình này xuất mã nhận dạng thiết bị hoặc trạng thái lỗi; không bao giờ nhận thông tin xác thực máy chủ.
<script src="https://collect.noxtica.com/collector/noxtica-collector-core.js" data-site-key="pk_example_replace_me" data-extensions="auto" data-auto-init data-auto-check-once async></script>
<script>
document.addEventListener('noxtica:collected', (event) => {
const deviceId = event.detail?.fingerprintId;
document.dispatchEvent(new CustomEvent('app:noxtica-evidence', {
detail: deviceId ? { state: 'received', deviceId } : { state: 'invalid' },
}));
});
document.addEventListener('noxtica:error', () => {
document.dispatchEvent(new CustomEvent('app:noxtica-evidence', {
detail: { state: 'unavailable' },
}));
});
</script>
2. Truy xuất trên máy chủ của bạn
Gửi mã nhận dạng thiết bị đến backend của bạn, rồi gọi tuyến v1 đã xác thực bằng khóa lưu trên máy chủ.
export async function lookupDevice({ deviceId, apiKey, fetchImpl = fetch }) {
const response = await fetchImpl(
`https://collect.noxtica.com/v1/device/${encodeURIComponent(deviceId)}`,
{ headers: { Authorization: `Bearer ${apiKey}` } },
);
if (response.status === 404) return { state: 'missing' };
if (response.status === 429) return { state: 'rate_limited' };
if (!response.ok) return { state: 'unavailable' };
return { state: 'received', record: await response.json() };
}
3. Giữ riêng các trạng thái kết quả
Chỉ bản ghi đã nhận đầy đủ mới đi vào chính sách số. Các trạng thái thiếu, không hợp lệ, bị giới hạn tốc độ và không khả dụng tuân theo phương án dự phòng rõ ràng của khách hàng.
export function classifyLookup(result) {
if (!result || result.state === 'unavailable') return { state: 'unavailable' };
if (result.state === 'rate_limited') return { state: 'rate_limited' };
if (result.state === 'missing') return { state: 'missing' };
const record = result.record;
if (!record || typeof record.score !== 'number' || typeof record.confidence !== 'number') {
return { state: 'invalid' };
}
return {
state: 'received',
score: record.score,
riskLevel: record.riskLevel,
confidence: record.confidence,
};
}