Skip to content
SPEC-ID-0003ŞartnameYürürlüktesürüm 1.0.02 Ekim 2026

Kısaca ​

Bu belge, bir kurumun belge vermeden önce kişinin gerçekten o kişi olduğunu nasıl doğruladığını (kimlik doğrulama (identity proofing)Belge verilmeden önce kişinin gerçekten o kişi olduğunun doğrulanması; örneğin kimlik kartı ve canlılık testiyle.) anlatır. Okuru belge veren (issuer)Belgeyi imzalayıp veren kurum: üniversite, meslek kuruluşu, kamu kurumu ya da şirket. kurumlar ve kimlik doğrulama sağlayıcısıyla bağlantı kuran geliştiricilerdir.

Ne zaman okunur

  • Önce Belge verme kavram sayfasını ve GUIDE-0003 rehberini okuyun.
  • Belgenin cüzdana nasıl bağlandığı burada değil: SPEC-CRED-0002.
  • Tamga'nın kimlik belgesi servisi için doğrudan §9'a gidin.

Sade anlatım

Her belge türü bir asgari güvence düzeyi (LoA (Level of Assurance)Bir kimliğe ya da belgeye ne kadar güvenilebileceği; Tamga kimlik doğrulama (T), belge veren (I) ve cüzdan (W) için ayrı seviyeler kullanır.) ister: öğrenci belgesi için e-posta ve SMS yeterlidir, diploma için daha güçlü bir doğrulama gerekir (örneğin kimlik kartı + canlılık testi + yüz eşleştirmesi ya da kurumun kayıt masası). Kurum bu düzeyi belgeyi vermeden önce sağlar; sağlayamıyorsa belge vermez. Uzaktan doğrulamayı lisanslı bir sağlayıcı yapar; kurum yalnızca sonucun kısa özetini saklar, kimlik görüntüleri saklanmaz ve düzey belgenin içine yazılmaz. Devlet kimlik belgesi gelene kadar Tamga'nın kimlik servisi bu doğrulamayı yapıp sonucu ayrı bir kimlik belgesi olarak cüzdana verir.


Kapsam ​

Bu şartname kurum tarafındaki kimlik doğrulamayı kapsar: "bu teklifi alan kişi gerçekten belgenin öznesi mi?" sorusunun belge vermeden önce nasıl cevaplandığı. Kapsam dışı: cüzdana bağlama (cnf/KB-JWT (Key Binding JWT)Cüzdanın gösterme anında belge anahtarıyla imzaladığı kısa belirteç; anahtarın belge sahibinde olduğunu kanıtlar. — SPEC-CRED-0002), doğrulayıcı (verifier)Gösterilen belgeyi denetleyen taraf: imza, belge verenin güven listesindeki kaydı, durum ve politika. Relying party diye de anılır. tarafında yüz eşleştirme (RP (Relying Party)Relying party'nin kısaltması: belge isteyen ve doğrulayan kuruluş. sorumluluğu), PID (Person Identification Data)Devletin en yüksek güvence seviyesinde verdiği temel kimlik verisi. Tamga bu rolü üstlenmez; Tamga'nın kimlik belgesi PID değildir. verme (Tamga PID vermez, BT8).

İlke (PM-ASSUR-0001; eIDAS (electronic IDentification, Authentication and trust Services)AB'nin elektronik kimlik ve güven hizmetleri tüzüğü; eIDAS 2.0 Avrupa Dijital Kimlik Cüzdanı'nı getirir. modeli): belge sahibinin (holder)Belgeyi cüzdanında tutan ve kime göstereceğine karar veren kişi. seviyesi belgeye (credential)Belge verenin imzaladığı ve kişinin cüzdanında duran dijital belge; kişi yalnız istenen alanları gösterir. yazılmaz; belge tipi bir asgari seviyeyi ön koşul olarak taşır; kurum, seviyeyi belge vermeden önce sağlar ve bağlama yolunu denetim kaydına yazar (SPEC-PROTO-0001/PR7).


1. Seviyeler ve yollar ​

SeviyeeIDAS LoAETSI TS 119 461 (D-ASSUR-2)YolNerede
T0——Cihaz anahtarı + e-posta/telefon OTP; kimlik iddiası yokAnonim / takma adlı senaryolar (beta'da kullanılmaz)
T1LowBaseline(a) e-postayla teklif + farklı kanaldan SMS tx_code; (b) OBS ekranında teklif (tek faktör); (c) banka mikro-transfer / GSM hat sahipliğiBelge veren / portal
T2SubstantialSubstantial (belge + canlılık veya yüz yüze)(a) Lisanslı uzaktan kimlik doğrulama (kimlik belgesi OCR/NFC + canlılık + yüz eşleştirme) — bu belgede "IDV sağlayıcı"; (b) OBS + MFA ekranında teklif; (c) kurum kayıt masası (yüz yüze, personel onayı)IDV sağlayıcı / portal / masa
T3HighHighNES / Mobil İmza ile nonce imzalama (ilk aşamadan itibaren); devlet aşamasında PIDYalnızca authorization code veya yüz yüze; pre-authorized ile yasak (ETSI TS 119 472-3 GEN-REQ-4.1)

Tip ↔ asgari seviye rulebookBağlayıcı kurallar seti. Tamga Rulebook tüm katılımcıların kurallarını taşır; her belge türünün ondan dallanan kendi rulebook'u vardır.'larda: Education Rulebook — öğrenci belgesi T1, diploma T2 (FW-RB-0002 §4). Kurum, tipin seviyesini sağlayamıyorsa teklif üretmez (belge verme durur; tahmin/yükseltme yok).


2. Akış — kimlik doğrulama, belge verme zincirinde nerede ​

Portal/OBS oturumu (kişi)                        Issuer servisi
   │  "Diplomamı cüzdanıma al"                       │
   ├── tip = Diploma → gerekli seviye T2 ────────────▶│ mevcut seviye? (oturum tipi, önceki proofing kaydı ≤ 12 ay)
   │                                                  │
   │  ◀── yetersizse: IDV oturumu başlat (T2a)  ──────┤  POST /v3/session  → url
   │  IDV sağlayıcı sayfası: belge + selfie           │
   │  ──▶ tamamlandı (callback / webhook) ───────────▶│ decision → T seviyesi + kayıt
   │  ◀── offer (QR + tx_code)  ──────────────────────┤ PR7: audit {path:"idv:<provider>", level:"T2", session_ref}
   ▼                                                  ▼
Cüzdan OpenID4VCI (SPEC-PROTO-0001) — değişmez

Kimlik doğrulama teklif üretiminden önce biter; teklifin kendisi ve tx_code kuralları değişmez (PR1, PR3, DB-5). Sonuç 12 ay (ÖNERİ) boyunca aynı kişi için yeniden kullanılabilir; assurance decay kuralları geçerlidir (PM-ASSUR-0001 §Decay).


3. Uzaktan kimlik doğrulama sağlayıcısı — genel kurallar ​

#Kural
IP1Sağlayıcı sonucu yalnızca belge veren tarafında değerlendirilir; cüzdan ve doğrulayıcı sağlayıcıyla konuşmaz.
IP2Belge veren, sağlayıcı oturumunu kendi öznesine bağlar: vendor_data = belge verenin iç opak referansı (öğrenci kaydının rastgele token'ı); kimlik numarası, ad, e-posta vendor_data'ya yazılmaz.
IP3Beklenen kimlik (ad, soyad, doğum tarihi) sağlayıcıya expected_details olarak verilebilir; sağlayıcı eşleştirme yapar; belge veren sonucu ayrıca kaynak veriyle karşılaştırır (ad-soyad + doğum tarihi tam eşleşme; fark → İnceleme).
IP4Belge verenin sisteminde saklanan şey sonuç özetidir: {provider, session_ref, level, decided_at, checks:[id_document, liveness, face_match], expires_at}. Belge görüntüsü, portre, OCR ham verisi, video saklanmaz (FW-RB-0001 RB-AP-23).
IP5Sağlayıcı tarafındaki saklama süresi sözleşmeyle asgariye çekilir; KVKK aydınlatma metni sağlayıcıyı veri işleyen olarak adlandırır.
IP6Webhook MUST imza + zaman damgası ile doğrulanmak; imzasız/eski (> 300 s) webhook reddedilir; event_id ile tekilleştirme.
IP7Webhook yalnızca tetikleyicidir; karar her zaman sağlayıcının decision API'sinden çekilerek teyit edilir (webhook gövdesine güvenilmez).
IP8"In Review" / "Declined" / "Expired" → teklif üretilmez; kişiye sağlayıcı sonucu değil, "kurum kayıt masasına başvurun" yolu gösterilir. Ret gerekçesi kişiye sağlayıcı dilinde aktarılmaz.
IP9Sağlayıcı kesintisinde diploma verilmesi durur (T1'e düşürülmez); öğrenci belgesi (T1) etkilenmez.
IP10Sağlayıcı ve iş akışı kimliği (workflow_id) kiracı yapılandırmasındadır; kod sağlayıcıya özel değil, adaptör arayüzü üzerinden çalışır (IdvProvider — §6).
IP11Log: olay türü + session_ref + seviye; kişi adı, belge numarası, skor yazılmaz (AP3 ruhu).

4. Referans sağlayıcı: Didit (v3 API) — protokol eşlemesi ​

Kaynak: docs.didit.me (2026-09-24 tarihinde doğrulandı). Değişebilir; adaptör sürümlenir.

AdımDiditTamga kullanımı
Kimlik doğrulamax-api-key: <API_KEY> (Business Console → Application → API & Webhooks)Kiracı gizli değeri (TAMGA_IDV_DIDIT_API_KEY); .env, asla depoda
Oturum oluşturPOST https://verification.didit.me/v3/session/ gövde: workflow_id (zorunlu), vendor_data, callback, callback_method, metadata, language, contact_details, expected_details {first_name,last_name,date_of_birth,id_country,expected_document_types}vendor_data = <opak subject_ref>; callback = https://id.tamga.network/idv/return?r=<akış>; language = tr; expected_details ad/soyad/doğum tarihi (IP3); metadata boş
Yanıtsession_id, session_token, url, status: "Not Started", workflow_versionurl'e yönlendir; session_id = session_ref
SonuçGET https://verification.didit.me/v3/session/{sessionId}/decision/ → status, features[], id_verifications[] {status, first_name, last_name, date_of_birth, document_type, issuing_state, expiration_date, verification_method, assurance, …}, liveness_checks[] {status, score}, face_matches[] {status, score}, nfc_verifications[], aml_screenings[]Yalnızca status ve alt kontrol status'ları + ad/soyad/doğum tarihi eşleşme sonucu (boolean) tutulur; görüntü alanları (portrait_image, front_image, back_image, video_url) okunur ama saklanmaz
WebhookPOST gövde: event_id, webhook_type (status.updated …), session_id, status, vendor_data, decision, timestamp, created_at, environment; başlıklar X-Signature-V2 (HMAC-SHA256, kanonik JSON), X-Signature (ham gövde), X-TimestampX-Signature (ham gövde) + X-Timestamp (±300 s) doğrulanır; event_id tekilleştirme; sonra decision API teyidi (IP7). Yeniden deneme: ~1 dk, ~4 dk; 5 s zaman aşımı → uç nokta hızlı 200 döner, işlem kuyruğa
DurumlarNot Started, In Progress, Awaiting User, In Review, Approved, Declined, Resubmitted, Expired, Kyc Expired, Abandoned§5 eşlemesi
İş akışıBusiness Console'da no-code workflow: ID + liveness + face match (+ NFC opsiyonel)Tamga workflow'u: ID document + passive liveness + face match; AML kapalı (amaç sınırlaması); phone/email kapalı (T1 zaten SMS ile)
KanalHosted URL (yönlendirme), iframe, mobil SDK (iOS/Android/RN)Bugün (liste aşaması): hosted URL (kimlik servisi id.tamga.network üzerinden, masaüstü/mobil tarayıcı). Cüzdan içi SDK kullanılmaz (kimlik ispatı kurumun işidir, cüzdanın değil)
Sandboxsandbox_scenario alanı; environment: "sandbox"Demo: sandbox senaryolarıyla; e2e testte sahte adaptör
Ücret500 doğrulama/ay ücretsiz; sonrası kullanım başınaPilot ölçeği ücretsiz kotada

5. Sonuç → seviye eşlemesi ​

Didit statusAlt kontrollerAd/soyad/doğum tarihi eşleşmesiTamga sonucu
Approvedid_verifications[].status = Approved ∧ liveness_checks[].status = Approved ∧ face_matches[].status = ApprovedTam eşleşmeT2 (path: "idv:didit")
ApprovedNFC Approved (çipli belge)TamT2 (not: nfc: true; T3 değil — T3 için imza gerekir)
Approvedherhangi biri Approved değil—Yetersiz → masa
Approvedhepsi ApprovedEşleşmiyorİnceleme (personel kararı; otomatik T2 yok)
In Review——Bekle (≤ 24 s); sonra personel
Declined, Expired, Kyc Expired, Abandoned——Yetersiz; yeni oturum ≤ 3 deneme / 24 s
Not Started, In Progress, Awaiting User, Resubmitted——Devam ediyor

Belge türü kısıtı: expected_document_types = ["ID", "P"] (TC kimlik kartı, pasaport); issuing_state kurum ülkesiyle veya öğrencinin uyruğuyla uyumlu olmalı (uyruk kaynak veride yoksa kısıt uygulanmaz).


6. Adaptör arayüzü (uygulama sözleşmesi) ​

ts
interface IdvProvider {
  readonly id: "didit" | string;
  createSession(input: {
    subjectRef: string;                 // opak, kişi verisi değil
    expected: { givenName: string; familyName: string; birthDate: string };
    locale: "tr" | "en";
    returnUrl: string;
  }): Promise<{ sessionRef: string; url: string; expiresAt: number }>;
  fetchDecision(sessionRef: string): Promise<IdvDecision>;
  verifyWebhook(rawBody: Uint8Array, headers: Record<string, string>): { ok: boolean; eventId?: string; sessionRef?: string };
}
type IdvDecision =
  | { state: "PENDING" }
  | { state: "REVIEW" }
  | { state: "FAILED"; reason: "declined" | "expired" | "abandoned" | "mismatch" | "incomplete" }
  | { state: "PASSED"; level: "T2"; checks: { idDocument: true; liveness: true; faceMatch: true; nfc?: boolean }; decidedAt: number; expiresAt: number };

Saklanan kayıt (belge veren servis data/<slug>/state.json › proofing[subjectRef]): { provider, sessionRef, level, checks, decidedAt, expiresAt } — başka alan yok.


7. Hata ve sınır davranışı ​

DurumDavranış
Sağlayıcı 5xx / zaman aşımıDiploma teklif üretilmez; kişiye "şu an kimlik doğrulama yapılamıyor" + masa seçeneği
Webhook imzası geçersiz400; olay kütüğü; işlem yok
Webhook gelmediPortal return sayfası decision API'yi sorgular (polling ≤ 10 dk, 15 s aralık)
Kişi 3 kez başarısız24 saat kilit; masa yolu
Sonuç 12 ayı geçtiYeniden ispat (decay)
Kayıt masası yoluPersonel paneli: "kimliği gördüm" onayı → path: "desk", level: T2, personel kimliği denetim kaydında

8. Değişmezler ​

#Değişmez
IDP1Belge sahibinin kimlik doğrulama seviyesi ve yolu belgeye yazılmaz; yalnızca belge verenin denetim kaydında tutulur.
IDP2Tipin asgari seviyesi sağlanmadan teklif üretilmez; seviye tahminle yükseltilmez.
IDP3IDV sağlayıcı entegrasyonu yalnızca Tamga kimlik attestation servisindedir (id.tamga.network, ADR-0011); kurumların belge verme servisleri, cüzdan ve doğrulayıcı sağlayıcıyla konuşmaz.
IDP4Belge veren, IDV sonucundan yalnızca özet kaydı saklar; belge görüntüsü, portre, video, OCR ham verisi saklanmaz.
IDP5Webhook imza ve zaman damgası doğrulanmadan işlenmez; karar her zaman decision API'den teyit edilir.
IDP6vendor_data/metadata alanlarına kişisel veri yazılmaz; yalnızca opak referans.
IDP7T3 hiçbir uzaktan IDV sonucuyla verilmez; T3 imza (NES/mobil imza) veya PID gerektirir ve pre-authorized akışla bağdaşmaz.
IDP8Sağlayıcı kesintisi seviyeyi düşürmez; o seviyeyi gerektiren belge verme durur.
IDP9Kimlik servisi IDV sonucundan kişi alanlarını yalnızca belge verme anına kadar tutar; belge verildikten sonra yalnızca opak subject_ref, belge numarası hash'i, süre ve status indeksleri kalır; görüntü, selfie, video, OCR ham verisi Tamga'da hiç saklanmaz (K4).
IDP10Ulusal kimlik numarası (personal_administrative_number) yalnızca urn:tamga:id:IdentityAttestation:1 tipinde ve selective disclosure ile taşınır; başka hiçbir tipe yazılmaz; kurum eşleştirmeden sonra saklamaz ve loglamaz.
IDP11Kimlik attestation'ı verilmeden önce aydınlatma metni gösterilir ve açık rıza alınır; rıza verilmeyen oturumda IDV başlatılmaz (access_denied).

9. Tamga kimlik belgesi servisi ​

Devlet PID sağlayıcısı atanana kadar uzaktan kimlik doğrulama Tamga'nın kimlik servisinde yapılır ve sonucu bir belge olarak cüzdana verilir. Bu belge PID değil, Tamga'nın belge veren olarak (category: IDENTITY, class: EAA, I2; belgede category claim'i yok — ADR-0022) verdiği nitelikli olmayan bir EAA (Electronic Attestation of Attributes)Kişinin bir özniteliğini (diploma, üyelik gibi) doğrulayan belge için eIDAS'taki ad.'dır; pid_providers[] boş kalır (TL8).

ÖğeDeğer
vcturn:tamga:id:IdentityAttestation:1 (katalog: id/IdentityAttestation/1.0.0)
Claim'lergiven_name, family_name, birth_date, nationality, personal_administrative_number (TCKN), document_type, document_number_hash (anahtarlı SHA-256 / HMAC; 1.0.1), issuing_country, document_chip_verified, verification_method (remote-document-liveness-face | remote-nfc-liveness-face | in-person), age_over_18 — tümü selective disclosure ile; portre yok; LoA claim'i yok (PR7)
Süre / statusexp = belge verme + 730 gün; Token Status List (id.tamga.network/status/{listId}); aynı belge yeniden doğrulanınca eskisi iptal (K6)
AkışCüzdan: PAR (WUA) → tarayıcı /authorize (KVKK aydınlatma + açık rıza) → sağlayıcı (Didit v3; demo: FAKE, sapma S-15) → /idv/return karar sorgulama (webhook yalnızca tetik, IDP5) → code → token (PKCE + WUA) → 10 kopya
Kurumda kullanımKurumun belge veren servisi belge verilirken kimlik belgesinin gösterilmesini ister (DCQL: TCKN, doğum tarihi, ad, soyad), T0 + A–E doğrular, kayıtla eşler (TCKN + doğum tarihi; ad normalize uyarı) — SPEC-PROTO-0001 §11.2
SeviyeUzaktan belge + canlılık + yüz = T2 (ETSI 119 461 Substantial); NFC çip = document_chip_verified: true (High teknik; hukuken T3 = NES/Mobil İmza, IDP7)
Veri sorumlusuTamga Network (K4): saklama kayıt + hash; silme talebi = §9.1 (kayıt silinir, kopyalar iptal, sağlayıcıda görüntüler silinir); sağlayıcı sözleşmesinde ≤ 30 gün görüntü saklama
WebhookTek hedef https://id.tamga.network/idv/webhook, olay status.updated; kurum başına webhook yoktur

Uygulama: apps/id (operatör deposu) (config/didit/store/app), IdvProvider arayüzü §6 ile aynı (DiditProvider, FakeIdvProvider).

9.1 Kişinin silme isteği — POST /erasure ​

Kişi hesabı yoktur; istek servisin verdiği belgelerin gösterilmesiyle kanıtlanır.

ÖğeDeğer
İstek{ "presentations": [ SD-JWT VC + KB-JWT, … ] } (1–20); hiçbir alan açılmaz; KB-JWT aud = servis adresi, nonce = POST /nonce (tek kullanımlık)
Doğrulamaimza bu servisin (issuerId), sahiplik KB-JWT cnf anahtarıyla; kayıt iptal listesi indeksinden bulunur
Etkikaydın bütün kopyaları INVALID; kayıt ve ona bağlı olay günlüğü satırları silinir; sağlayıcı oturumu privacy_erasure ile silinir (IdvProvider.deleteSession)
Yanıt`{ erased, rejected, provider: "deleted"
Günlükyalnız sayılar (erasure: kayıt sayısı, sağlayıcı sonucu); kayıt kimliği ve subject_ref yazılmaz

İptal listesinde (status list)Her belgenin tek bir konumu olduğu sıkıştırılmış, imzalı liste; geçerli, askıda ya da iptal olduğunu söyler. yalnız bitler kalır (kişi verisi değil). Takma ad (pseudonym)Cüzdanın her web sitesi için ayrı türettiği kararlı hesap kimliği; iki site aynı kişiyi eşleştiremez. tohumu servis tarafında saklanmadığı için silinecek bir şey yoktur (PS2); kişi kimliğini yeniden doğrularsa aynı tohum yeniden türer (ADR-0031).

9.2 Mağaza incelemesi — tek kullanımlık inceleme kodu (ADR-0033) ​

ÖğeDeğer
KodOperatör üretir (ops/review-code.ts create); 26 karakter (130 bit), en çok 14 gün, tek kullanımlık, aynı anda en çok 3 etkin; veritabanında yalnız HMAC özeti (review_codes; RV1)
Giriş/authorize aydınlatma sayfasında "İnceleme kodu" alanı (POST /authorize/consent, review_code); boşsa akış değişmez
EtkiGeçerli kodla yalnız o PAR için deneme doğrulaması (/review-idv/{oturum}, gerçek sağlayıcıya istek yok); kişi koda özgü DEMO kişi (ad "DEMO", soyad "App Reviewer")
İmzaAyrı DEMO imzacısı tamga-id-review (güven listesinde I1); gerçek imzacı kullanılmaz (RV2). İptal listesi kimlik servisinin listesi
Belgeverification_method: review-demo, en çok 7 gün; takma ad tohumu ayrı anahtardan (gerçek tohumlarla çakışmaz)
KabulI2 isteyen hiçbir politikada geçmez; yalnız Tamga Verify review-* politikaları (I1)
SınırPAR başına 5 hatalı deneme; servis geneli 10 dakikada 20 hatada 15 dakika kilit (IP kullanılmaz); nginx /authorize/consent hız sınırı
KapalıDEMO anahtarı yoksa ya da güven listesi tamga-id-review'ı tanımıyorsa kod girilse de "etkin değil" (503)
Günlükreview_code.accepted / .used (kod kimliği), .rejected (ayrıntısız); kod ve özeti asla

Güvenlik ve Mahremiyet Notları ​

  • Kimlik doğrulama amaç sınırlıdır: yalnızca belge vermenin ön koşulu; AML/PEP taraması kapalı.
  • Sağlayıcı, kişinin belgesini ve yüzünü görür; bu, KVKK aydınlatma metninde açıkça yazılır ve sağlayıcı seçimi (veri lokasyonu, saklama süresi, alt işleyenler) sözleşmeyle bağlanır.
  • expected_details sağlayıcıya ad/soyad/doğum tarihi verir (kaynak veriden); bu, eşleşme kalitesini artırır ama veri paylaşımıdır; alternatif (sağlayıcıdan gelen ad ile kurumda eşleştirme) IP3'te tanımlıdır ve kiracı tercihine bırakılır (ÖNERİ: varsayılan paylaşma).
  • Demo'da sandbox; gerçek kişi verisi işlenmez (GT1).

Açık Konular ​

  1. Sonuç yeniden kullanım süresi (12 ay) ve deneme sınırları — sayılar ÖNERİ.
  2. Cüzdan içi IDV (SDK) hiçbir zaman mı? Devlet aşamasında PID ile gereksizleşir; şimdilik hayır.
  3. Sağlayıcı çeşitliliği: ikinci adaptör (yerli sağlayıcı / e-Devlet) — tedarikçi kilidi tripwire'ı.

İlgili Dokümanlar ​

PM-ASSUR-0001 · PM-ID-0001 · SPEC-PROTO-0001 · SPEC-CRED-0002 · SPEC-WALLET-0001 · FW-RB-0001 · FW-RB-0002 · ADR-0005 · ADR-0011 · ADR-0022

Durum ​

Yürürlükte — sürüm 1.0.0 (2026-10-02).