← Back to list

Kotlin ile Android Tabanlı TC Kimlik Doğrulama

Herkese merhaba, bugün “ Kotlin ile Android Tabanlı TC Kimlik Doğrulama Uygulaması ” hakkında elimden geldiğince detaylı değinmeye…

Batın Gökçe Savran · 2024-04-06 14:01 · 43 claps · 3.1 min read
#kotlin #android #mernis #okhttp
Open on Medium ↗
Wiki topics: 📱 · Mobile Development

Kotlin ile Android Tabanlı TC Kimlik Doğrulama

Herkese merhaba, bugün “ Kotlin ile Android Tabanlı TC Kimlik Doğrulama Uygulaması ” hakkında elimden geldiğince detaylı değinmeye çalışacağım. Hazırsanız başlayalım.

Kotlin ve OkHttp kütüphanesi kullanarak basit bir TC Kimlik doğrulama uygulaması yapmayı öğreneceğiz. Uygulama, Türkiye Cumhuriyeti Kimlik Numarası Sorgulama Servisi üzerinden kimlik doğrulama işlemini yapmamızı sağlar.

Proje, Kotlin programlama dili ve OkHttp kütüphanesi kullanılarak geliştirilmiştir. Kullanıcının ad, soyad, TC kimlik numarası ve doğum yılı bilgilerini girdiği bir form bulunmaktadır. Bu bilgiler, Türkiye Cumhuriyeti Kimlik Numarası Sorgulama Servisi’ne gönderilir ve bu şekilde doğrulanır.

İlk olarak, iç içe sınıfımızı oluşturuyoruz. Bu iç içe sınıf, arka planda çalışacak olan SOAP (Simple Object Access Protocol) isteği için gerekli işlemleri içerir ve AsyncTask sınıfından türetilmiştir.

inner class SoapRequestTask : AsyncTask<String, Void, Boolean>() {
  ***
}

İç içe sınıf içindeki işlevlerden ilki, “doInBackground” fonksiyonudur. Bu fonksiyon, arka plandaki işlemleri gerçekleştiren ana fonksiyondur. Bu kısımda SOAP isteği yapılır ve gelen yanıt işlenir. Önce bir String olarak alınan yanıt daha sonra diğer bir fonksiyona iletilerek Boolean olarak işlenir.

inner class SoapRequestTask : AsyncTask<String, Void, Boolean>() {
   override fun doInBackground(vararg params: String?): Boolean {
      val client = OkHttpClient()

      val mediaType = "application/soap+xml; charset=utf-8".toMediaType()
      val requestBody = getSoapRequestBody(params[0], params[1], params[2], params[3])
      val request = Request.Builder()
          .url("https://tckimlik.nvi.gov.tr/Service/KPSPublic.asmx")
          .post(requestBody)
          .addHeader("Content-Type", "application/soap+xml; charset=utf-8")
          .addHeader(
              "Cookie",
              "TS01326bb0=0179b2ce456757ef584bd54018d03ef6bde1c4dd044111d4a52c7617577d052b47928daeb9c9509323b952a0b2cfb2ab4746016de3"
          )
          .build()

      try {
          val response = client.newCall(request).execute()
          val responseBody = response.body.string()

          return parseSoapResponse(responseBody)
      } catch (e: Exception) {
          e.printStackTrace()
      }

      return false
  }
}

İkinci fonksiyonumuz olan “getSoapRequestBody”, kullanıcının girdiği bilgilere göre body’i güncelleyerek, “doInBackground” fonksiyonuna güncellenmiş bir body vermektedir.

inner class SoapRequestTask : AsyncTask<String, Void, Boolean>() {
  private fun getSoapRequestBody(name: String?, surname: String?, identityNumber: String?, birthYear: String?): okhttp3.RequestBody {
            return "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<soap12:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap12=\"http://www.w3.org/2003/05/soap-envelope\">\r\n  <soap12:Body>\r\n    <TCKimlikNoDogrula xmlns=\"http://tckimlik.nvi.gov.tr/WS\">\r\n      <TCKimlikNo>$identityNumber</TCKimlikNo>\r\n      <Ad>$name</Ad>\r\n      <Soyad>$surname</Soyad>\r\n      <DogumYili>$birthYear</DogumYili>\r\n    </TCKimlikNoDogrula>\r\n  </soap12:Body>\r\n</soap12:Envelope>".toRequestBody(
                "application/soap+xml; charset=utf-8".toMediaType())
        }
}

Üçüncü fonksiyon olan “parseSoapResponse”, “doInBackground” fonksiyonundan gelen String yanıtı bir Boolean değerine dönüştürerek ana fonksiyona döndürmektedir. Bu fonksiyon, yanıttaki “TCKimlikNoDogrulaResult” tag’ının içinde yer alan True veya False değerini Boolean’a çevirmektedir.

