Mağaza Bloku

Çoğu kullanıcı yeni bir Android cihaz kurarken kendi kimlik bilgilerini yönetmeye devam eder. Bu manuel işlem zorlaşabilir ve genellikle kötü bir kullanıcı deneyimine yol açar. Google Play hizmetleri tarafından desteklenen bir kitaplık olan Block Store API, uygulamaların kullanıcı şifrelerini kaydetme karmaşıklığıyla veya güvenlik riskiyle karşılaşmadan kullanıcı kimlik bilgilerini kaydetmesinin bir yolunu sağlayarak bu sorunu çözmeye çalışmaktadır.

Block Store API, uygulamanızın daha sonra yeni bir cihazda kullanıcıların kimliğini yeniden doğrulamak için alabileceği kullanıcı kimlik bilgilerini depolamasına olanak tanır. Bu sayede, uygulamanız yeni cihazda ilk kez başlatılırken oturum açma ekranı görmeleri gerekmeden kullanıcılara daha sorunsuz bir deneyim sunabilirsiniz.

Blok Mağazası'nı kullanmanın avantajlarından bazıları şunlardır:

  • Geliştiriciler için şifreli kimlik bilgisi depolama çözümü. Kimlik bilgileri, mümkün olduğunda uçtan uca şifrelenir.
  • Kullanıcı adları ve şifreler yerine jetonları kaydedin.
  • Oturum açma akışlarında sorun yaşanmasını önleyin.
  • Kullanıcıları, karmaşık şifreleri yönetme zahmetinden kurtarın.
  • Google, kullanıcının kimliğini doğrular.

Başlamadan önce

Uygulamanızı hazırlamak için aşağıdaki bölümlerde açıklanan adımları tamamlayın.

Uygulamanızı yapılandırma

Proje düzeyindeki build.gradle dosyanıza Google's Maven deposunu hem buildscript hem de allprojects bölümlerinize ekleyin:

buildscript {
  repositories {
    google()
    mavenCentral()
  }
}

allprojects {
  repositories {
    google()
    mavenCentral()
  }
}

Google Play hizmetleri blokunu Store's Gradle derleme dosyanıza (genellikle app/build.gradle olur) ekleyin:

dependencies {
  implementation 'com.google.android.gms:play-services-auth-blockstore:16.1.0'
}

İşleyiş şekli

Engelleme mağazası, uçtan uca şifrelenen ve yedekleme ve geri yükleme altyapısına ek olarak oluşturulan jetona dayalı bir oturum açma mekanizmasıdır. Aşağıdaki adımlarda, Blok Mağazası'nı kullanan bir uygulamanın nasıl çalışacağı açıklanmaktadır:

  1. Uygulamanızın kimlik doğrulama akışı sırasında veya daha sonra istediğiniz zaman, kullanıcının kimlik doğrulama jetonunu daha sonra kullanılmak üzere Engelleme Mağazası'nda depolayabilirsiniz.
  2. Jeton yerel olarak depolanır ve mümkün olduğunda uçtan uca şifrelenmiş buluta yedeklenebilir.
  3. Kullanıcı yeni bir cihazda geri yükleme akışı başlattığında veriler aktarılır.
  4. Kullanıcı, geri yükleme akışı sırasında uygulamanızı geri yüklerse uygulamanız yeni cihazda Block Store'dan kaydedilen jetonu alabilir.

Jeton kaydediliyor

Bir kullanıcı uygulamanızda oturum açtığında, o kullanıcı için oluşturduğunuz kimlik doğrulama jetonunu "Store Store"a kaydedebilirsiniz. Bu işlem, kullanıcının kimlik bilgilerini kaynak cihazda depolamak için bir StoreBytesData.Builder örneğinde setBytes() aranarak yapılır. Jetonu Store Store'da kaydettikten sonra jeton şifrelenir ve cihazda yerel olarak depolanır.

Aşağıdaki örnekte, kimlik doğrulama jetonunun yerel cihaza nasıl kaydedileceği gösterilmektedir:

val client = Blockstore.getClient(this)
val data = StoreBytesData.Builder()
        .setBytes(/* BYTE_ARRAY */)
        .build()
