Bu dokümanda, Google Kimliği yardımcı kitaplığını kullanarak Google ile oturum aç iletişim kutusunun Google Kimlik Hizmetleri'nden (GIS) Kimlik Bilgileri Yöneticisi API'sine nasıl taşınacağı açıklanmaktadır.
Credential Manager API'sini kullanan bir uygulama, son kullanıcıya geçiş anahtarı etkin hesaplar da dahil olmak üzere kayıtlı oturum açma seçenekleri listesinden seçim yapmasına olanak tanıyan tutarlı bir Android kullanıcı arayüzü sunacak şekilde yapılandırılır. Bu, farklı kimlik bilgisi türlerini ve sağlayıcılarını birleştirmek için önerilen Android API'dir. Android 14'ten itibaren kullanıcılar, Credential Manager API ile üçüncü taraf şifre yöneticilerinden de yararlanabilir.
Bağımlılıkları bildirme
Modülünüzün build.gradle
dosyasında, en son sürümü 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 API konsolu projenizi ayarlamak için talimatları uygulayın. Bağımlılıkları ekleme rehberini yukarıda belirtilen talimatlarla değiştirin.
Google ile oturum açma isteği örneklendirme
Uygulamaya başlamak için bir Google oturum açma isteği örnek oluşturun. Kullanıcının Google Kimliği Jetonunu almak için GetGoogleIdOption
kullanın.
Kotlin
val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
.setFilterByAuthorizedAccounts(true)
.setServerClientId(SERVER_CLIENT_ID)
.build()
Java
GetGoogleIdOption googleIdOption = new GetGoogleIdOption.Builder()
.setFilterByAuthorizedAccounts(true)
.setServerClientId(SERVER_CLIENT_ID)
.build();
Öncelikle API'yi setFilterByAuthorizedAccounts
parametresi true
olarak ayarlanmış şekilde çağırmanız gerekir. Kullanılabilir kimlik bilgisi yoksa API'yi tekrar çağırın ve setFilterByAuthorizedAccounts
öğesini false
olarak ayarlayın.
Mümkün olduğunda kullanıcıların otomatik olarak oturum açmasını istiyorsanız GetGoogleIdOption
isteğinizde setAutoSelectEnabled
ile bu özelliği etkinleştirin. Aşağıdaki ölçütler karşılandığında otomatik oturum açılabilir:
- Kullanıcının, uygulamanız için kaydedilmiş tam olarak bir kimlik bilgisi, yani kayıtlı bir şifre veya kayıtlı bir Google Hesabı vardır.
- Kullanıcının otomatik oturum açmayı Google Hesabı ayarlarında devre dışı bırakmamış olması gerekir.
Oturum açma güvenliğini iyileştirmek ve tekrar oynatma saldırılarını önlemek için her isteğe tek seferlik bir sayı eklemek üzere setNonce
özelliğini kullanın.
Tek seferlik rastgele sayı oluşturma hakkında daha fazla bilgi edinin.
Kotlin
val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
.setFilterByAuthorizedAccounts(true)
.setServerClientId(SERVER_CLIENT_ID)
.setNonce(<nonce string to use when generating a Google ID token>)
.build()
Java
GetGoogleIdOption googleIdOption = new GetGoogleIdOption.Builder()
.setFilterByAuthorizedAccounts(true)
.setServerClientId(SERVER_CLIENT_ID)
.setNonce(<nonce string to use when generating a Google ID token>);
.build();
Google ile oturum aç
Google ile oturum açma akışını ayarlama adımları şunlardır:
GetCredentialRequest
örneğini somutlaştırın ve kimlik bilgilerini almak için yukarıda oluşturulangoogleIdOption
öğesini 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ı olduktan sonra
GoogleIdTokenCredential
verileri için sonucu barındıranCustomCredential
dosyasını çıkarın. CustomCredential
türü,GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL
değerine eşit olmalıdır.GoogleIdTokenCredential.createFrom
yöntemini kullanarak nesneyiGoogleIdTokenCredential
biçimine dönüştürün.- Dönüşüm başarılı olursa
GoogleIdTokenCredential
kimliğini çıkarıp doğrulayın ve sunucunuzda kimlik bilgisini doğrulayın. - Dönüşüm bir
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 yakalayın.
Kotlin
val request: GetCredentialRequest = Builder()
.addGetCredentialOption(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) {
is PublicKeyCredential -> {
// Share responseJson such as a GetCredentialResponse on your server to
// validate and authenticate
responseJson = credential.authenticationResponseJson
}
is PasswordCredential -> {
// Send ID and password to your server to validate and authenticate.
val username = credential.id
val password = credential.password
}
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 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")
}
}
}
Java
GetCredentialRequest request = new GetCredentialRequest.Builder()
.addGetCredentialOption(googleIdOption)
.build();
// Launch sign in flow and do getCredential Request to retrieve the credentials
credentialManager.getCredentialAsync(
requireActivity(),
request,
cancellationSignal,
<executor>,
new CredentialManagerCallback<GetCredentialResponse, GetCredentialException>() {
@Override
public void onResult(GetCredentialResponse result) {
handleSignIn(result);
}
@Override
public void onError(GetCredentialException e) {
handleFailure(e);
}
}
);
public void handleSignIn(GetCredentialResponse result) {
// Handle the successfully returned credential.
Credential credential = result.getCredential();
if (credential instanceof PublicKeyCredential) {
String responseJson = ((PublicKeyCredential) credential).getAuthenticationResponseJson();
// Share responseJson i.e. a GetCredentialResponse on your server to validate and authenticate
} else if (credential instanceof PasswordCredential) {
String username = ((PasswordCredential) credential).getId();
String password = ((PasswordCredential) credential).getPassword();
// Use id and password to send to your server to validate and authenticate
} else if (credential instanceof CustomCredential) {
if (GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL.equals(credential.getType())) {
try {
// Use googleIdTokenCredential and extract id to validate and
// authenticate on your server
GoogleIdTokenCredential googleIdTokenCredential = GoogleIdTokenCredential.createFrom(((CustomCredential) credential).getData());
} catch (GoogleIdTokenParsingException e) {
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
Google ile Oturum Aç Düğmesi, en yeni Google Kimliği yardımcı kitaplığına sahip Kimlik Bilgisi Yöneticisi tarafından desteklenir. Google ile oturum aç düğme akışını tetiklemek için GetGoogleIdOption
yerine GetSignInWithGoogleOption
öğesini kullanın ve döndürülen GoogleIdTokenCredential
öğesini önceden olduğu gibi kullanın.
Google ile kaydolun
GetGoogleIdOption
isteği örneklenirken ve GetCredentialsRequest
öğesine iletilirken setFilterByAuthorizedAccounts
değeri true
olarak ayarlandıktan sonra hiçbir sonuç döndürülmezse bu durum, oturum açmak için yetkilendirilmiş hesap olmadığını gösterir. Bu noktada setFilterByAuthorizedAccounts(false)
öğesini ayarlamanız ve Google ile kaydolun'u çağırmanız gerekir.
Kotlin
val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
.setFilterByAuthorizedAccounts(false)
.setServerClientId(SERVER_CLIENT_ID)
.build()
Java
GetGoogleIdOption googleIdOption = new GetGoogleIdOption.Builder()
.setFilterByAuthorizedAccounts(false)
.setServerClientId(SERVER_CLIENT_ID)
.build();
Google kayıt isteğini örnek hale getirdikten sonra , kimlik doğrulama akışını Google ile oturum açma bölümünde belirtildiği şekilde başlatın.
Oturumu kapatma işlemini gerçekleştir
Bir kullanıcı, uygulamanızda oturumu kapattığında mevcut kullanıcı kimlik bilgisi durumunu temizlemek ve dahili oturum açma durumunu sıfırlamak için API clearCredentialState()
yöntemini çağırın.