Özel bir hesap türü oluşturma

Şimdiye kadar, Google tarafından tanımlanan hesapları ve kullanıcıları kullanan Google API'lerine erişimden bahsettik. Fakat kendi çevrimiçi hizmetiniz varsa bu hizmette Google hesapları veya kullanıcıları olmayacaktır, ne yaparsınız? Bir kullanıcının cihazına yeni hesap türleri yüklemek nispeten kolay bir işlem. Bu derste, yerleşik hesaplarla aynı şekilde çalışan bir özel hesap türünün nasıl oluşturulacağı açıklanmaktadır.

Özel hesap kodunuzu uygulayın

İlk olarak, kullanıcıdan kimlik bilgilerini almak için bir yönteme ihtiyacınız vardır. Bu, ad ve şifre isteyen bir iletişim kutusu kadar basit bir işlem olabilir. Tek kullanımlık şifre veya biyometrik tarama gibi daha egzotik bir işlem de kullanılabilir. Her iki durumda da aşağıdaki kodu uygulamak sizin sorumluluğunuzdadır:

  1. Kullanıcıdan kimlik bilgilerini toplar
  2. Kimlik bilgilerini sunucuyla doğrular
  3. Kimlik bilgilerini cihazda depolar

Genellikle bu gereksinimlerin üçü de tek bir etkinlikle karşılanabilir. Buna kimlik doğrulayıcı etkinliği diyeceğiz.

Kimlik doğrulayıcı etkinliklerinin, AccountManager sistemiyle etkileşim kurması gerektiğinden normal etkinliklerde bulunmayan belirli gereksinimleri vardır. Android çerçevesi, işleri yoluna koymayı kolaylaştırmak için AccountAuthenticatorActivity adlı bir temel sınıf sağlar. Bu sınıfı genişleterek kendi özel kimlik doğrulayıcınızı oluşturabilirsiniz.

Kimlik doğrulayıcı etkinliğinin ilk iki şartını (kimlik bilgisi toplama ve kimlik doğrulama) nasıl ele alacağınız tamamen size bağlıdır. (Bunu yapmanın tek bir yolu olsaydı, "özel" hesap türlerine gerek olmayacaktı.) Üçüncü şartın standart ve oldukça basit bir uygulaması vardır:

Kotlin

Account(username, your_account_type).also { account ->
    accountManager.addAccountExplicitly(account, password, null)
}

Java

final Account account = new Account(username, your_account_type);
accountManager.addAccountExplicitly(account, password, null);

Güvenlik konusunda akılcı olun!

AccountManager, bir şifreleme hizmeti veya anahtar zinciri değildir. Hesap kimlik bilgilerini siz geçiş yaparken düz metin olarak depolar. Çoğu cihazda bu durum belirli bir sorun teşkil etmez. Çünkü cihaz verileri yalnızca rootlanmış olan bir veritabanında depolar. Ancak root erişimli bir cihazda, kimlik bilgileri cihaza adb erişimi olan herkes tarafından okunabilir.

Bunu aklınızda bulundurarak kullanıcının gerçek şifresini AccountManager.addAccountExplicitly() hizmetine iletmemeniz gerekir. Bunun yerine, bir saldırganın kullanımı sınırlı olacak, kriptografik olarak güvenli bir jeton depolamalısınız. Kullanıcı kimlik bilgileriniz değerli bir şeyi koruyorsa benzer bir şey yapmayı dikkatlice düşünmelisiniz.

Unutmayın: Güvenlik kodu söz konusu olduğunda "Efsane Avcıları" kuralına uyun: Bunu evde denemeyin! Özel hesap kodu uygulamadan önce bir güvenlik uzmanına danışın.

Güvenlikle ilgili sorumluluk reddi beyanları ortadan kaldırıldığına göre artık işe geri dönme zamanı. Özel hesap kodunuzun etini zaten uyguladınız. Geriye kalan adım tesisattır.

Soyut Hesap Kimlik Doğrulayıcısını Genişlet

AccountManager öğesinin özel hesap kodunuzla çalışabilmesi için AccountManager uygulamasının beklediği arayüzleri uygulayan bir sınıfa ihtiyacınız vardır. Bu sınıf, kimlik doğrulayıcı sınıfıdır.

