Merhaba! Bu yazıda, Android uygulamamızda Google ile giriş yapma ve kaydolma özelliklerini adım adım nasıl entegre edebileceğimizi inceleyeceğiz. Şu anda geliştirmekte olduğum Harmony Haven projesine bu özelliği entegre etmeye çalışırken, güncel Türkçe kaynakların sınırlı ve yetersiz olduğunu fark ettim. Bu eksikliği gidermek adına hazırladığım bu rehberde, Google ile oturum açmayı baştan sona detaylandıracak ve kendi backend sunucumuza entegre ederek süreci daha hızlı ve güvenli hale getirmenin yollarını göstereceğim.
Adımlara geçmeden önce sürecin genel işleyişine hızlıca bir göz atalım: Kullanıcı “Google ile Giriş Yap” seçeneğine tıkladığında, cihazı Google sunucusuna bir ID Token talebi gönderir. Google sunucusu bu talebi onaylayarak kullanıcıya bir ID Token ile yanıt verir. Ardından kullanıcı, bu tokeni bizim backend sunucumuza iletir. Sunucumuz bu tokeni doğrular ve içindeki kullanıcı bilgilerini (örneğin isim, e-posta, profil fotoğrafı linki gibi) alır. Daha sonra veritabanında bu kullanıcı kaydının mevcut olup olmadığını kontrol ederiz. Aşağıda bu süreci adım adım detaylandırdım.

Genel mantığı anladıktan sonra, şimdi adım adım bu işlemleri nasıl gerçekleştireceğimize geçebiliriz.
Adım 1: Google API Console Üzerinde Proje Oluşturma
Google ile giriş işlemi için önce bir Google API Console projesi oluşturmanız gerekiyor:
- Google API Console sayfasına gidin: Google API Console.
- Yeni bir proje oluşturun ya da mevcut projelerinizden birini seçin.
- OAuth onay ekranı (OAuth consent screen) bölümüne gidin ve tüm bilgilerin eksiksiz doldurulduğundan emin olun. Özellikle, uygulamanızın gizlilik politikası (privacy policy) ve hizmet şartları (terms of service) bağlantılarının doğru bir şekilde girildiğinden emin olun.

- Kimlik Bilgileri (Credentials) sayfasına gidin, “Kimlik Bilgileri Oluştur” (Create Credentials) butonuna tıklayın ve OAuth İstemci Kimliği (OAuth Client ID) seçeneğini tıklayın.

- Ardından uygulama türünü (Application Type) Android olarak seçin.

Uygulama türünü android olarak seçtikten sonra ilgili alanları şu kriterlere uygun şekilde dolduralım ;
- Proje İsmi: Proje adını dilediğiniz gibi seçebilirsiniz; bu isim sadece Google API Console üzerinde projeyi tanımlamanıza yardımcı olur ve uygulamanızın işleyişini etkilemez
- Paket İsmi (Package Name): Paket ismi, Google Sign-In özelliğini entegre etmek istediğiniz Android uygulamanızın paket kimliğidir. Bu ismi, projenizdeki
Gradle Scriptsalt dizininde,appseviyesindeki modülünüzünandroidkapsamındakinamespacealanında bulabilirsiniz. Bu isim, projenizin benzersiz kimliğini belirtir ve Google API Console’a doğru bilgileri iletmenizi sağlar.

SHA-1 Sertifikası Parmak İzi (SHA-1 Certificate Fingerprint): Bu alanda dikkatli olmak oldukça önemlidir. Eğer bu kısmı doğru bir şekilde anlamazsak, beklenmedik ve çözümü zor sorunlarla karşılaşabiliriz. Özellikle, uygulamamız üretim (production) aşamasındaysa ve Google Play Store’da yayımlanmışsa, zaten elinizde .jks uzantılı bir keystore dosyası bulunuyor olmalıdır.
Üretim ortamında Google ile giriş yapma özelliğini entegre etmek istiyorsanız, bu durumda ilgili keystore dosyanızdaki SHA-1 sertifika parmak izini kullanmanız şarttır. Yanlış veya eksik bir parmak izi, uygulamanızın bu özelliği düzgün bir şekilde çalıştırmasını engelleyebilir, bu da kullanıcı deneyimini olumsuz etkileyebilir. Bu nedenle, bu adımı dikkatlice gerçekleştirmek büyük bir önem taşımaktadır.
Google ile giriş yapma özelliğinin hem debug hem de production sürümlerinde çalışmasını sağlamak için, aynı bilgilerle (fakat farklı sha-1) iki ayrı Android OAuth istemcisi (OAuth client) oluşturmanız gerekecektir. Eğer uygulamanız Google Play Store’da yayımlanmışsa, her iki ortam için de ayrı OAuth istemcileri oluşturmalı ve her birine ilgili SHA-1 sertifikalarını eklemelisiniz.
Bu süreçte dikkat edilmesi gereken önemli bir nokta, eğer bu adımları atlar ya da yanlış uygularsanız, Google Sign-In özelliği üretim ortamında çalışırken geliştirme ortamında çalışmayabilir ya da tam tersi bir durumla karşılaşabilirsiniz. Üretim ortamında ortaya çıkan bu tür sorunların kaynağını tespit etmek, genellikle zorlayıcı olabilir. Bu nedenle, başlangıçta doğru yapılandırma yapmak, ileride karşılaşabileceğiniz sorunları önlemek açısından kritik öneme sahiptir.
Eğerki uygulamamız prodution’da ise ve halihazırda play store’da yüklü ise .jks uzantılı keystore dosyamızın olduğu dizine gidelim benim keystore’ları ve bunların şifrelerini tuttuğum ayrı bir klasorum bunun üzerinden süreci görselleştireceğim