client.storeBytes(data)
        .addOnSuccessListener{ result ->
            Log.d(TAG, "Stored: ${result} bytes")
        }
        .addOnFailureListener { e ->
            Log.e(TAG, “Failed to store bytes”, e)
        }

Jeton alınıyor

Daha sonra, bir kullanıcı yeni bir cihazda geri yükleme akışını gerçekleştirirse Google Play hizmetleri önce kullanıcıyı doğrular, ardından Engelle Mağazası verilerinizi alır. Kullanıcı, geri yükleme akışının bir parçası olarak uygulama verilerinizi geri yüklemeyi zaten kabul etmiştir; bu nedenle ek izin gerekmez. Kullanıcı, uygulamanızı açtığında retrieveBytes() numaralı telefonu arayarak jetonunuzu Block Store'dan isteyebilirsiniz. Ardından alınan jeton, kullanıcının yeni cihazda oturumunu açık tutmak için kullanılabilir.

Aşağıdaki örnekte, daha önce Block Store'da depolanan şifrelenmiş jetonun nasıl alınacağı gösterilmektedir:

val client = Blockstore.getClient(this)
client.retrieveBytes()
            .addOnSuccessListener { result ->
                Log.d(TAG, "Retrieved: ${String(result)}")
            }
            .addOnFailureListener { e ->
                Log.e(TAG, "Failed to retrieve bytes", e)
            }
}

Uçtan uca şifreleme

Uçtan uca şifrelemenin kullanılabilmesi için cihazın Android 9 veya sonraki bir sürümü çalıştırıyor olması ve kullanıcının cihazı için bir ekran kilidi (PIN, desen veya şifre) ayarlamış olması gerekir. isEndToEndEncryptionAvailable() numaralı telefonu arayarak cihazda kullanılabilir olup olmadığını doğrulayabilirsiniz.

Aşağıdaki örnekte, bulut yedekleme sırasında şifrelemenin kullanılabilir olup olmadığının nasıl doğrulanacağı gösterilmektedir:

client.isEndToEndEncryptionAvailable()
        .addOnSuccessListener { result ->
          Log.d(TAG, "Will Block Store cloud backup be end-to-end encrypted? $result")
        }

Bulut yedeklemeyi etkinleştirin

Bulut yedeklemeyi etkinleştirmek için StoreBytesData nesnenize setShouldBackupToCloud() yöntemini ekleyin. Blok Mağaza, setShouldBackupToCloud() doğru olarak ayarlandığında depolanan baytları buluta düzenli olarak yedekler.

Aşağıdaki örnekte, yalnızca bulut yedekleme uçtan uca şifrelendiğinde bulut yedeklemenin nasıl etkinleştirileceği gösterilmektedir:

val client = Blockstore.getClient(this)
val storeBytesDataBuilder = StoreBytesData.Builder()
        .setBytes(/* BYTE_ARRAY */)

client.isEndToEndEncryptionAvailable()
        .addOnSuccessListener { isE2EEAvailable ->
          if (isE2EEAvailable) {
            storeBytesDataBuilder.setShouldBackupToCloud(true)
            Log.d(TAG, "E2EE is available, enable backing up bytes to the cloud.")

            client.storeBytes(storeBytesDataBuilder.build())
                .addOnSuccessListener { result ->
                  Log.d(TAG, "stored: ${result.getBytesStored()}")
                }.addOnFailureListener { e ->
                  Log.e(TAG, “Failed to store bytes”, e)
                }
          } else {
            Log.d(TAG, "E2EE is not available, only store bytes for D2D restore.")
          }
        }

Nasıl test edilir?

Geri yükleme akışlarını test etmek için geliştirme sırasında aşağıdaki yöntemleri kullanın.

Aynı cihazı kaldırma/yeniden yükleme

Kullanıcı, Yedekleme hizmetlerini etkinleştirirse (Ayarlar > Google > Yedekleme bölümünden kontrol edilebilir), Mağazanın Engelleme verileri uygulamanın kaldırılması/yeniden yüklenmesi sırasında saklanır.