Kimlik doğrulayıcı sınıfı oluşturmanın en kolay yolu AbstractAccountAuthenticator alanını genişletmek ve soyut yöntemlerini uygulamaktır. Önceki dersler üzerinde çalıştıysanız AbstractAccountAuthenticator soyut yöntemleri size tanıdık gelecektir. Bu yöntemler, bir önceki derste hesap bilgilerini ve yetkilendirme jetonlarını almak için kullandığınız yöntemlerin tam tersidir.

Kimlik doğrulayıcı sınıfını doğru bir şekilde uygulamak için birkaç ayrı kod parçası gerekir. Öncelikle, AbstractAccountAuthenticator geçersiz kılmanız gereken yedi soyut yönteme sahiptir. İkinci olarak, uygulama manifestinize "android.accounts.AccountAuthenticator" için bir niyet filtresi eklemeniz gerekir (sonraki bölümde gösterilmiştir). Son olarak, diğer unsurların yanı sıra özel hesap türünüzün adını ve sistemin bu tür hesapların yanında göstereceği simgeyi tanımlayan iki XML kaynağı sağlamanız gerekir.

Başarılı bir kimlik doğrulayıcı sınıfı ve XML dosyalarını uygulamak için adım adım açıklamalı kılavuzu AbstractAccountAuthenticator dokümanlarında bulabilirsiniz.

Kimlik doğrulayıcı etkinliğiniz için özel başlatma parametreleri gerekiyorsa bunları Intent.putExtra() kullanarak amaca ekleyebilirsiniz.

Kimlik doğrulayıcı hizmet oluşturma

Artık bir kimlik doğrulayıcı sınıfınız olduğuna göre bu sınıfın yaşayabileceği bir yere ihtiyacınız vardır. Hesap kimlik doğrulayıcılarının birden fazla uygulamada kullanılabilmeleri ve arka planda çalışması gerekir. Bu nedenle, doğal olarak Service içinde çalıştırılmaları gerekir. Buna kimlik doğrulayıcı hizmeti diyoruz.

Kimlik doğrulayıcı hizmetiniz çok basit olabilir. Bunun için onCreate() bölgesinde kimlik doğrulayıcı sınıfınızın bir örneğini oluşturup onBind() bölgesinde getIBinder() yöntemini çağırmanız yeterli.

Manifest dosyanıza <service> etiketi eklemeyi ve AccountAuthenticator amacı için bir intent filtresi eklemeyi ve hesap kimlik doğrulayıcıyı belirtmeyi unutmayın:

<service ...>
   <intent-filter>
      <action android:name="android.accounts.AccountAuthenticator" />
   </intent-filter>
   <meta-data android:name="android.accounts.AccountAuthenticator"
             android:resource="@xml/authenticator" />
</service>

Hizmetinizi dağıtma

Hepsi bu kadar! Sistem artık "Google" ve "Kurumsal" gibi büyük hesap türlerinin yanı sıra hesap türünüzü de tanıyor. Bir hesap eklemek için Hesaplar ve Senkronizasyon Ayarları sayfasını kullanabilirsiniz. Özel türünüzde hesapları isteyen uygulamalar, diğer hesap türlerinde olduğu gibi numaralandırabilir ve kimlik doğrulaması yapabilir.

Elbette tüm bunlar, hesap hizmetinizin cihazda gerçekten yüklü olduğunu varsayar. Hizmete yalnızca tek bir uygulama erişecekse bu çok önemli değildir. Hizmeti uygulamada paket haline getirmeniz yeterlidir. Ancak hesap hizmetinizin birden fazla uygulama tarafından kullanılmasını istiyorsanız işler daha zor hale gelir. Hizmeti tüm uygulamalarınızla birlikte paket haline getirmek ve kullanıcının cihazında yer kaplayan birden fazla kopyasını bulundurmak istemezsiniz.

Çözümlerden biri, hizmeti küçük, özel amaçlı bir APK'ya yerleştirmektir. Bir uygulama, özel hesap türünüzü kullanmak istediğinde özel hesap hizmetinizin kullanılabilir olup olmadığını görmek için cihazı kontrol edebilir. Aksi takdirde, hizmeti indirmesi için kullanıcıyı Google Play'e yönlendirebilir. Bu ilk başta büyük bir sorun gibi görünebilir, ancak özel hesabınızı kullanan her uygulama için kimlik bilgilerini yeniden girme alternatifi ile karşılaştırıldığında, bu işlem son derece kolaydır.