inner class SoapRequestTask : AsyncTask<String, Void, Boolean>() {
  private fun parseSoapResponse(responseBody: String?): Boolean {
            try {
                val factory = DocumentBuilderFactory.newInstance()
                val builder = factory.newDocumentBuilder()
                val input = ByteArrayInputStream(responseBody?.toByteArray())

                val document: Document = builder.parse(input)
                val element: Element = document.documentElement

                val nodeList: NodeList = element.getElementsByTagName("TCKimlikNoDogrulaResult")

                if (nodeList.length > 0) {
                    val resultValue = nodeList.item(0).textContent.trim()
                    return resultValue.toBoolean()
                }
            } catch (e: Exception) {
                e.printStackTrace()
            }

            return false
        }
    }
}

Dördüncü olarak, “onPostExecute” fonksiyonu işlemler sonucunda elde edilen veriye bağlı olarak kullanıcıyı bilgilendirmek amacıyla kullanılır.

inner class SoapRequestTask : AsyncTask<String, Void, Boolean>() {
  override fun onPostExecute(result: Boolean) {
            if (result) {
                showToast("Doğrulama Başarılı")
            } else {
                showToast("Doğrulama Hatalı")
            }
        }
}

//Inner Class dışında mesaj oluşturmayı kolaylaştırmak amaçlı.
private fun showToast(message: String) {
        Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
}

Elbette, unutmayın ki sınıf dışında da bazı işlemler yapmamız gerekiyor. Örneğin, verileri göndereceğimiz bir buton tıklaması ve hata kontrolleri gibi. Bunları da aşağıya ekliyorum.

buttonControl.setOnClickListener {
    if (name.isEmpty() || surname.isEmpty() || identityNumber.isEmpty() || birthYear.isEmpty()) {
        showToast("Lütfen tüm alanları doldurunuz!")
        return@setOnClickListener
    }
    if (identityNumber.length != 11) {
        showToast("TC Kimlik Numarası 11 haneli olmalıdır!")
        return@setOnClickListener
    }

    val currentYear = LocalDate.now().year

    if (birthYear.length != 4 || birthYear.toInt() < 1900 || birthYear.toInt() > currentYear) {
        showToast("Geçerli bir doğum yılı giriniz!")
        return@setOnClickListener
    }

    val soapRequestTask = SoapRequestTask()
    soapRequestTask.execute(name, surname, identityNumber, birthYear)
}

KAYNAKLAR

  1. Türkiye Cumhuriyeti Kimlik Numarası Sorgulama Servisi
  2. Youtube Videosu
  3. turkishIdentifiesControl

Bu proje Kotlin programlama dilini ve OkHttp kütüphanesini kullanarak Türkiye Cumhuriyeti Kimlik Numarası Sorgulama Servisi üzerinden basit bir kimlik doğrulama uygulaması oluşturmayı hedefliyor. Uygulama, kullanıcıların TC Kimlik numaralarını doğrulamak için bu hizmeti kullanmalarını sağlar. OkHttp kütüphanesi, HTTP isteklerini yönetmek ve yanıtları işlemek için kullanılır. Bu uygulama sayesinde, Kotlin dilini kullanarak web tabanlı bir hizmetle nasıl etkileşimde bulunulacağını öğrenme fırsatı bulunur. Bu proje aynı zamanda temel hata yönetimi ve ağ isteklerini asenkron olarak nasıl yönetileceğine dair uygulamalı bir örnek sunar.

Bu yazımda sizlere elimden geldiğince Kotlin ile Android Tabanlı TC Kimlik Doğrulama konusunu açıklamaya çalıştım. Daha fazla bilgi için buraya gidebilirsiniz. Yazılarımla ilgili geri dönüş yapmak isterseniz Linkedin hesabımdan benimle iletişime geçebilirsiniz. Umarım hepiniz için yararlı bir yazı olmuştur. Okuduğunuz için teşekkür ederim. Bir sonraki yazılarda görüşmek üzere…

İletişim için: https://bento.me/batingokcesavran


메타데이터
post_id
e03aef8a666a
slug
kotlin-ile-android-tabanlı-tc-kimlik-doğrulama-e03aef8a666a
url
https://medium.com/@batinsavran/kotlin-ile-android-tabanl%C4%B1-tc-kimlik-do%C4%9Frulama-e03aef8a666a
canonical_url
https://medium.com/@batinsavran/kotlin-ile-android-tabanl%C4%B1-tc-kimlik-do%C4%9Frulama-e03aef8a666a
author_url
https://medium.com/@batinsavran
status
ok
fetched_at
2026-07-24 03:02:43