Kimlik Yöneticisi ile kullanıcınızda oturum açın

Credential Manager, tek bir API'de kullanıcı adı ve şifre, geçiş anahtarları ve federasyon oturum açma çözümleri (ör. Google ile oturum açma) gibi birden fazla oturum açma yöntemini destekleyen bir Jetpack API'dir. Bu sayede geliştiriciler için entegrasyonu kolaylaştırır.

Ayrıca Credential Manager, kullanıcılar için kimlik doğrulama yöntemleri arasında oturum açma arayüzünü birleştirerek kullanıcıların hangi yöntemi seçerse seçsin uygulamalarda daha kolay ve anlaşılır bir şekilde oturum açmasını sağlar.

Bu sayfada, geçiş anahtarları kavramı ve Credential Manager API kullanılarak geçiş anahtarları da dahil olmak üzere kimlik doğrulama çözümleri için istemci tarafı desteğinin uygulanmasıyla ilgili adımlar açıklanmaktadır. Daha ayrıntılı ve spesifik soruların yanıtlarını içeren ayrı bir SSS sayfası da bulunmaktadır.

Geçiş anahtarları hakkında

Geçiş anahtarları, şifrelerin daha güvenli ve kolay bir alternatifidir. Geçiş anahtarlarıyla kullanıcılar, biyometrik sensör (ör. parmak izi veya yüz tanıma), PIN ya da desen kullanarak uygulamalarda ve web sitelerinde oturum açabilir. Bu sayede sorunsuz bir oturum açma deneyimi sunarak kullanıcılarınızın kullanıcı adlarını veya şifrelerini hatırlamasına gerek kalmaz.

Şifre anahtarları, FIDO Alliance ve World Wide Web Consortium (W3C) tarafından ortaklaşa geliştirilen bir standart olan WebAuthn'ye (Web Authentication) dayanır. WebAuthn, kullanıcının kimliğini doğrulamak için ortak anahtar kriptografisini kullanır. Kullanıcının oturum açtığı web sitesi veya uygulama, herkese açık anahtarı görebilir ve saklayabilir ancak özel anahtarı asla göremez. Özel anahtar gizli ve güvenli tutulur. Anahtar benzersiz olduğu ve web sitesine veya uygulamaya bağlı olduğu için geçiş anahtarları kimlik avına karşı korumalıdır ve ek güvenlik sağlar.

Kimlik Bilgisi Yöneticisi, kullanıcıların geçiş anahtarları oluşturup Google Şifre Yöneticisi'nde saklamasına olanak tanır.

Credential Manager ile sorunsuz geçiş anahtarı kimlik doğrulama akışlarını nasıl uygulayacağınızla ilgili yönergeler için Geçiş anahtarlarıyla kullanıcı kimlik doğrulaması başlıklı makaleyi inceleyin.

Ön koşullar

Kimlik bilgisi yöneticisini kullanmak için bu bölümdeki adımları tamamlayın.

Yakın tarihli bir platform sürümünü kullanma

Kimlik Bilgisi Yöneticisi, Android 4.4 (API düzeyi 19) ve sonraki sürümlerde desteklenir.

Uygulamanıza bağımlılık ekleme

Uygulama modülünüzün derleme komut dosyasına aşağıdaki bağımlılıkları ekleyin:

implementation(libs.androidx.credentials)

// optional - needed for credentials support from play services, for devices running
// Android 13 and below.
implementation(libs.androidx.credentials.play.services.auth)

Uygulamanızı küçültme, karartma ve optimize etme hakkında daha fazla bilgi edinin.

Digital Asset Links desteği ekleme

