Skip to content
GUIDE-0002Rehber · IntegrationTaslaksürüm 0.1.02026-09-27T00:00:00.000Z

Sunucuda belge doğrulama ​

@tamga-network/verifier, SPEC-API-0001'deki kanonik doğrulama hattını (T0 + A–E) uygular ve üç değerli sonuç döndürür. Referans uygulama apps/verify (verify.tamga.network) bu kütüphaneyi kullanır; aşağıdaki adımların tamamı orada çalışır hâlde.

Hazırlık ​

  1. RP kaydı: Tamga güven listesinde doğrulayıcı kaydınız (client_id = x509_san_dns:<alan adınız>), X.509 sertifikanız ve izinli alan kapsamınız. İsteğiniz kapsamı aşarsa cüzdan reddeder (AP6).
  2. Güven kaynağı: @tamga-network/trust → loadTrustSourceFromDir(dist) ya da periyodik indirme + yeniden yükleme (guardedReload). Güven sorusu yalnızca TrustSource üzerinden sorulur (BT4).
  3. Status ön çekimi: new PrefetchStatusCache() + düzenli refresh(uriler) — doğrulama anında ağ çağrısı yapılmaz (S12).

Akış ​

ts
import { dcqlFromPolicy, createPresentationRequest, decryptResponse, verifyPresentation, pemRpSigner,
         PrefetchStatusCache, type Policy } from "@tamga-network/verifier";

const policy: Policy = { policy_id: "ise-alim", /* credentials, trust, freshness */ } as Policy;
const signer = await pemRpSigner(RP_KEY_PEM, RP_CERT_PEM, "x509_san_dns:ornek.com.tr");
// 1) istek: QR / derin bağlantı olarak gösterilir (kişisel veri yok; yalnızca request_uri)
const req = await createPresentationRequest({ signer, dcql: dcqlFromPolicy(policy),
  responseUri: "https://ornek.com.tr/vp/response", requestUriBase: "https://ornek.com.tr/vp/req" });
// 2) cüzdan şifreli yanıtı response_uri'ye POST eder → çöz
const resp = await decryptResponse(jweBody, req.encPrivateKey); // istekle üretilen anahtar; req.state ile eşleştirin
// 3) doğrula (SD-JWT; mdoc için format: "mso_mdoc" + responseUri)
const { result, claims } = await verifyPresentation({ presentation: resp.vp_token["diploma"][0], aud: signer.clientId, nonce: req.nonce,
  policy, policyCredentialId: "diploma", trust, statusCache, rootCertsDer, rp: trust.relyingParty(signer.clientId) });

Alan adları ve imzalar paket tiplerinde tanımlıdır; tam çalışan örnek apps/verify/src/routes/presentations.ts.

Sonucu yorumlama ​

outcomeAnlamıKullanıcıya
ACCEPTEDtüm adımlar geçtiyalnızca claims içindeki onaylanan alanları kullanın
REJECTEDbelge geçersiz (imza, iptal, süre, bağ, politika) — failed_step hangi adım"Belge kabul edilmedi"
INDETERMINATEaltyapı/tazelik sorunu (ör. D2/D4/D5 STATUS_STALE) — belge kötü değil"Şu an doğrulanamadı, tekrar deneyin"

checks_performed / checks_skipped denetim için saklanabilir; kişisel veri saklamayın (AP3/AP4). Saat kayması toleransı policy.freshness.max_clock_skew_sec (varsayılan 120 sn).

Kontrol listesi ​

  • Nonce tek kullanım; aynı yanıt ikinci kez işlenmez (PV10).
  • Politika yalnızca gereken alanı ister; yaş için mdoc age_over_18 gibi tek alan yeterli.
  • Status ön çekimi ve güven listesi yenilemesi çalışıyor (yoksa sonuçlar INDETERMINATE olur — bu doğru davranıştır).