Appearance
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
- 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). - Güven kaynağı:
@tamga-network/trust→loadTrustSourceFromDir(dist)ya da periyodik indirme + yeniden yükleme (guardedReload). Güven sorusu yalnızcaTrustSourceüzerinden sorulur (BT4). - Status ön çekimi:
new PrefetchStatusCache()+ düzenlirefresh(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
outcome | Anlamı | Kullanıcıya |
|---|---|---|
ACCEPTED | tüm adımlar geçti | yalnızca claims içindeki onaylanan alanları kullanın |
REJECTED | belge geçersiz (imza, iptal, süre, bağ, politika) — failed_step hangi adım | "Belge kabul edilmedi" |
INDETERMINATE | altyapı/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_18gibi tek alan yeterli. - Status ön çekimi ve güven listesi yenilemesi çalışıyor (yoksa sonuçlar
INDETERMINATEolur — bu doğru davranıştır).