Android uygulamanızda geçiş anahtarı desteğini etkinleştirmek için uygulamanızı, uygulamanızın sahibi olduğu bir web sitesiyle ilişkilendirin. Aşağıdaki adımları tamamlayarak bu ilişkilendirmeyi beyan edebilirsiniz:

  1. Bir Digital Asset Links JSON dosyası oluşturun. Örneğin, https://signin.example.com web sitesinin ve com.example paket adlı bir Android uygulamasının oturum açma kimlik bilgilerini paylaşabileceğini belirtmek için aşağıdaki içeriğe sahip assetlinks.json adlı bir dosya oluşturun:

    [
      {
        "relation" : [
          "delegate_permission/common.handle_all_urls",
          "delegate_permission/common.get_login_creds"
        ],
        "target" : {
          "namespace" : "android_app",
          "package_name" : "com.example.android",
          "sha256_cert_fingerprints" : [
            SHA_HEX_VALUE
          ]
        }
      }
    ]
    

    relation alanı, bildirilen ilişkiyi açıklayan bir veya daha fazla dizeden oluşan bir dizidir. Uygulamaların ve sitelerin oturum açma kimlik bilgilerini paylaştığını bildirmek için ilişkileri delegate_permission/handle_all_urls ve delegate_permission/common.get_login_creds olarak belirtin.

    target alanı, bildirimin geçerli olduğu öğeyi belirten bir nesnedir. Aşağıdaki alanlar bir web sitesini tanımlar:

    namespace web
    site

    Web sitesinin URL'si, https://domain[:optional_port] biçiminde olmalıdır. Örneğin, https://www.example.com.

    domain tam olarak nitelendirilmiş olmalı ve HTTPS için 443 numaralı bağlantı noktası kullanılırken optional_port atlanmalıdır.

    site hedefi yalnızca kök alan olabilir: Uygulama ilişkilendirmesini belirli bir alt dizinle sınırlayamazsınız. URL'ye yol (ör. sondaki eğik çizgi) eklemeyin.

    Alt alanlar eşleşme olarak kabul edilmez. Örneğin, domain alanını www.example.com olarak belirtirseniz www.counter.example.com alanı uygulamanızla ilişkilendirilmez.

    Aşağıdaki alanlar bir Android uygulamasını tanımlar:

    namespace android_app
    package_name Uygulamanın manifest dosyasında beyan edilen paket adı. Örneğin, com.example.android
    sha256_cert_fingerprints Uygulamanızın imza sertifikasının SHA256 parmak izleri.
  2. Digital Asset Links JSON dosyasını, oturum açma alan adında aşağıdaki konumda barındırın:

    https://domain[:optional_port]/.well-known/assetlinks.json
    

    Örneğin, oturum açma alanınız signin.example.com ise JSON dosyasını https://signin.example.com/.well-known/assetlinks.json adresinde barındırın.

    Digital Asset Links dosyasının MIME türü JSON olmalıdır. Sunucunun yanıtta Content-Type: application/json üstbilgisi gönderdiğini doğrulayın.

  3. Ana makinenizin, Google'ın Digital Asset Link dosyanızı almasına izin verdiğini doğrulayın. robots.txt dosyanız varsa Googlebot aracısının /.well-known/assetlinks.json almasına izin verilmelidir. Çoğu site, diğer hizmetlerin bu dosyalardaki meta verilere erişebilmesi için tüm otomatik aracıların /.well-known/ yolundaki dosyaları almasına izin verebilir:

    User-agent: *
    Allow: /.well-known/
    
  4. Aşağıdaki satırı manifest dosyasında <application> altına ekleyin:

    <meta-data android:name="asset_statements" android:resource="@string/asset_statements" />
    
  5. Kimlik bilgisi yöneticisi üzerinden şifreyle oturum açma özelliğini kullanıyorsanız manifest dosyasında dijital öğe bağlantısını yapılandırmak için bu adımı uygulayın. Bu adım, yalnızca geçiş anahtarları kullanıyorsanız gerekli değildir.

    Android uygulamasında ilişkilendirmeyi beyan edin. Yüklenecek assetlinks.json dosyalarını belirten bir nesne ekleyin. Dizede kullandığınız tüm kesme işaretlerini ve tırnak işaretlerini kod dışında bırakmanız gerekir. Örneğin:

    <string name="asset_statements" translatable="false">
    [{
      \"include\": \"https://signin.example.com/.well-known/assetlinks.json\"
    }]
    </string>
    
    > GET /.well-known/assetlinks.json HTTP/1.1
    > User-Agent: curl/7.35.0
    > Host: signin.example.com
    
    < HTTP/1.1 200 OK
    < Content-Type: application/json
    