Ardından, ilgili dizinde CMD (Komut İstemi) veya Terminal’i başlatalım

keytool -keystore (keystore dosyanızın adı) -list -v
Keystore dosyanızın adını parantez içine yazarak parantezleri kaldırıp aşağıdaki gibi yapıştıralım:

İlgili satırı yazıp Enter tuşuna bastığınızda sizden keystore şifreniz istenecek. Yazdığınız karakterler görünmeyecek, bu yüzden endişelenmeyin; sadece şifreyi girdikten sonra Enter‘a basmanız yeterli olacaktır. Ardından, nihayet SHA-1 sertifika parmak izinize erişeceksiniz! 😊

Eğer bu özelliğin debug versiyonunda (geliştirme aşamasında) da çalışmasını istiyorsak, bunun için ayrı bir SHA-1 parmak izi sertifikasıyla aynı adımları tekrarlamamız gerekecek. Ancak bu işlem biraz daha kısa bir süreç olacak. Android Studio’yu açarak Gradle bölümünden ilgili navigasyonları aşağıdaki gibi gerçekleştirelim: Gradle > Tasks > android > signingReport seçeneğine tıklayalım.

Bu komuta tıkladıktan sonra, aşağıdaki gibi bir sonuç alacağız:

Ardından, buradaki SHA-1 parmak izi sertifikasını kullanarak yeni bir Android istemcisi oluşturmalıyız. İlgili SHA-1 kodunu kullanarak aynı adımları tekrar uygulayalım.
Buraya kadar her şeyi tamamladıktan sonra, artık bir Web Client ID oluşturma zamanı geldi. Bunun için aşağıdaki gibi Credentials bölümüne gidip Web application seçeneğini seçmemiz gerekiyor. Bu adım oldukça basit; istediğimiz bir ismi seçip devam etmemiz yeterli olacaktır.

Google API Console’daki yapılandırmalarımızı tamamladık. Credentials bölümü aşağıdaki gibi görünmelidir:

Şimdi Android Studio’ya geçelim.
Uygulama seviyesindeki build.gradle dosyanızı açın ve Google ile giriş işlemleri için gerekli olan bağımlılıkları aşağıdaki gibi ekleyin:
implementation "androidx.credentials:credentials:1.2.0"
implementation "androidx.credentials:credentials-play-services-auth:1.2.0"
implementation "com.google.android.libraries.identity.googleid:googleid:1.1.0"
Bu bağımlılık, Google ile giriş yapma özelliğini uygulamanıza entegre etmek için gereklidir. Değişiklikleri kaydettikten sonra, projeyi senkronize etmeyi unutmayın.
proguard-rules.pro dosyanıza aşağıdaki konfigürasyonu ekleyerek Credential Manager sınıflarının doğru bir şekilde işlenmesini sağlayabilirsiniz. Bu adımı atlamak, uygulama boyutunu düşürmek amacıyla ProGuard eklediğiniz bağımlılıkların yapısını bozabilir.
-if class androidx.credentials.CredentialManager
-keep class androidx.credentials.playservices.** {
*;
}
Ardından Google ile giriş yapma veya kaydolma özelliği için bir buton tasarladıgınızı varsayarak bu butonun onClick metodu içinde çağıracak olduğumuz doGoogleSignIn fonksiyonunu konusalım.

Metodun gerçekleştirimi şu şekilde olmalıdır ;

Fonksiyonumuz, tüm istekleri bir coroutine içinde çalıştırarak ana iş parçacığını (main thread) meşgul etmiyor.
Sonrasında, GoogleIdOptions tipinde bir nesne oluşturuyoruz. setServiceClient() kısmında, API Console’da oluşturduğumuz WEB CLIENT ID‘yi giriyoruz. setFilterAuthorized seçeneği, daha önce uygulamamıza Google ile giriş yapmış olan kullanıcıların hesaplarını doğrudan göstermemizi sağlıyor; diğer hesaplar listede görünmeyecek. setAutoSelectedEnabled metodu ise, otomatik olarak daha önce giriş yapılan hesabın seçilip seçilmemesini ayarlıyor. Benim durumumda bu ayarın ikisinin de false olması gerekiyor; ama siz kendi kullanım durumunuza göre bunu true yapabilirsiniz.
Ardından, oluşturduğumuz GoogleIdOptions ile bir GetCredentialRequest türünde bir nesne oluşturmamız gerekiyor. Son olarak, isteğimiz başarılı olursa result nesnesinde kendi işlemlerimizi gerçekleştireceğiz. Bu aşamaya kadar başarıyla geldiysek, şimdi gelen sonucu nasıl işleyeceğimize bakalım.

Butonumuza isteği işlemesi için bir callback atıyoruz. Ben, callback işlemini ViewModel üzerinden gerçekleştirmeyi tercih ediyorum; ancak dilerseniz doğrudan fonksiyon kullanarak da bu işlemi yapabilirsiniz.
Şimdik viewmodel yapımızı inceleyelim; (Burdan yine kaynak kodlarını kopyalayabilirsiniz)
ViewModel’in bu kısmında aldığımız googleIdToken nesnesini parametre olarak kullanarak use case’imize gönderiyoruz ve ardından backend’imize ilgili POST isteğini gerçekleştiriyoruz.

(Harmony Haven tamamen açık kaynaktır; isterseniz bu özelliğin nasıl uygulandığını daha detaylı bir şekilde incelemek için repository’yi gözden geçirebilirsiniz. Bu yazıda use case, Retrofit, Hilt gibi konulara bağlama sadık kalmak için girmiyorum; aksi takdirde konunun sonu gelmeyecektir.)
Şimdi backend tarafına geçelim. Artık client ve API Console tarafında her şeyi tamamladık; geriye sadece bize gelen Google ID Token’ı işleyip kullanıcıya JWT (JSON Web Token) oluşturmak kaldı. Hadi bunu gerçekleştirelim! 🙂
Backend tarafında Google Authentication işlemlerini yönetmek için bir endpoint oluşturalım. Bu endpoint, aşağıda görüldüğü gibi Google ID Token’ı alacak ve ardından doğrulama işlemi gerçekleştirecek. Eğer doğrulama başarılı olmazsa, null değeri dönecektir.

peki ama google id tokeni nasıl doğrulayacağız? backend yapınıza göre bir servis yapısı olusuturup buradaki dokumantasyonu takip etmeniz yeterli olacaktır aşağıdaki gerçekleştirimini yaptıgım halini inceleyebilirsiniz ben ktor sunucum için bu şekilde bir yapılandırma izledim.

Gerçekleştirdiğimiz doğrulama işlemiyle birlikte, token’in payloadındaki verileri elde etmek bir sonraki adımımız. Bu aşamada, kullanıcının bilgilerini (örneğin, isim, e-posta gibi) almak için token’ı çözümlememiz gerekecek.

Bu verilerden sadece üç tanesi benim sistemim için gerekliydi. İsterseniz yorum satırına alınmış olan diğer verileri de kullanabilirsiniz. Sıradaki adım, kullanıcıyı kaydetmek ve giriş yaptırmaktır. Peki, bunu nasıl yapabiliriz? Aşağıdaki kodu inceleyelim:

Aşağıda görüldüğü üzere, eğer zaten bir kullanıcı kaydı varsa, doğrudan kullanıcı adına JWT (JSON Web Token) üretiyoruz ve bu token’ı istemciye yanıt olarak gönderiyoruz

Buraya kadar okuduğunuz için teşekkür ederim. Bu süreçte her konuyu mümkün olduğunca detaylı bir şekilde ele almaya çalıştım. Google ile giriş yapma özelliğini uygulamanıza entegre etmek istiyorsanız, genel işleyişin bu şekilde olacaktır umarım güzel bir rehber olmuştur.
Herhangi bir sorunuz veya eklemek istediğiniz bir detay varsa, bu konuda yardımcı olmaktan mutluluk duyarım.