Aşağıdaki adımları uygulayarak test edebilirsiniz:

  1. BlockStore API'yi test uygulamanıza entegre edin.
  2. Verilerinizi depolamak amacıyla BlockStore API'yi çağırmak için test uygulamasını kullanın.
  3. Test uygulamanızın yüklemesini kaldırıp aynı cihazda uygulamanızı yeniden yükleyin.
  4. Verilerinizi almak amacıyla BlockStore API'yi çağırmak için test uygulamasını kullanın.
  5. Alınan baytların kaldırılmadan önce depolananlarla aynı olduğunu doğrulayın.

Cihazdan cihaza

Çoğu durumda bu işlem, hedef cihazın fabrika ayarlarına sıfırlanmasını gerektirir. Ardından, Android kablosuz geri yükleme akışını veya Google kablo geri yükleme hizmetini (desteklenen cihazlar için) girebilirsiniz.

Bulut geri yükleme

  1. Blockstore API'yi test uygulamanıza entegre edin. Test uygulamasının Play Store'a gönderilmesi gerekir.
  2. Kaynak cihazda test uygulamasını kullanarak verilerinizi depolamak için Blockstore API'yi çağırın. MustBackUpToCloud ise true olarak ayarlanır.
  3. O ve üstü cihazlar için Engelleme Mağazası bulut yedeklemesini manuel olarak tetikleyebilirsiniz: Ayarlar > Google > Yedekleme'ye gidin, “Şimdi Yedekle” düğmesini tıklayın.
    1. Block Store bulut yedeklemesinin başarılı olduğunu doğrulamak için şunları yapabilirsiniz:
      1. Yedekleme tamamlandıktan sonra, "CloudSyncBpTkSvc" etiketine sahip günlük satırlarını arayın.
      2. Şuna benzer satırlar görürsünüz: "......, CloudSyncBpTkSvc: sync result: SUCCESS, ..., uploaded size: XXX bayt ...”
    2. Blok Mağaza bulut yedeklemesinden sonra 5 dakikalık bir "soğutma" süresi vardır. 5 dakika içinde "Şimdi Yedekle" düğmesini tıklamak, başka bir Blok Mağazası bulut yedeklemesini tetiklemez.
  4. Hedef cihazı fabrika ayarlarına sıfırlayın ve bulut geri yükleme akışından geçin. Geri yükleme akışı sırasında test uygulamanızı geri yüklemeyi seçin. Bulut geri yükleme akışları hakkında daha fazla bilgi için Desteklenen bulut geri yükleme akışları konusuna bakın.
  5. Hedef cihazda verilerinizi almak için test uygulamasını kullanarak Blockstore API'yi çağırın.
  6. Alınan baytların kaynak cihazda depolanan baytlarla aynı olduğunu doğrulayın.

Cihaz Gereksinimleri

Uçtan uca Şifreleme

  • Uçtan uca şifreleme, Android 9 (API 29) ve sonraki sürümleri çalıştıran cihazlarda desteklenir.
  • Uçtan uca şifrelemenin etkinleştirilebilmesi ve kullanıcının verilerinin doğru bir şekilde şifrelenebilmesi için cihazda bir PIN, desen veya şifre ayarlanmış bir ekran kilidi ayarlanmalıdır.

Cihazdan Cihaza Geri Yükleme Akışı

Cihazdan cihaza geri yükleme için bir kaynak cihazınızın ve bir hedef cihazınızın olması gerekir. Bunlar, veri aktaran iki cihaz olacaktır.

Kaynak cihazlar, yedeklenebilmesi için Android 6 (API 23) ve sonraki sürümleri çalıştırıyor olmalıdır.

Android 9 (API 29) ve sonraki sürümleri çalıştıran ve geri yükleyebilmek için cihazları hedefleyin.

Cihazdan cihaza geri yükleme akışı hakkında daha fazla bilgiyi burada bulabilirsiniz.

Cloud Yedekleme ve Geri Yükleme Akışı

Bulut yedekleme ve geri yükleme işlemi için bir kaynak cihaz ve bir hedef cihaz gereklidir.

Kaynak cihazlar, yedeklenebilmesi için Android 6 (API 23) ve sonraki sürümleri çalıştırıyor olmalıdır.

Hedef cihazlar, tedarikçilerine bağlı olarak desteklenir. Pixel cihazlarda, bu özellik Android 9 (API 29) tarafından kullanılabilir ve diğer tüm cihazlarda Android 12 (API 31) veya sonraki bir sürüm yüklü olmalıdır.