1. Başlamadan önce
Geleneksel kimlik doğrulama çözümleri, bir dizi güvenlik ve kullanılabilirlik sorunu oluşturur.
Şifreler yaygın olarak kullanılır ancak...
- Kolayca unutulur
- Kullanıcıların güçlü şifreler oluşturmak için bilgi sahibi olması gerekir.
- Saldırganlar tarafından kolayca kimlik avı, toplama ve yeniden oynatma yapılabilir.
Android, Credential Manager API'yi oluşturarak oturum açma deneyimini basitleştirmek ve parolasız kimlik doğrulama için yeni nesil endüstri standardı olan geçiş anahtarlarını destekleyerek güvenlik risklerini gidermek için çalışmaktadır.
Kimlik Bilgisi Yöneticisi, geçiş anahtarı desteğini bir araya getirir ve şifreler, Google ile oturum açma gibi geleneksel kimlik doğrulama yöntemleriyle birleştirir.
Kullanıcılar geçiş anahtarları oluşturup Google Şifre Yöneticisi'nde saklayabilir. Bu geçiş anahtarları, kullanıcının oturum açtığı Android cihazlar arasında senkronize edilir. Kullanıcının geçiş anahtarıyla oturum açabilmesi için geçiş anahtarının oluşturulması, bir kullanıcı hesabıyla ilişkilendirilmesi ve herkese açık anahtarının bir sunucuda depolanması gerekir.
Bu codelab'de, Kimlik Bilgisi Yöneticisi API'sini kullanarak geçiş anahtarları ve şifrelerle kaydolmayı ve bunları gelecekteki kimlik doğrulama işlemleri için kullanmayı öğreneceksiniz. Aşağıdakiler dahil 2 akış vardır:
- Kaydolma : Şifre anahtarları ve şifre kullanma
- Geçiş anahtarlarını ve kayıtlı şifreleri kullanarak oturum açma
Ön koşullar
- Android Studio'da uygulamaları çalıştırma konusunda temel bilgi sahibi olmanız gerekir.
- Android uygulamalarındaki kimlik doğrulama akışı hakkında temel bilgi sahibi olmanız gerekir.
- Geçiş anahtarları hakkında temel bilgi sahibi olmanız gerekir.
Neler öğreneceksiniz?
- Geçiş anahtarı oluşturma
- Şifre yöneticisine şifre kaydetme
- Kullanıcıların kimliğini geçiş anahtarı veya kayıtlı şifreyle doğrulama
İhtiyacınız olanlar
Aşağıdaki cihaz kombinasyonlarından biri:
- Android 9 veya sonraki sürümleri (geçiş anahtarları için) ve Android 4.4 veya sonraki sürümleri(Credential Manager API aracılığıyla şifre doğrulaması için) çalıştıran bir Android cihaz.
- Tercihen biyometrik sensörlü bir cihaz.
- Ekran kilidi (biyometrik veya başka bir şekilde) kaydettiğinizden emin olun.
- Kotlin eklentisi sürümü : 1.8.10
2. Hazırlanın
Bu örnek uygulama, Kimlik Bilgisi Yöneticisi'nin bağlantıyı doğrulayıp devam edebilmesi için bir web sitesine dijital öğe bağlantısı gerektirir. Bu nedenle, sahte yanıtlarda kullanılan rp kimliği, sahte bir 3. taraf sunucusundan alınır. Kendi sahte yanıtınızı denemek istiyorsanız uygulama alanınızı eklemeyi deneyin ve burada belirtildiği gibi dijital öğe bağlantısını tamamlamayı unutmayın.
Paket adının ve SHA'nın sahte sunucunuzdaki Digital Asset Link'ini doğrulamak için projede belirtilen debug.keystore dosyasını kullanarak hata ayıklama ve yayın varyantları oluşturun. (Bu işlem, build.gradle'deki örnek uygulama için sizin adınıza zaten yapılmaktadır.)
- Bu depoyu dizüstü bilgisayarınızda credman_codelab dalından klonlayın: https://github.com/android/identity-samples/tree/credman_codelab
git clone -b credman_codelab https://github.com/android/identity-samples.git
- CredentialManager modülüne gidin ve projeyi Android Studio'da açın.
Uygulamanın başlangıç durumunu görme
Uygulamanın ilk durumunun nasıl çalıştığını görmek için aşağıdaki adımları uygulayın:
- Uygulamayı başlatın.
- Kayıt ol ve oturum aç düğmelerinin bulunduğu bir ana ekran görürsünüz. Bu düğmeler henüz herhangi bir işlem yapmıyor ancak işlevlerini sonraki bölümlerde etkinleştireceğiz.

3. Geçiş anahtarlarıyla kaydolma özelliğini ekleme
Kimlik Bilgisi Yöneticisi API'sini kullanan bir Android uygulamasında yeni hesap oluştururken kullanıcılar, hesapları için geçiş anahtarı oluşturabilir. Bu geçiş anahtarı, kullanıcının seçtiği kimlik bilgisi sağlayıcısında güvenli bir şekilde saklanır ve kullanıcının her seferinde şifresini girmesi gerekmeden gelecekteki oturum açma işlemlerinde kullanılır.
Şimdi, biyometri/ekran kilidi kullanarak geçiş anahtarı oluşturacak ve kullanıcı kimlik bilgilerini kaydedeceksiniz.
Geçiş anahtarıyla kaydolma
CredentialManager/app/src/main/java/com/google/credentialmanager/sample/SignUpScreen.kt içindeki kod, "kullanıcı adı" metin alanını ve geçiş anahtarıyla kaydolma düğmesini tanımlar.

Görünüm modellerinde kullanılacak createCredential() lambda'sını tanımlayın.
Kimlik bilgisi yöneticisi nesneleri için bir Activity iletilmesi gerekir. Bu, bir ekranla ilişkilendirilir. Ancak, kimlik bilgisi yöneticisi işlemleri genellikle Görüntüleme Modelleri'nde tetiklenir ve Görüntüleme Modelleri'nde Etkinliklere referans verilmesi önerilmez. Bu nedenle, kimlik bilgisi yöneticisi işlevlerini ayrı bir dosyada CredentialManagerUtil.kt tanımlar ve bunları uygun ekranlarda referans alırız. Bu ekranlar da bunları lambda işlevleri aracılığıyla geri çağırma olarak kendi View Model'lerine iletir.
CredentialManagerUtil.kt içindeki createCredential() işlevinde TODO yorumunu bulun ve CredentialManager.create() işlevini çağırın:
CredentialManagerUtil.kt
suspend fun createCredential(
activity: Activity,
request: CreateCredentialRequest
): CreateCredentialResponse {
TODO("Create a CredentialManager object and call createCredential() with a CreateCredentialRequest")
val credentialManager = CredentialManager.create(activity)
return credentialManager.createCredential(activity, request)
}
createPasskey() çağrısına zorluğu ve diğer JSON yanıtını iletme
Geçiş anahtarı oluşturulmadan önce, createCredential() çağrısı sırasında Credential Manager API'ye iletilecek gerekli bilgileri sunucudan istemeniz gerekir.
Projenizin varlıklarında, bu kod laboratuvarında gerekli parametreleri döndüren RegFromServer.txt adlı bir sahte yanıtınız zaten var.
- Uygulamanızda
SignUpViewModel.ktbölümüne gidin. Geçiş anahtarı oluşturma ve kullanıcıyı içeri alma mantığını yazacağınızsignUpWithPasskeysyöntemini bulun. Yöntemi aynı sınıfta bulabilirsiniz. TODOyorum bloğunucreate a CreatePublicKeyCredentialRequest()olarak bulun ve aşağıdaki kodla değiştirin:
SignUpViewModel.kt
TODO("Create a CreatePublicKeyCredentialRequest() with necessary registration json from server")
val request = CreatePublicKeyCredentialRequest(
jsonProvider.fetchRegistrationJson()
.replace("<userId>", getEncodedUserId())
.replace("<userName>", _username.value)
.replace("<userDisplayName>", _username.value)
.replace("<challenge>", getEncodedChallenge())
)
jsonProvider.fetchRegistrationJsonFromServer() yöntemi, varlıklardan taklit edilen bir sunucu PublicKeyCredentialCreationOptions JSON yanıtını okur ve geçiş anahtarı oluşturulurken iletilecek kayıt JSON'unu döndürür. Yer tutucu değerlerinden bazılarını uygulamamızdaki kullanıcı girişleriyle, bazılarını ise sahte alanlarla değiştiriyoruz:
- Bu JSON eksik ve değiştirilmesi gereken 4 alan içeriyor.
- Kullanıcının birden fazla geçiş anahtarı oluşturabilmesi için (gerekirse) UserId benzersiz olmalıdır.
<userId>yerine oluşturulanuserIddeğerini girin. <challenge>de benzersiz olmalıdır. Bu nedenle rastgele ve benzersiz bir meydan okuma oluşturacaksınız. Yöntem zaten kodunuzda var.
Gerçek bir sunucu PublicKeyCredentialCreationOptions yanıtı daha fazla seçenek döndürebilir. Bu alanlardan bazılarına ilişkin bir örnek aşağıda verilmiştir:
{
"challenge": String,
"rp": {
"name": String,
"id": String
},
"user": {
"id": String,
"name": String,
"displayName": String
},
"pubKeyCredParams": [
{
"type": "public-key",
"alg": -7
},
{
"type": "public-key",
"alg": -257
}
],
"timeout": 1800000,
"attestation": "none",
"excludeCredentials": [],
"authenticatorSelection": {
"authenticatorAttachment": "platform",
"requireResidentKey": true,
"residentKey": "required",
"userVerification": "required"
}
}
Aşağıdaki tabloda, PublicKeyCredentialCreationOptions nesnesindeki bazı önemli parametreler açıklanmaktadır:
Parametreler | Açıklamalar |
Tahmin edilmesini imkansız kılacak kadar entropi içeren, sunucu tarafından oluşturulan rastgele bir dize. En az 16 bayt uzunluğunda olmalıdır. Bu alan zorunludur ancak onay işlemi yapılmadığı sürece kayıt sırasında kullanılmaz. | |
Kullanıcının benzersiz kimliği. Bu değer, e-posta adresleri veya kullanıcı adları gibi kimliği tanımlayabilecek bilgiler içermemelidir. Hesap başına rastgele oluşturulan 16 baytlık bir değer işe yarayacaktır. | |
Bu alan, kullanıcının tanıyacağı bir hesap için benzersiz bir tanımlayıcı (ör. e-posta adresi veya kullanıcı adı) içermelidir. Bu ad, hesap seçicide gösterilir. (Kullanıcı adı kullanılıyorsa şifre kimlik doğrulamasındakiyle aynı değeri kullanın.) | |
Bu alan, hesap için isteğe bağlı olarak girilebilen ve kullanıcı dostu bir addır. | |
Güvenen taraf tüzel kişisi, uygulama ayrıntılarınıza karşılık gelir. Aşağıdaki özelliklere sahiptir:
| |
İzin verilen algoritmaların ve anahtar türlerinin listesi. Bu liste en az bir öğe içermelidir. | |
Cihaz kaydetmeye çalışan kullanıcı, başka cihazlar kaydetmiş olabilir. Tek bir kimlik doğrulayıcıda aynı hesap için birden fazla kimlik bilgisi oluşturulmasını sınırlamak istiyorsanız bu cihazları yoksayabilirsiniz. | |
Cihazın platforma eklenip eklenmeyeceğini veya eklenmesinin gerekip gerekmediğini gösterir. Bu değeri | |
| Geçiş anahtarı oluşturmak için |
Kimlik bilgisi oluşturma
- Bir
CreatePublicKeyCredentialRequest()oluşturduktan sonra oluşturulan isteklecreateCredential()çağrısını yapmanız gerekir.
SignUpViewModel.kt
try {
TODO("Call createCredential() with createPublicKeyCredentialRequest")
createCredential(request)
TODO("Complete the registration process after sending public key credential to your server and let the user in")
} catch (e: CreateCredentialException) {
handlePasskeyFailure(e)
}
- Oluşturulan görünümlerin görünürlüğünü ve istek başarısız olursa veya bazı nedenlerden dolayı başarısız olursa istisnaları yönetirsiniz. Hata mesajları burada kaydedilir ve uygulamada bir hata iletişim kutusunda gösterilir. Hata günlüklerinin tamamını Android Studio veya
adb debugkomutuyla kontrol edebilirsiniz.

- Son olarak, kayıt işlemini tamamlamanız gerekir. Uygulama, sunucuya ortak anahtar kimlik bilgisi gönderir. Sunucu, bu kimlik bilgisini mevcut kullanıcıya kaydeder.
Burada sahte bir sunucu kullandığımız için sunucunun, gelecekteki kimlik doğrulama ve doğrulama işlemleri için kayıtlı ortak anahtarı kaydettiğini belirten "true" değerini döndürüyoruz. Kendi uygulamanız için sunucu tarafında geçiş anahtarı kaydı hakkında daha fazla bilgi edinebilirsiniz.
signUpWithPasskeys() yönteminin içinde ilgili yorumu bulun ve aşağıdaki kodla değiştirin:
SignUpViewModel.kt
try {
createCredential(request)
TODO("Complete the registration process after sending public key credential to your server and let the user in")
registerResponse()
DataProvider.setSignedInThroughPasskeys(true)
_navigationEvent.emit(NavigationEvent.NavigateToHome(signedInWithPasskeys = true))
} catch (e: CreateCredentialException) {
handlePasskeyFailure(e)
}
registerResponse(), sahte sunucunun ortak anahtarı gelecekte kullanmak üzere kaydettiğini belirtentruedeğerini döndürür.setSignedInThroughPasskeysişaretinitrueolarak ayarlayın.- Kullanıcı giriş yaptıktan sonra ana ekrana yönlendirilir.
Gerçek bir PublicKeyCredential daha fazla alan içerebilir. Bu alanlara ilişkin bir örnek aşağıda gösterilmektedir:
{
"id": String,
"rawId": String,
"type": "public-key",
"response": {
"clientDataJSON": String,
"attestationObject": String,
}
}
Aşağıdaki tabloda, PublicKeyCredential nesnesindeki bazı önemli parametreler açıklanmaktadır:
Parametreler | Açıklamalar |
Oluşturulan geçiş anahtarının Base64URL kodlu kimliği. Bu kimlik, tarayıcının kimlik doğrulama sırasında cihazda eşleşen bir geçiş anahtarı olup olmadığını belirlemesine yardımcı olur. Bu değer, arka uçtaki veritabanında depolanmalıdır. | |
Kimlik bilgisinin kimliğinin | |
İstemci verilerini kodlayan bir | |
|
Uygulamayı çalıştırdığınızda Geçiş anahtarlarıyla kaydol düğmesini tıklayarak geçiş anahtarı oluşturabilirsiniz.
4. Şifreyi kimlik bilgisi sağlayıcıya kaydetme
Bu uygulamada, kayıt ekranınızda gösterim amacıyla kullanıcı adı ve şifreyle kayıt özelliği zaten uygulanmış durumda.
Kullanıcı şifresi kimlik bilgisini şifre sağlayıcısına kaydetmek için şifreyi kaydetmek üzere CreatePasswordRequest öğesini createCredential() öğesine iletecek bir CreatePasswordRequest uygulayacaksınız.
signUpWithPassword()yöntemini bulun, TODO'yucreatePasswordçağrısıyla değiştirin:
SignUpViewModel.kt
TODO("CreatePasswordRequest with entered username and password")
val passwordRequest = CreatePasswordRequest(_username.value, _password.value)
- Ardından, şifre oluşturma isteği içeren bir kimlik bilgisi oluşturun ve kullanıcı şifresi kimlik bilgisini şifre sağlayıcısıyla birlikte kaydedin. Ardından, kullanıcının oturumunu açın. Bu akışta meydana gelen istisnaları daha genel bir şekilde yakalarız. TODO'yu aşağıdaki kodla değiştirin:
SignUpViewModel.kt
TODO("Create credential with created password request and log the user in")
try {
createCredential(passwordRequest)
simulateServerDelayAndLogIn()
} catch (e: Exception) {
val errorMessage = "Exception Message : " + e.message
Log.e("Auth", errorMessage)
_passwordCreationError.value = errorMessage
_isLoading.value = false
}
Artık şifre kimlik bilgisini, kullanıcının şifre sağlayıcısıyla birlikte başarıyla kaydettiniz. Böylece, tek dokunuşla şifre kullanarak kimlik doğrulayabilirsiniz.
5. Geçiş anahtarı veya şifre ile kimlik doğrulama özelliği ekleme
Artık uygulamanızda güvenli bir şekilde kimliğinizi doğrulamak için kullanmaya hazırsınız.

Görünüm modellerinde kullanılmak üzere getCredential() lambda'sını tanımlayın.
Daha önce olduğu gibi, uygun ekranlarda referans olarak kullanmak ve lambda işlevleri aracılığıyla geri çağırma olarak kendi View Modellerine iletmek için Kimlik bilgisi yöneticisi'nin getCredential() işlevini ayrı bir dosyada CredentialManagerUtil.kt çağıracağız.
CredentialManagerUtil.kt içindeki getCredential() işlevinde TODO yorumunu bulun ve CredentialManager.get() işlevini çağırın:
suspend fun getCredential(
activity: Activity,
request: GetCredentialRequest
): GetCredentialResponse {
TODO("Create a CredentialManager object and call getCredential() with a GetCredentialRequest")
val credentialManager = CredentialManager.create(activity)
return credentialManager.getCredential(activity, request)
}
getPasskey() çağrısına iletilecek meydan okumayı ve diğer seçenekleri alın.
Kullanıcıdan kimlik doğrulaması yapmasını istemeden önce, sunucudan WebAuthn JSON'da iletilecek parametreleri (ör. bir sorgulama) istemeniz gerekir.
Öğelerinizde (AuthFromServer.txt) bu kod laboratuvarında bu tür parametreleri döndüren bir sahte yanıtınız zaten var.
- Uygulamanızda SignInViewModel.kt dosyasına gidin, kayıtlı geçiş anahtarı veya şifre aracılığıyla kimlik doğrulama mantığını yazacağınız ve kullanıcının oturum açmasına izin vereceğiniz
signInWithSavedCredentialsyöntemini bulun: - Kimlik bilgisi sağlayıcınızdan kimlik bilgisi almak için gereken parametrelerle bir GetPublicKeyCredentialOption() oluşturun.
SignInViewModel.kt
TODO("Create a GetPublicKeyCredentialOption() with necessary authentication json from server")
val getPublicKeyCredentialOption =
GetPublicKeyCredentialOption(jsonProvider.fetchAuthJson(), null)
fetchAuthJsonFromServer() yöntemi, kimlik doğrulama JSON yanıtını öğelerden okur ve bu kullanıcı hesabıyla ilişkili tüm geçiş anahtarlarını almak için kimlik doğrulama JSON'ını döndürür.
GetPublicKeyCredentialOption() işlevinin 2. parametresi, güvenen taraf kimliğini doğrulamak için kullanılan bir karma olan clientDataHash'dır. Bu özelliği yalnızca GetCredentialRequest.origin öğesini ayarladıysanız belirleyin. Örnek uygulamada bu değer null olarak ayarlanmıştır.
Not : Bu codelab'in sunucusu, API'nin getCredential() çağrısına iletilen PublicKeyCredentialRequestOptions sözlüğüne mümkün olduğunca benzer bir JSON döndürecek şekilde tasarlanmıştır. Aşağıdaki kod snippet'inde, gerçek bir yanıtta alabileceğiniz birkaç örnek seçenek yer almaktadır:
{
"challenge": String,
"rpId": String,
"userVerification": "",
"timeout": 1800000
}
Aşağıdaki tabloda, PublicKeyCredentialRequestOptions nesnesindeki bazı önemli parametreler açıklanmaktadır:
Parametreler | Açıklamalar |
| |
RP kimliği bir alandır. Bir web sitesi, alanını veya kaydedilebilir bir sonek belirtebilir. Bu değer, geçiş anahtarı oluşturulurken kullanılan |
- Ardından, bu kullanıcı hesabı için Credential Manager API aracılığıyla şifre sağlayıcınıza kaydedilen tüm şifreleri almak üzere bir
PasswordOption()nesnesi oluşturmanız gerekir.getSavedCredentials()yönteminin içinde TODO'yu bulun ve aşağıdakiyle değiştirin:
SigninViewModel.kt
TODO("Create a PasswordOption to retrieve all the associated user's password")
val getPasswordOption = GetPasswordOption()
Bunları GetCredentialRequest olarak birleştirin.
SigninViewModel.kt
TODO("Combine requests into a GetCredentialRequest")
val request = GetCredentialRequest(
listOf(
getPublicKeyCredentialOption,
getPasswordOption
)
)
Kimlik bilgisi alma
Ardından, ilişkili kimlik bilgilerini almak için yukarıdaki tüm seçeneklerle getCredential() isteğini çağırmanız gerekir:
SignInViewModel.kt
try {
TODO("Call getCredential() with required credential options")
val result = getCredential(request)
val data = when (result.credential) {
is PublicKeyCredential -> {
val cred = result.credential as PublicKeyCredential
DataProvider.setSignedInThroughPasskeys(true)
"Passkey: ${cred.authenticationResponseJson}"
}
is PasswordCredential -> {
val cred = result.credential as PasswordCredential
DataProvider.setSignedInThroughPasskeys(false)
"Got Password - User:${cred.id} Password: ${cred.password}"
}
is CustomCredential -> {
//If you are also using any external sign-in libraries, parse them here with the utility functions provided.
null
}
else -> null
}
TODO("Complete the authentication process after validating the public key credential to your server and let the user in.")
} catch (e: Exception) {
Log.e("Auth", "getCredential failed with exception: " + e.message.toString())
_signInError.value =
"An error occurred while authenticating: " + e.message.toString()
} finally {
_isLoading.value = false
}
- Gerekli bilgileri
getCredential()'ya iletiyorsunuz. Bu işlev, kimlik bilgisi seçeneklerinin listesini ve bir etkinlik bağlamını alarak seçenekleri bu bağlamdaki alt sayfada oluşturur. - İstek başarılı olduktan sonra ekranınızda, ilişkili hesap için oluşturulan tüm kimlik bilgilerinin listelendiği bir alt sayfa gösterilir.
- Kullanıcılar artık seçilen kimlik bilgisini doğrulamak için biyometri veya ekran kilidi gibi yöntemlerle kimliklerini doğrulayabilir.
- Seçilen kimlik bilgisi bir
PublicKeyCredentialisesetSignedInThroughPasskeysişaretinitrueolarak ayarlayın. Aksi takdirdefalseolarak ayarlayın.
Aşağıdaki kod snippet'inde bir örnek PublicKeyCredential nesnesi yer almaktadır:
{
"id": String
"rawId": String
"type": "public-key",
"response": {
"clientDataJSON": String
"authenticatorData": String
"signature": String
"userHandle": String
}
}
Aşağıdaki tablo kapsamlı olmasa da PublicKeyCredential nesnesindeki önemli parametreleri içerir:
Parametreler | Açıklamalar |
Kimliği doğrulanmış geçiş anahtarı kimliğinin Base64URL kodlu hali. | |
Kimlik bilgisinin kimliğinin | |
İstemci verilerinin | |
Kimlik doğrulayıcı verilerinin | |
İmzanın | |
Oluşturma sırasında ayarlanan kullanıcı kimliğini içeren bir |
- Son olarak, kimlik doğrulama sürecini tamamlamanız gerekir. Normalde, kullanıcı geçiş anahtarı kimlik doğrulamasını tamamladıktan sonra uygulama, kimlik doğrulama onayı içeren bir ortak anahtar kimlik bilgisi sunucuya gönderir. Sunucu, onayı doğrulayıp kullanıcının kimliğini doğrular.
Burada sahte bir sunucu kullandığımız için sunucunun onaylamayı doğruladığını belirten true değerini döndürüyoruz. Kendi uygulamanız için sunucu tarafı geçiş anahtarı kimlik doğrulaması hakkında daha fazla bilgi edinebilirsiniz.
signInWithSavedCredentials() yönteminin içinde ilgili yorumu bulun ve aşağıdaki kodla değiştirin:
SignInViewModel.kt
TODO("Complete the authentication process after validating the public key credential to your server and let the user in.")
if (data != null) {
sendSignInResponseToServer()
_navigationEvent.emit(NavigationEvent.NavigateToHome(signedInWithPasskeys = DataProvider.isSignedInThroughPasskeys()))
}
sendSigninResponseToServer(), gelecekteki kullanım için ortak anahtarın (sahte) sunucu tarafından doğrulandığını belirten "true" değerini döndürür.- Kullanıcı giriş yaptıktan sonra ana ekrana yönlendirilir.
Uygulamayı çalıştırın ve Oturum aç > Geçiş anahtarları/kayıtlı şifre ile oturum aç'a gidin. Kayıtlı kimlik bilgilerini kullanarak oturum açmayı deneyin.
Dene
Android uygulamanızda, geçiş anahtarı oluşturma, şifreyi Kimlik Bilgisi Yöneticisi'ne kaydetme ve Kimlik Bilgisi Yöneticisi API'sini kullanarak geçiş anahtarları veya kayıtlı şifre aracılığıyla kimlik doğrulama işlemlerini uyguladınız.
6. Tebrikler!
Bu codelab'i tamamladınız. https://github.com/android/identity-samples/tree/main/CredentialManager adresinde bulunan nihai çözümü incelemek istiyorsanız
Sorularınız varsa StackOverflow'da passkey etiketiyle sorun.