Kimlik bilgisi yöneticisini yapılandırma

Bir CredentialManager nesnesini yapılandırmak ve başlatmak için aşağıdakine benzer bir mantık ekleyin:

// Use your app or activity context to instantiate a client instance of
// CredentialManager.
private val credentialManager = CredentialManager.create(context)

Kimlik bilgisi alanlarını belirtme

Android 14 ve sonraki sürümlerde, kullanıcı adı veya şifre alanları gibi kimlik bilgisi alanlarını belirtmek için isCredential özelliği kullanılabilir. Bu özellik, bu görünümün Kimlik Bilgisi Yöneticisi ve üçüncü taraf kimlik bilgisi sağlayıcılarla çalışmak üzere tasarlanmış bir kimlik bilgisi alanı olduğunu ve otomatik doldurma hizmetlerinin daha iyi otomatik doldurma önerileri sunmasına yardımcı olduğunu gösterir. Uygulama, Credential Manager API'yi kullandığında, kullanılabilir kimlik bilgilerini içeren Credential Manager alt sayfası gösterilir ve kullanıcı adı veya şifre için otomatik doldurma özelliğinin doldurma iletişim kutusunu göstermeye gerek kalmaz. Benzer şekilde, uygulama kimlik bilgilerini kaydetmek için Credential Manager API'yi isteyeceğinden, şifreler için otomatik doldurma özelliğinin kaydetme iletişim kutusunu göstermeye gerek yoktur.

isCredential özelliğini kullanmak için ilgili görünümlere ekleyin:

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:isCredential="true" />

Kullanıcınızın oturumunu açma

