Google ile oturum açma, kullanıcı kimlik doğrulamasını Android uygulamanızla hızlı bir şekilde entegre etmenize yardımcı olur. Kullanıcılar, uygulamanızda oturum açmak, izin vermek ve profil bilgilerini uygulamanızla güvenli bir şekilde paylaşmak için Google Hesaplarını kullanabilir. Android'in Jetpack Kimlik Bilgisi Yöneticisi kitaplığı, bu entegrasyonu sorunsuz hale getirerek tek bir API kullanarak Android cihazlarda tutarlı bir deneyim sunar.
Bu doküman, Android uygulamalarına Google ile oturum açma özelliğini uygulama, Google ile oturum açma düğmesi kullanıcı arayüzünü ayarlama ve uygulamaya özelleştirilmiş One Tap ile kaydolma ve oturum açma deneyimlerini yapılandırma konusunda size yol gösterir. Google ile oturum açma özelliği, cihaz geçişinin sorunsuz olması için otomatik oturum açma özelliğini destekler. Android, iOS ve web platformlarında platformlar arası olması, uygulamanız için herhangi bir cihazda oturum açma erişimi sağlamanıza yardımcı olur.
Google ile oturum açma özelliğini ayarlamak için aşağıdaki iki ana adımı uygulayın:
Kimlik Bilgisi Yöneticisi'nin alt sayfa kullanıcı arayüzünde Google ile oturum açma seçeneğini yapılandırın. Bu ayar, kullanıcıdan otomatik olarak oturum açmasını isteyecek şekilde yapılandırılabilir. Geçiş anahtarları veya şifreler uyguladıysanız kullanıcının daha önce oturum açmak için kullandığı seçeneği hatırlamak zorunda kalmaması amacıyla ilgili tüm kimlik bilgisi türlerini aynı anda isteyebilirsiniz.
Google ile oturum aç düğmesini uygulamanızın kullanıcı arayüzüne ekleyin. Google ile oturum açma düğmesi, kullanıcıların Android uygulamalarında kaydolma veya oturum açma işlemleri için mevcut Google Hesaplarını kullanmalarına kolay bir yol sunar. Kullanıcılar, alt sayfa kullanıcı arayüzünü kapatırsa veya kayıt ve oturum açma için açıkça Google Hesaplarını kullanmak isterse Google ile oturum açma düğmesini tıklar. Geliştiriciler için bu, kullanıcıların ilk katılım sürecini kolaylaştırır ve kaydolma sırasındaki zorlukları azaltır.
Bu dokümanda, Google kimliği yardımcı kitaplığı kullanılarak Google ile oturum açma düğmesinin ve alt sayfa iletişim kutusunun Kimlik Bilgisi Yöneticisi API'sine nasıl entegre edileceği açıklanmaktadır.
Google API'leri Konsolu projenizi ayarlama
- Projenizi API Konsolu'nda açın veya projeniz yoksa proje oluşturun.
- OAuth izin ekranı sayfasında tüm bilgilerin eksiksiz ve doğru olduğundan emin olun.
- Uygulamanıza doğru uygulama adı, uygulama logosu ve uygulama ana sayfası atadığınızdan emin olun. Bu değerler, kayıt sırasındaki Google ile oturum açma izin ekranında ve Üçüncü taraf uygulamaları ve hizmetleri ekranında kullanıcılara sunulur.
- Uygulamanızın gizlilik politikasının ve hizmet şartlarının URL'lerini belirttiğinizden emin olun.
- Kimlik Bilgileri sayfasında, uygulamanız için henüz yoksa bir Android istemci kimliği oluşturun. Uygulamanızın paket adını ve SHA-1 imzasını belirtmeniz gerekir.
- Kimlik bilgileri sayfasına gidin.
- Kimlik bilgileri oluştur > OAuth istemci kimliği'ni tıklayın.
- Android uygulama türünü seçin.
- Kimlik bilgileri sayfasında, henüz yapmadıysanız yeni bir "Web uygulaması" istemci kimliği oluşturun. "Yetkilendirilmiş JavaScript Kaynakları" ve "Yetkilendirilmiş Yönlendirme URI'leri" alanlarını şimdilik yoksayabilirsiniz. Bu istemci kimliği, arka uç sunucunuz Google'ın kimlik doğrulama hizmetleriyle iletişim kurarken sunucunuzu tanımlamak için kullanılır.
- Kimlik bilgileri sayfasına gidin.
- Kimlik bilgileri oluştur > OAuth istemci kimliği'ni tıklayın.
- Web uygulaması türünü seçin.
Bağımlılıkları bildirme
Modülünüzün build.gradle dosyasında, Credential Manager'ın en son sürümünü kullanarak bağımlılıkları tanımlayın:
dependencies {
// ... other dependencies
implementation "androidx.credentials:credentials:<latest version>"
implementation "androidx.credentials:credentials-play-services-auth:<latest version>"
implementation "com.google.android.libraries.identity.googleid:googleid:<latest version>"
}
Google ile oturum açma isteği oluşturma
Uygulamaya başlamak için bir Google oturum açma isteği oluşturun. Kullanıcının Google kimlik jetonunu almak için GetGoogleIdOption
kullanın.
val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
.setFilterByAuthorizedAccounts(true)
.setServerClientId(WEB_CLIENT_ID)
.setAutoSelectEnabled(true)
.setNonce(<nonce string to use when generating a Google ID token>)
.build()
Öncelikle, setFilterByAuthorizedAccounts
parametresi true
olarak ayarlanmış şekilde API'yi çağırarak kullanıcının uygulamanızda oturum açmak için daha önce kullanılmış hesapları olup olmadığını kontrol edin. Kullanıcılar oturum açmak için mevcut hesaplar arasından seçim yapabilir.
Yetkili Google Hesabı yoksa kullanıcıdan mevcut hesaplarından biriyle kaydolması istenir. Bunu yapmak için API'yi tekrar çağırıp setFilterByAuthorizedAccounts
değerini false
olarak ayarlayarak kullanıcıdan onay alın.
Kaydolma hakkında daha fazla bilgi edinin.
Geri gelen kullanıcılar için otomatik oturum açmayı etkinleştirme (önerilir)
Geliştiriciler, tek bir hesapla kaydolan kullanıcılar için otomatik oturum açma özelliğini etkinleştirmelidir. Bu sayede, özellikle cihaz taşıma sırasında kullanıcılar kimlik bilgilerini yeniden girmeden hesaplarına hızlıca erişebilir ve cihazlar arasında sorunsuz bir deneyim elde edebilir. Bu sayede, daha önce oturum açmış kullanıcılarınız gereksiz engellere takılmaz.
Otomatik oturum açmayı etkinleştirmek için setAutoSelectEnabled(true)
simgesini kullanın. Otomatik oturum açma yalnızca aşağıdaki ölçütler karşılandığında mümkündür:
- İstekle eşleşen tek bir kimlik bilgisi vardır. Bu kimlik bilgisi, Google Hesabı veya şifre olabilir ve Android cihazdaki varsayılan hesapla eşleşir.
- Kullanıcı, oturumu açık bırakmamıştır.
- Kullanıcı, Google Hesabı ayarlarında otomatik oturum açma özelliğini devre dışı bırakmamıştır.
val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
.setFilterByAuthorizedAccounts(true)
.setServerClientId(WEB_CLIENT_ID)
.setAutoSelectEnabled(true)
.setNonce(<nonce string to use when generating a Google ID token>)
.build()
Otomatik oturum açma özelliğini uygularken kullanıcıların uygulamanızdan açıkça çıkış yaptıktan sonra her zaman doğru hesabı seçebilmesi için oturumu kapatma işlemini doğru şekilde gerçekleştirmeyi unutmayın.
Güvenliği artırmak için tek seferlik bir sayı ayarlama
Oturum açma güvenliğini artırmak ve yeniden oynatma saldırılarını önlemek için her isteğe bir tek seferlik sayı eklemek üzere setNonce
ekleyin. Tek seferlik şifre oluşturma hakkında daha fazla bilgi edinin.
val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
.setFilterByAuthorizedAccounts(true)
.setServerClientId(WEB_CLIENT_ID)
.setAutoSelectEnabled(true)
.setNonce(<nonce string to use when generating a Google ID token>)
.build()
Google ile oturum açma akışını oluşturma
Google ile oturum açma akışını ayarlama adımları şunlardır:
- Kimlik bilgilerini almak için bir
GetCredentialRequest
örneği oluşturun, ardındanaddCredentialOption()
kullanarak daha önce oluşturulangoogleIdOption
'ı ekleyin. - Kullanıcının mevcut kimlik bilgilerini almak için bu isteği
getCredential()
(Kotlin) veyagetCredentialAsync()
(Java) çağrısına iletin. - API başarılı olduğunda,
GoogleIdTokenCredential
verilerinin sonucunu içerenCustomCredential
öğesini ayıklayın. CustomCredential
türü,GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL
değerine eşit olmalıdır.GoogleIdTokenCredential.createFrom
yöntemini kullanarak nesneyiGoogleIdTokenCredential
olarak dönüştürün.Dönüşüm başarılı olursa
GoogleIdTokenCredential
kimliğini ayıklayın, doğrulayın ve sunucunuzda kimlik bilgisinin kimliğini doğrulayın.Dönüşüm
GoogleIdTokenParsingException
ile başarısız olursa Google ile oturum açma kitaplığı sürümünüzü güncellemeniz gerekebilir.Tanınmayan özel kimlik bilgisi türlerini yakalayabilirsiniz.
val request: GetCredentialRequest = Builder()
.addCredentialOption(googleIdOption)
.build()
coroutineScope.launch {
try {
val result = credentialManager.getCredential(
request = request,
context = activityContext,
)
handleSignIn(result)
} catch (e: GetCredentialException) {
handleFailure(e)
}
}
fun handleSignIn(result: GetCredentialResponse) {
// Handle the successfully returned credential.
val credential = result.credential
when (credential) {
// Passkey credential
is PublicKeyCredential -> {
// Share responseJson such as a GetCredentialResponse on your server to
// validate and authenticate
responseJson = credential.authenticationResponseJson
}
// Password credential
is PasswordCredential -> {
// Send ID and password to your server to validate and authenticate.
val username = credential.id
val password = credential.password
}
// GoogleIdToken credential
is CustomCredential -> {
if (credential.type == GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL) {
try {
// Use googleIdTokenCredential and extract the ID to validate and
// authenticate on your server.
val googleIdTokenCredential = GoogleIdTokenCredential
.createFrom(credential.data)
// You can use the members of googleIdTokenCredential directly for UX
// purposes, but don't use them to store or control access to user
// data. For that you first need to validate the token:
// pass googleIdTokenCredential.getIdToken() to the backend server.
GoogleIdTokenVerifier verifier = ... // see validation instructions
GoogleIdToken idToken = verifier.verify(idTokenString);
// To get a stable account identifier (e.g. for storing user data),
// use the subject ID:
idToken.getPayload().getSubject()
} catch (e: GoogleIdTokenParsingException) {
Log.e(TAG, "Received an invalid google id token response", e)
}
} else {
// Catch any unrecognized custom credential type here.
Log.e(TAG, "Unexpected type of credential")
}
}
else -> {
// Catch any unrecognized credential type here.
Log.e(TAG, "Unexpected type of credential")
}
}
}
Google ile oturum açma düğmesi akışını tetikleme
Google ile oturum açma düğmesi akışını tetiklemek için GetGoogleIdOption
yerine GetSignInWithGoogleOption
kullanın:
val signInWithGoogleOption: GetSignInWithGoogleOption = GetSignInWithGoogleOption.Builder()
.setServerClientId(WEB_CLIENT_ID)
.setNonce(<nonce string to use when generating a Google ID token>)
.build()
Döndürülen GoogleIdTokenCredential
değerini aşağıdaki kod örneğinde açıklandığı şekilde işleyin.
fun handleSignIn(result: GetCredentialResponse) {
// Handle the successfully returned credential.
val credential = result.credential
when (credential) {
is CustomCredential -> {
if (credential.type == GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL) {
try {
// Use googleIdTokenCredential and extract id to validate and
// authenticate on your server.
val googleIdTokenCredential = GoogleIdTokenCredential
.createFrom(credential.data)
} catch (e: GoogleIdTokenParsingException) {
Log.e(TAG, "Received an invalid google id token response", e)
}
}
else -> {
// Catch any unrecognized credential type here.
Log.e(TAG, "Unexpected type of credential")
}
}
else -> {
// Catch any unrecognized credential type here.
Log.e(TAG, "Unexpected type of credential")
}
}
}
Google ile oturum açma isteğini örnekledikten sonra, kimlik doğrulama akışını Google ile oturum açma bölümünde belirtilene benzer şekilde başlatın.
Yeni kullanıcılar için kaydı etkinleştirin (önerilir)
Google ile oturum açma, kullanıcıların uygulamanızda veya hizmetinizde birkaç dokunuşla yeni hesap oluşturmasının en kolay yoludur.
Kayıtlı kimlik bilgisi bulunamazsa (getGoogleIdOption
tarafından döndürülen Google Hesabı yoksa) kullanıcınızdan kaydolmasını isteyin. Öncelikle, daha önce kullanılmış hesap olup olmadığını görmek için setFilterByAuthorizedAccounts(true)
değerini kontrol edin. Hiçbir hesap bulunamazsa kullanıcıdan setFilterByAuthorizedAccounts(false)
Örnek:
val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
.setFilterByAuthorizedAccounts(false)
.setServerClientId(WEB_CLIENT_ID)
.build()
Google kaydolma isteğini örnekledikten sonra kimlik doğrulama akışını başlatın. Kullanıcılar kayıt için Google ile oturum açma özelliğini kullanmak istemiyorsa uygulamanızı otomatik doldurma için optimize edebilirsiniz. Kullanıcınız bir hesap oluşturduktan sonra, hesap oluşturma işleminin son adımı olarak kullanıcıyı geçiş anahtarlarına kaydetmeyi düşünebilirsiniz.
Oturumu kapatma
Bir kullanıcı uygulamanızdan çıktığında, mevcut kullanıcı kimlik bilgisi durumunu tüm kimlik bilgisi sağlayıcılardan temizlemek için API clearCredentialState()
yöntemini çağırın.
Bu işlem, tüm kimlik bilgisi sağlayıcıları belirli bir uygulamayla ilgili depolanan kimlik bilgisi oturumlarının temizlenmesi gerektiği konusunda bilgilendirir.
Kimlik bilgisi sağlayıcı, etkin bir kimlik bilgisi oturumu saklamış olabilir ve bunu gelecekteki kimlik bilgisi alma çağrıları için oturum açma seçeneklerini sınırlandırmak amacıyla kullanabilir. Örneğin, etkin kimlik bilgisine diğer tüm kimlik bilgilerine göre öncelik verebilir. Kullanıcınız uygulamanızdan açıkça çıkış yaptığında ve bir sonraki oturum açmada bütünsel oturum açma seçeneklerini görmek için sağlayıcının depolanan kimlik bilgisi oturumlarını temizlemesine izin vermek üzere bu API'yi çağırmanız gerekir.