2025 4. Çeyrek Revizyonu: Android uygulamanızda Kimlik Bilgisi Yöneticisi API'sini kullanarak kimlik doğrulama yolculuklarını nasıl basitleştireceğinizi öğrenin

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.)

  1. 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
  1. 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:

  1. Uygulamayı başlatın.
  2. 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.

7a6fe80f4cf877a8.jpeg

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.

1f4c50daa2551f1.jpeg

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.kt bölümüne gidin. Geçiş anahtarı oluşturma ve kullanıcıyı içeri alma mantığını yazacağınız signUpWithPasskeys yöntemini bulun. Yöntemi aynı sınıfta bulabilirsiniz.
  • TODO yorum bloğunu create 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şturulan userId değ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

challenge

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.

user.id

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.

user.name

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.)

user.displayName

Bu alan, hesap için isteğe bağlı olarak girilebilen ve kullanıcı dostu bir addır.

rp.id

Güvenen taraf tüzel kişisi, uygulama ayrıntılarınıza karşılık gelir. Aşağıdaki özelliklere sahiptir:

  • name (zorunlu): Uygulama adınız
  • ID (isteğe bağlı): Alan veya alt alan adını ifade eder. Yoksa mevcut alan kullanılır.
  • icon (isteğe bağlı).

pubKeyCredParams

İzin verilen algoritmaların ve anahtar türlerinin listesi. Bu liste en az bir öğe içermelidir.

excludeCredentials

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. transports üyesi, sağlanıyorsa her kimlik bilgisinin kaydı sırasında getTransports() çağrısının sonucunu içermelidir.

authenticatorSelection.authenticatorAttachment

Cihazın platforma eklenip eklenmeyeceğini veya eklenmesinin gerekip gerekmediğini gösterir. Bu değeri platform olarak ayarlayın. Bu, platform cihazına yerleştirilmiş bir kimlik doğrulayıcı istediğinizi gösterir. Kullanıcıdan örneğin bir USB güvenlik anahtarı takması istenmez.

residentKey

Geçiş anahtarı oluşturmak için required değerini belirtin.

Kimlik bilgisi oluşturma

  1. Bir CreatePublicKeyCredentialRequest() oluşturduktan sonra oluşturulan istekle createCredential() ç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 debug komutuyla kontrol edebilirsiniz.

1ea8ace66135de1e.png

  1. 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 belirten true değerini döndürür.
  • setSignedInThroughPasskeys işaretini true olarak 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

id

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.

rawId

Kimlik bilgisinin kimliğinin ArrayBuffer nesne sürümü.

response.clientDataJSON

İstemci verilerini kodlayan bir ArrayBuffer nesnesi.

response.attestationObject

ArrayBuffer kodlu bir onay nesnesi. RP kimliği, işaretler ve genel anahtar gibi önemli bilgiler içerir.

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'yu createPassword ç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.

76e81460b26f9798.png

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 signInWithSavedCredentials yö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

challenge

ArrayBuffer nesnesinde sunucu tarafından oluşturulan bir sorgu. Bu, tekrarlama saldırılarını önlemek için gereklidir. Bir yanıtta aynı meydan okumayı asla iki kez kabul etmeyin. Bunu CSRF jetonu olarak değerlendirin.

rpId

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 rp.id parametresiyle eşleşmelidir.

  • 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 PublicKeyCredential ise setSignedInThroughPasskeys işaretini true olarak ayarlayın. Aksi takdirde false olarak 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

id

Kimliği doğrulanmış geçiş anahtarı kimliğinin Base64URL kodlu hali.

rawId

Kimlik bilgisinin kimliğinin ArrayBuffer nesne sürümü.

response.clientDataJSON

İstemci verilerinin ArrayBuffer nesnesi. Bu alan, RP sunucusunun doğrulaması gereken sorgu ve kaynak gibi bilgileri içerir.

response.authenticatorData

Kimlik doğrulayıcı verilerinin ArrayBuffer nesnesi. Bu alanda RP kimliği gibi bilgiler yer alır.

response.signature

İmzanın ArrayBuffer nesnesi. Bu değer, kimlik bilgisinin temelini oluşturur ve sunucuda doğrulanmalıdır.

response.userHandle

Oluşturma sırasında ayarlanan kullanıcı kimliğini içeren bir ArrayBuffer nesnesi. Sunucunun kullandığı kimlik değerlerini seçmesi gerekiyorsa veya arka uç, kimlik bilgilerinin kimlikleri üzerinde bir dizin oluşturulmasını istemiyorsa bu değer, kimlik bilgisi kimliği yerine kullanılabilir.

  • 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.

Daha fazla bilgi