Kullanıcının hesabıyla ilişkili tüm geçiş anahtarı ve şifre seçeneklerini almak için aşağıdaki adımları tamamlayın:

  1. Şifre ve geçiş anahtarı kimlik doğrulama seçeneklerini başlatın:

    // Retrieves the user's saved password for your app from their
    // password provider.
    val getPasswordOption = GetPasswordOption()
    
    // Get passkey from the user's public key credential provider.
    val getPublicKeyCredentialOption = GetPublicKeyCredentialOption(
      requestJson = requestJson
    )
          
  2. Oturum açma isteğini oluşturmak için önceki adımdan alınan seçenekleri kullanın.

    val credentialRequest = GetCredentialRequest(
      listOf(getPasswordOption, getPublicKeyCredentialOption),
    )
          
  3. Oturum açma akışını başlatın:

    coroutineScope {
      try {
        result = credentialManager.getCredential(
          // Use an activity-based context to avoid undefined system UI
          // launching behavior.
          context = activityContext,
          request = credentialRequest
        )
        handleSignIn(result)
      } catch (e: GetCredentialException) {
        // Handle failure
      }
    }
        
    fun handleSignIn(result: GetCredentialResponse) {
      // Handle the successfully returned credential.
      val credential = result.credential
    
      when (credential) {
        is PublicKeyCredential -> {
          val responseJson = credential.authenticationResponseJson
          // Share responseJson i.e. a GetCredentialResponse on your server to
          // validate and  authenticate
        }
    
        is PasswordCredential -> {
          val username = credential.id
          val password = credential.password
          // Use id and password to send to your server to validate
          // and authenticate
        }
    
        is CustomCredential -> {
          // If you are also using any external sign-in libraries, parse them
          // here with the utility functions provided.
          if (credential.type == ExampleCustomCredential.TYPE) {
            try {
              val ExampleCustomCredential =
                ExampleCustomCredential.createFrom(credential.data)
              // Extract the required credentials and complete the authentication as per
              // the federated sign in or any external sign in library flow
            } catch (e: ExampleCustomCredential.ExampleCustomCredentialParsingException) {
              // Unlikely to happen. If it does, you likely need to update the dependency
              // version of your external sign-in library.
              Log.e(TAG, "Failed to parse an ExampleCustomCredential", 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")
        }
      }
    }
        

Aşağıdaki örnekte, geçiş anahtarı aldığınızda JSON isteğinin nasıl biçimlendirileceği gösterilmektedir:

{
  "challenge": "T1xCsnxM2DNL2KdK5CLa6fMhD7OBqho6syzInk_n-Uo",
  "allowCredentials": [],
  "timeout": 1800000,
  "userVerification": "required",
  "rpId": "https://passkeys-codelab.glitch.me/"
}

Aşağıdaki örnekte, herkese açık anahtar kimlik bilgisi aldıktan sonra JSON yanıtının nasıl görünebileceği gösterilmektedir:

{
  "id": "KEDetxZcUfinhVi6Za5nZQ",
  "type": "public-key",
  "rawId": "KEDetxZcUfinhVi6Za5nZQ",
  "response": {
    "clientDataJSON": "eyJ0eXBlIjoid2ViYXV0aG4uZ2V0IiwiY2hhbGxlbmdlIjoiVDF4Q3NueE0yRE5MMktkSzVDTGE2Zk1oRDdPQnFobzZzeXpJbmtfbi1VbyIsIm9yaWdpbiI6ImFuZHJvaWQ6YXBrLWtleS1oYXNoOk1MTHpEdll4UTRFS1R3QzZVNlpWVnJGUXRIOEdjVi0xZDQ0NEZLOUh2YUkiLCJhbmRyb2lkUGFja2FnZU5hbWUiOiJjb20uZ29vZ2xlLmNyZWRlbnRpYWxtYW5hZ2VyLnNhbXBsZSJ9",
    "authenticatorData": "j5r_fLFhV-qdmGEwiukwD5E_5ama9g0hzXgN8thcFGQdAAAAAA",
    "signature": "MEUCIQCO1Cm4SA2xiG5FdKDHCJorueiS04wCsqHhiRDbbgITYAIgMKMFirgC2SSFmxrh7z9PzUqr0bK1HZ6Zn8vZVhETnyQ",
    "userHandle": "2HzoHm_hY0CjuEESY9tY6-3SdjmNHOoNqaPDcZGzsr0"
  }
}

Kimlik bilgileri olmadığında istisnaları işleme

Bazı durumlarda kullanıcının kimlik bilgisi olmayabilir veya kullanıcı, mevcut bir kimlik bilgisinin kullanılmasına izin vermeyebilir. getCredential() çağrılır ve kimlik bilgisi bulunmazsa NoCredentialException döndürülür. Bu durumda kodunuz, NoCredentialException örneklerini işlemelidir.

coroutineScope {
  try {
    result = credentialManager.getCredential(
      context = activityContext,
      request = credentialRequest
    )
  } catch (e: GetCredentialException) {
    Log.e("CredentialManager", "No credential available", e)
  }
}

Android 14 veya sonraki sürümlerde, getCredential() işlevini çağırmadan önce prepareGetCredential() yöntemini kullanarak hesap seçiciyi gösterirken gecikmeyi azaltabilirsiniz.

coroutineScope {
  val response = credentialManager.prepareGetCredential(
    GetCredentialRequest(
      listOf(
        getPublicKeyCredentialOption,
        getPasswordOption
      )
    )
  )
}

prepareGetCredential() yöntemi, kullanıcı arayüzü öğelerini çağırmaz. Bu işlem yalnızca daha sonra getCredential() API aracılığıyla kalan kimlik bilgisi alma işlemini (kullanıcı arayüzlerini içeren) başlatabilmeniz için hazırlık çalışmasını yapmanıza yardımcı olur.

Önbelleğe alınan veriler PrepareGetCredentialResponse nesnesi olarak döndürülür. Mevcut kimlik bilgileri varsa sonuçlar önbelleğe alınır. Ardından, önbelleğe alınmış verilerle hesap seçiciyi açmak için kalan getCredential() API'yi daha sonra başlatabilirsiniz.

Kayıt akışları

Kullanıcıları kimlik doğrulaması için geçiş anahtarı veya şifre kullanarak kaydedebilirsiniz.

Geçiş anahtarı oluşturun

Kullanıcılara geçiş anahtarı kaydetme ve yeniden kimlik doğrulama için kullanma seçeneği sunmak istiyorsanız CreatePublicKeyCredentialRequest nesnesi kullanarak kullanıcı kimlik bilgisi kaydedin.

suspend fun createPasskey(requestJson: String, preferImmediatelyAvailableCredentials: Boolean) {
  val createPublicKeyCredentialRequest = CreatePublicKeyCredentialRequest(
    // Contains the request in JSON format. Uses the standard WebAuthn
    // web JSON spec.
    requestJson = requestJson,
    // Defines whether you prefer to use only immediately available
    // credentials, not hybrid credentials, to fulfill this request.
    // This value is false by default.
    preferImmediatelyAvailableCredentials = preferImmediatelyAvailableCredentials,
  )

  // Execute CreateCredentialRequest asynchronously to register credentials
  // for a user account. Handle success and failure cases with the result and
  // exceptions, respectively.
  coroutineScope {
    try {
      val result = credentialManager.createCredential(
        // Use an activity-based context to avoid undefined system
        // UI launching behavior
        context = activityContext,
        request = createPublicKeyCredentialRequest,
      )
      //  Handle passkey creation result
    } catch (e : CreateCredentialException){
      handleFailure(e)
    }
  }
}
fun handleFailure(e: CreateCredentialException) {
  when (e) {
    is CreatePublicKeyCredentialDomException -> {
      // Handle the passkey DOM errors thrown according to the
      // WebAuthn spec.
    }
    is CreateCredentialCancellationException -> {
      // The user intentionally canceled the operation and chose not
      // to register the credential.
    }
    is CreateCredentialInterruptedException -> {
      // Retry-able error. Consider retrying the call.
    }
    is CreateCredentialProviderConfigurationException -> {
      // Your app is missing the provider configuration dependency.
      // Most likely, you're missing the
      // "credentials-play-services-auth" module.
    }
    is CreateCredentialCustomException -> {
      // You have encountered an error from a 3rd-party SDK. If you
      // make the API call with a request object that's a subclass of
      // CreateCustomCredentialRequest using a 3rd-party SDK, then you
      // should check for any custom exception type constants within
      // that SDK to match with e.type. Otherwise, drop or log the
      // exception.
    }
    else -> Log.w(TAG, "Unexpected exception type ${e::class.java.name}")
  }
}

JSON isteğini biçimlendirme

Geçiş anahtarı oluşturduktan sonra bunu bir kullanıcı hesabıyla ilişkilendirmeniz ve geçiş anahtarının genel anahtarını sunucunuzda saklamanız gerekir. Aşağıdaki kod örneğinde, geçiş anahtarı oluştururken JSON isteğinin nasıl biçimlendirileceği gösterilmektedir.

Uygulamalarınıza sorunsuz kimlik doğrulama ekleme hakkındaki bu blog yayınında, geçiş anahtarları oluştururken ve geçiş anahtarlarını kullanarak kimlik doğrulama yaparken JSON isteğinizi nasıl biçimlendireceğiniz gösterilmektedir. Ayrıca, şifrelerin neden etkili bir kimlik doğrulama çözümü olmadığı, mevcut biyometrik kimlik bilgilerinden nasıl yararlanılacağı, uygulamanızı sahip olduğunuz bir web sitesiyle nasıl ilişkilendireceğiniz, geçiş anahtarlarını nasıl oluşturacağınız ve geçiş anahtarlarını kullanarak nasıl kimlik doğrulayacağınız da açıklanmaktadır.

{
  "challenge": "abc123",
  "rp": {
    "name": "Credential Manager example",
    "id": "credential-manager-test.example.com"
  },
  "user": {
    "id": "def456",
    "name": "helloandroid@gmail.com",
    "displayName": "helloandroid@gmail.com"
  },
  "pubKeyCredParams": [
    {
      "type": "public-key",
      "alg": -7
    },
    {
      "type": "public-key",
      "alg": -257
    }
  ],
  "timeout": 1800000,
  "attestation": "none",
  "excludeCredentials": [
    {
      "id": "ghi789",
      "type": "public-key"
    },
    {
      "id": "jkl012",
      "type": "public-key"
    }
  ],
  "authenticatorSelection": {
    "authenticatorAttachment": "platform",
    "requireResidentKey": true,
    "residentKey": "required",
    "userVerification": "required"
  }
}

authenticatorAttachment için değerleri ayarlama

authenticatorAttachment parametresi yalnızca kimlik bilgisi oluşturma sırasında ayarlanabilir. platform, cross-platform veya değer belirtmeyebilirsiniz. Çoğu durumda değer girilmesi önerilmez.

  • platform: Kullanıcının mevcut cihazını kaydetmek veya oturum açtıktan sonra geçiş anahtarlarına yükseltmesini istemek için authenticatorAttachment değerini platform olarak ayarlayın.
  • cross-platform: Bu değer, genellikle çok faktörlü kimlik bilgilerini kaydederken kullanılır ve geçiş anahtarı bağlamında kullanılmaz.
  • Değer yok: Kullanıcılara tercih ettikleri cihazlarda (ör. hesap ayarlarında) geçiş anahtarı oluşturma esnekliği sağlamak için kullanıcı geçiş anahtarı eklemeyi seçtiğinde authenticatorAttachment parametresi belirtilmemelidir. Çoğu durumda, parametreyi belirtmemek en iyi seçenektir.

Yinelenen geçiş anahtarlarının oluşturulmasını önleme

Aynı geçiş anahtarı sağlayıcısıyla zaten bir geçiş anahtarı varsa yeni bir geçiş anahtarı oluşturulmasını önlemek için isteğe bağlı excludeCredentials dizisinde kimlik bilgisi kimliklerini listeleyin.

JSON yanıtını işleme

Aşağıdaki kod snippet'inde, herkese açık anahtar kimlik bilgisi oluşturmaya yönelik örnek bir JSON yanıtı gösterilmektedir. Döndürülen ortak anahtar kimlik bilgisinin nasıl işleneceği hakkında daha fazla bilgi edinin.

{
  "id": "KEDetxZcUfinhVi6Za5nZQ",
  "type": "public-key",
  "rawId": "KEDetxZcUfinhVi6Za5nZQ",
  "response": {
    "clientDataJSON": "eyJ0eXBlIjoid2ViYXV0aG4uY3JlYXRlIiwiY2hhbGxlbmdlIjoibmhrUVhmRTU5SmI5N1Z5eU5Ka3ZEaVh1Y01Fdmx0ZHV2Y3JEbUdyT0RIWSIsIm9yaWdpbiI6ImFuZHJvaWQ6YXBrLWtleS1oYXNoOk1MTHpEdll4UTRFS1R3QzZVNlpWVnJGUXRIOEdjVi0xZDQ0NEZLOUh2YUkiLCJhbmRyb2lkUGFja2FnZU5hbWUiOiJjb20uZ29vZ2xlLmNyZWRlbnRpYWxtYW5hZ2VyLnNhbXBsZSJ9",
    "attestationObject": "o2NmbXRkbm9uZWdhdHRTdG10oGhhdXRoRGF0YViUj5r_fLFhV-qdmGEwiukwD5E_5ama9g0hzXgN8thcFGRdAAAAAAAAAAAAAAAAAAAAAAAAAAAAEChA3rcWXFH4p4VYumWuZ2WlAQIDJiABIVgg4RqZaJyaC24Pf4tT-8ONIZ5_Elddf3dNotGOx81jj3siWCAWXS6Lz70hvC2g8hwoLllOwlsbYatNkO2uYFO-eJID6A"
  }
}

İstemci verileri JSON'undan kaynağı doğrulama

origin, isteğin geldiği uygulamayı veya web sitesini temsil eder ve geçiş anahtarları tarafından kimlik avı saldırılarına karşı koruma sağlamak için kullanılır. Uygulamanızın sunucusunun, istemci verilerinin kaynağını onaylı uygulamalar ve web sitelerinin izin verilenler listesiyle karşılaştırması gerekir. Sunucu, tanınmayan bir kaynaktan gelen bir uygulama veya web sitesinden istek alırsa istek reddedilmelidir.

Web örneğinde origin, kimlik bilgisinin imzalandığı aynı site kaynağını yansıtır. Örneğin, https://www.example.com:8443/store?category=shoes#athletic URL'si verildiğinde origin değeri https://www.example.com:8443 olur.

Android uygulamalarında kullanıcı aracısı, origin değerini otomatik olarak çağıran uygulamanın imzası olarak ayarlar. Bu imza, geçiş anahtarı API'sinin arayanını doğrulamak için sunucunuzda eşleşme olarak doğrulanmalıdır. Android origin, APK imzalama sertifikasının SHA-256 karmasından türetilen bir URI'dir. Örneğin:

android:apk-key-hash:<sha256_hash-of-apk-signing-cert>

Bir anahtar deposundaki imzalama sertifikalarının SHA-256 karmalarını bulmak için aşağıdaki terminal komutunu çalıştırın:

keytool -list -keystore <path-to-apk-signing-keystore>

SHA-256 karmaları iki nokta üst üste ile ayrılmış onaltılık biçimdedir (91:F7:CB:F9:D6:81…) ve Android origin değerleri base64url ile kodlanmıştır. Bu Python örneğinde, karma biçiminin uyumlu, iki nokta üst üste ile ayrılmış onaltılık biçime nasıl dönüştürüleceği gösterilmektedir:

import binascii
import base64
fingerprint = '91:F7:CB:F9:D6:81:53:1B:C7:A5:8F:B8:33:CC:A1:4D:AB:ED:E5:09:C5'
print("android:apk-key-hash:" + base64.urlsafe_b64encode(binascii.a2b_hex(fingerprint.replace(':', ''))).decode('utf8').replace('=', ''))

fingerprint değerini kendi değerinizle değiştirin. Örnek bir sonuç:

android:apk-key-hash:kffL-daBUxvHpY-4M8yhTavt5QnFEI2LsexohxrGPYU

Ardından, bu dizeyi sunucunuzda izin verilen kaynak olarak eşleştirebilirsiniz. Hata ayıklama ve yayınlama sertifikaları gibi birden fazla imzalama sertifikanız veya birden fazla uygulamanız varsa işlemi tekrarlayın ve bu kaynakların tümünü sunucuda geçerli olarak kabul edin.

Kullanıcı şifresini kaydetme

Kullanıcı, uygulamanızdaki bir kimlik doğrulama akışı için kullanıcı adı ve şifre sağlarsa kullanıcının kimliğini doğrulamak için kullanılabilecek bir kullanıcı kimlik bilgisi kaydedebilirsiniz. Bunu yapmak için bir CreatePasswordRequest nesnesi oluşturun:

suspend fun registerPassword(username: String, password: String) {
  // Initialize a CreatePasswordRequest object.
  val createPasswordRequest =
    CreatePasswordRequest(id = username, password = password)

  // Create credential and handle result.
  coroutineScope {
    try {
      val result =
        credentialManager.createCredential(
          // Use an activity based context to avoid undefined
          // system UI launching behavior.
          activityContext,
          createPasswordRequest
        )
      // Handle register password result
    } catch (e: CreateCredentialException) {
      handleFailure(e)
    }
  }
}

Kimlik bilgisi kurtarma desteği

Kullanıcı, kimlik bilgilerini sakladığı bir cihaza artık erişemiyorsa güvenli bir online yedeklemeden kurtarma işlemi yapması gerekebilir. Bu kimlik bilgisi kurtarma sürecini destekleme hakkında daha fazla bilgi edinmek için şu blog yayınındaki "Erişimi kurtarma veya yeni cihazlar ekleme" başlıklı bölümü okuyun: Google Şifre Yöneticisi'nde Geçiş Anahtarlarının Güvenliği.

Kullanıcılar için otomatik olarak geçiş anahtarı oluşturma

Kullanıcının geçiş anahtarı yoksa bir sonraki oturum açışında, şifre yöneticisine kaydedilmiş bir şifreyi kullanarak kullanıcı adına otomatik olarak geçiş anahtarı oluşturabilirsiniz. Herkese açık kimlik bilgileri isterken isConditionalCreateRequest alanını ayarlayarak bunu yapın:

CreatePublicKeyCredentialRequest(
    // other parameters
    isConditionalCreateRequest: Boolean = true
)

Kullanıcı oturum açtığında otomatik olarak bir geçiş anahtarı oluşturulur ve kullanıcının seçtiği şifre yöneticisinde saklanır. Google Şifre Yöneticisi kullanılıyorsa kullanıcının, şifre yöneticisine kaydedilen şifreyi (Kimlik Bilgisi Yöneticisi veya otomatik doldurma özelliğini kullanarak) kullanmış olması gerekir. Bu geçiş anahtarı oluşturulduğunda kullanıcıya bildirim gönderilir ve kullanıcı, geçiş anahtarını yönetmek için şifre yöneticisine gidebilir.

Bu özellik için 1.6.0-alpha01 veya sonraki sürümler gereklidir.

Geçiş anahtarı uç noktaları ve iyi bilinen URL'ler içeren şifre yönetimi araçları için destek ekleme

Şifre ve kimlik bilgisi yönetim araçlarıyla sorunsuz entegrasyon ve gelecekteki uyumluluk için, iyi bilinen URL'ler olan geçiş anahtarı uç noktaları için destek eklemenizi öneririz. Bu, uyumlu tarafların geçiş anahtarı desteğini resmi olarak duyurması ve geçiş anahtarı kaydı ile yönetimi için doğrudan bağlantılar sağlaması amacıyla kullanılan açık bir protokoldür.

  1. Web sitesi, Android ve iOS uygulamaları olan https://example.com adresindeki bir güvenen taraf için iyi bilinen URL https://example.com/.well-known/passkey-endpoints olur.
  2. URL sorgulandığında yanıtta aşağıdaki şema kullanılmalıdır.

    {
      "enroll": "https://example.com/account/manage/passkeys/create"
      "manage": "https://example.com/account/manage/passkeys"
    }
    
  3. Bu bağlantının web'de değil doğrudan uygulamanızda açılmasını sağlamak için Android uygulama bağlantılarını kullanın.

  4. Daha fazla bilgiyi GitHub'daki geçiş anahtarı uç noktaları için iyi bilinen URL açıklamasında bulabilirsiniz.

Hangi sağlayıcının oluşturduğunu göstererek kullanıcıların geçiş anahtarlarını yönetmesine yardımcı olun

Kullanıcıların belirli bir uygulamayla ilişkili birden fazla geçiş anahtarını yönetirken karşılaştığı zorluklardan biri, düzenleme veya silme için doğru geçiş anahtarını belirlemektir. Bu soruna yardımcı olmak için uygulamaların ve web sitelerinin, uygulamanızın ayarlar ekranındaki geçiş anahtarları listesine ek bilgiler (ör. kimlik bilgisini oluşturan sağlayıcı, oluşturma tarihi ve son kullanma tarihi) eklemesi önerilir. Sağlayıcı bilgileri, ilgili geçiş anahtarıyla ilişkili AAGUID incelenerek elde edilir. AAGUID, geçiş anahtarının kimlik doğrulayıcı verilerinde yer alır.

Örneğin, bir kullanıcı Google Şifre Yöneticisi'ni kullanarak Android destekli bir cihazda geçiş anahtarı oluşturursa RP, "ea9b8d66-4d01-1d21-3ce4-b6b48cb575d4" gibi görünen bir AAGUID alır. Güvenen taraf, Google Şifre Yöneticisi kullanılarak oluşturulduğunu belirtmek için geçiş anahtarı listesindeki geçiş anahtarına açıklama ekleyebilir.

RP'ler, bir AAGUID'yi geçiş anahtarı sağlayıcıyla eşlemek için topluluk kaynaklı bir AAGUID deposu kullanabilir. Geçiş anahtarı sağlayıcısının adını ve simgesini bulmak için listedeki AAGUID'yi arayın.

AAGUID entegrasyonu hakkında daha fazla bilgi edinin.

Sık karşılaşılan hataları giderme

Yaygın hata kodları, açıklamaları ve nedenleri hakkında bilgi edinmek için Kimlik bilgisi yöneticisi sorun giderme kılavuzuna bakın.

Ek kaynaklar

Kimlik Bilgisi Yöneticisi API'si ve geçiş anahtarları hakkında daha fazla bilgi edinmek için aşağıdaki kaynaklara göz atın: