🪪 KPS Client - NVİ Kimlik Doğrulama Paketi
🔗 GitHub: github.com/netinternet/kpsclient
Bu proje, Türkiye Cumhuriyeti Nüfus ve Vatandaşlık İşleri (NVİ) tarafından sunulan
Kimlik Paylaşımı Sistemi (KPS) v2 servislerine sorgu yapmaya yarayan basit, bağımsız bir Go paketidir.
⚠️ Önemli: KPS servisi herkese açık değildir. Sadece belirli nitelikteki kamu ve özel kuruluşlar bu sisteme dahil olabilir ve username/password kimlik bilgileri gerektirir.
Amaç, uygulamalarda T.C. kimlik numarası, ad-soyad ve doğum tarihi gibi bilgilerin doğrulanmasını güvenli şekilde sağlamaktır.
🚀 Öne Çıkan Özellikler
- STS (Token Service) ile kimlik doğrulama akışını otomatik olarak işler
- HMAC-SHA1 ile SOAP mesajlarını imzalar (KPS servisleriyle uyumlu olarak)
- SOAP cevabını parse edip anlamlı
Resultyapısını döndürür - Bağımsız, küçük ve kolay kullanılabilir API
🧠 Genel Bakış
KPS servisleri SOAP tabanlı çalıştığı için, bu istemci:
- WS-Trust (STS) isteğini gerçekleştirir
- STS tarafından döndürülen SAML tabanlı anahtarla servise HMAC-SHA1 imzalı SOAP isteği gönderir
- Gelen yanıtı parse ederek daha kullanışlı bir Go yapısına dönüştürür
Proje; kurum içi servisler, kamu API'leri, veya vatandaş doğrulama modülleri gibi ortamlarda kolayca entegre edilebilir.
📦 Kurulum
Go mod ile kullanmak için:
go get github.com/netinternet/kpsclient
veya doğrudan modunuzda:
import kpsclient "github.com/netinternet/kpsclient"
🚀 Hızlı Başlangıç
package main
import (
"context"
"time"
kpsclient "github.com/netinternet/kpsclient"
)
func example() {
client := kpsclient.New("KULLANICI_ADI", "PAROLA", nil)
req := kpsclient.QueryRequest{
TCNo: "99999999999",
FirstName: "JOHN",
LastName: "DOE",
BirthYear: "1990",
BirthMonth: "01",
BirthDay: "01",
}
ctx, cancel := context.WithTimeout(context.Background(), 40*time.Second)
defer cancel()
res, err := client.DoQuery(ctx, req)
if err != nil {
// hata yönetimi
}
// res.Result yapısını kullan
_ = res
}
⚙️ API Özeti
Client Oluşturma
func New(username, password string, httpClient *http.Client) *Client
- Yeni
Clientoluşturur httpClientnil ise 30s timeout'lu varsayılan kullanılır
Sorgu Yapma
func (c *Client) DoQuery(ctx context.Context, req QueryRequest) (Result, error)
- Verilen sorgu ile STS akışını yürütür
- Servise imzalı isteği gönderir
- Sonucu parse eder
Veri Yapıları
QueryRequest (Giriş):
TCNo- T.C. Kimlik NumarasıFirstName- AdLastName- SoyadBirthYear- Doğum YılıBirthMonth- Doğum AyıBirthDay- Doğum Günü
Result (Çıkış):
Status(bool) - İşlem durumuCode- 1: başarılı, 2: hatalı/bulunamadı, 3: ölümAciklama- Açıklama metniPerson-tc_vatandasi,yabanci,maviExtra(map) - Ek bilgilerRaw- Ham SOAP cevabı
🔐 Güvenlik Özellikleri
- WS-Security (UsernameToken) standardına uygun authentication
- HMAC-SHA1 imzalama (KPS servisleriyle uyumlu)
- UUID tabanlı request ID üretimi
- Timestamp + Nonce desteği
- XML Signature (ds:Signature) desteği
- TLS doğrulaması
⚠️ Güvenlik ve Notlar
- KPS servisi herkese açık değildir - sadece yetkili kuruluşlar erişebilir
- Username/password kimlik bilgileri NVİ tarafından verilir
- Paket KPS servisleriyle uyum için HMAC-SHA1 kullanır (STS tarafı gerekliliği)
- Parolaları ve anahtarları güvenli şekilde saklayın
.envdosyaları üretimde uygun değildir- Gelen
Rawalanı hata ayıklama amaçlıdır; gizli bilgi içerebilir
🧩 Akış Mantığı
// 1. Client oluştur
client := kpsclient.New("username", "password", nil)
// 2. Sorgu hazırla
req := kpsclient.QueryRequest{
TCNo: "99999999999",
FirstName: "JOHN",
LastName: "DOE",
BirthYear: "1990",
}
// 3. Sorguyu gönder
ctx, cancel := context.WithTimeout(context.Background(), 40*time.Second)
defer cancel()
result, err := client.DoQuery(ctx, req)
if err != nil {
log.Fatal(err)
}
// 4. Sonucu kullan
if result.Status {
fmt.Printf("Kimlik doğrulandı: %s\n", result.Person)
} else {
fmt.Printf("Hata: %s\n", result.Aciklama)
}
🎯 Kullanım Alanları
- Kurum İçi Servisler: Şirket içi kimlik doğrulama
- Kamu API'leri: Devlet kurumları için entegrasyon
- Vatandaş Doğrulama Modülleri: E-ticaret, bankacılık
- Mikroservis Mimarisi: Dağıtık sistemlerde kimlik doğrulama
📱 Bu Projeyi Paylaş
Bu projeyi beğendiyseniz, arkadaşlarınızla paylaşabilirsiniz:

