OAuth tabanlı Uygulama Çevirme bağlantısı (Uygulama Çevirme), Android uygulamanızı Google Hesabı Bağlantısı akışına ekler. Geleneksel bir hesap bağlama akışı, kullanıcının tarayıcıya kimlik bilgilerini girmesini gerektirir. App Flip kullanımı, Android uygulamanızda kullanıcının oturum açmasını erteler ve bu, mevcut yetkilendirmelerden yararlanmanıza olanak tanır. Kullanıcı uygulamanızda oturum açtıysa hesabını bağlamak için kimlik bilgilerini yeniden girmesi gerekmez. Android uygulamanızda App Flip'i uygulamak için minimum miktarda kod değişikliği gerekir.
Bu belgede, Android uygulamanızı App Flip'i destekleyecek şekilde nasıl değiştireceğinizi öğreneceksiniz.
Örneği deneyin
Bağlama Uygulama Kapak örnek uygulamayı Android'de entegrasyon bağlayan bir App Ayaklı uyumlu bir hesap gösterir. Google mobil uygulamalarından gelen bir Uygulama Çevirme amacına nasıl yanıt verileceğini doğrulamak için bu uygulamayı kullanabilirsiniz.
Örnek uygulaması ile entegre şekilde önceden Android için uygulama çevirin Testi Aracı size yapılandırmak Google ile bağlantı hesabı önce App Flip ile Android uygulamanın entegrasyonunu doğrulamak için kullanabileceğiniz. Bu uygulama, Uygulama Çevirme etkinleştirildiğinde Google mobil uygulamaları tarafından tetiklenen amacı simüle eder.
Nasıl çalışır
Bir Uygulama Çevirme entegrasyonu gerçekleştirmek için aşağıdaki adımlar gereklidir:
- Google uygulaması kontrolleri uygulamanızın kendi paket adı kullanarak cihazda yüklü olup olmadığını.
- Google uygulaması, yüklenen uygulamanın doğru uygulama olduğunu doğrulamak için bir paket imza kontrolü kullanır.
- Google uygulaması, uygulamanızda belirlenmiş bir etkinliği başlatmak için bir amaç oluşturur. Bu amaç, bağlantı için gereken ek verileri içerir. Ayrıca, bu amacı Android çerçevesi aracılığıyla çözerek uygulamanızın App Flip'i destekleyip desteklemediğini kontrol eder.
- Uygulamanız, isteğin Google uygulamasından geldiğini doğrular. Bunu yapmak için uygulamanız paket imzasını ve sağlanan müşteri kimliğini kontrol eder.
- Uygulamanız, OAuth 2.0 sunucunuzdan bir yetkilendirme kodu ister. Bu akışın sonunda, Google uygulamasına bir yetkilendirme kodu veya bir hata döndürür.
- Google uygulaması sonucu alır ve hesap bağlama işlemine devam eder. Bir yetkilendirme kodu sağlanırsa, belirteç değişimi, tarayıcı tabanlı OAuth bağlantı akışında olduğu gibi sunucudan sunucuya gerçekleşir.
Android uygulamanızı App Flip'i destekleyecek şekilde değiştirin
App Flip'i desteklemek için Android uygulamanızda aşağıdaki kod değişikliklerini yapın:
Bir ekleme
<intent-filter>
sizin içinAndroidManifest.xml
App Ayaklı Niyet alanına girilen değerle eşleşen bir eylem dize ile dosyaya.<activity android:name="AuthActivity"> <!-- Handle the app flip intent --> <intent-filter> <action android:name="INTENT_ACTION_FROM_CONSOLE"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </activity>
Çağıran uygulamanın imzasını doğrulayın.
private fun verifyFingerprint( expectedPackage: String, expectedFingerprint: String, algorithm: String ): Boolean { callingActivity?.packageName?.let { if (expectedPackage == it) { val packageInfo = packageManager.getPackageInfo(it, PackageManager.GET_SIGNATURES) val signatures = packageInfo.signatures val input = ByteArrayInputStream(signatures[0].toByteArray()) val certificateFactory = CertificateFactory.getInstance("X509") val certificate = certificateFactory.generateCertificate(input) as X509Certificate val md = MessageDigest.getInstance(algorithm) val publicKey = md.digest(certificate.encoded) val fingerprint = publicKey.joinToString(":") { "%02X".format(it) } return (expectedFingerprint == fingerprint) } } return false }
İstemci kimliğini amaç parametrelerinden çıkarın ve istemci kimliğinin beklenen değerle eşleştiğini doğrulayın.
private const val EXPECTED_CLIENT = "<client-id-from-actions-console>" private const val EXPECTED_PACKAGE = "<google-app-package-name>" private const val EXPECTED_FINGERPRINT = "<google-app-signature>" private const val ALGORITHM = "SHA-256" ... override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val clientId = intent.getStringExtra("CLIENT_ID") if (clientId == EXPECTED_CLIENT && verifyFingerprint(EXPECTED_PACKAGE, EXPECTED_FINGERPRINT, ALGORITHM)) { // ...authorize the user... } }
Başarılı yetkilendirmenin ardından, ortaya çıkan yetkilendirme kodunu Google'a geri gönderin.
// Successful result val data = Intent().apply { putExtra("AUTHORIZATION_CODE", authCode) } setResult(Activity.RESULT_OK, data) finish()
Bir hata oluştuysa, bunun yerine bir hata sonucu döndürün.
// Error result val error = Intent().apply { putExtra("ERROR_TYPE", 1) putExtra("ERROR_CODE", 1) putExtra("ERROR_DESCRIPTION", "Invalid Request") } setResult(-2, error) finish()
Lansman amacının içeriği
Uygulamanızı başlatan Android amacı aşağıdaki alanları içerir:
-
CLIENT_ID
(String
): Googleclient_id
uygulamanızda altında kayıtlı. -
SCOPE
(String[]
): İstenen kapsamları bir listesi. -
REDIRECT_URI
(String
): yönlendirme URL.
Yanıt verilerinin içeriği
Google uygulamasına döndü veriler arayarak uygulamanızda ayarlanır setResult()
. Bu veriler şunları içerir:
-
AUTHORIZATION_CODE
(String
): yetki kodu değer. -
resultCode
(int
) iletişim kurar işleminin başarılı olup aşağıdaki değerlerden birini alır:-
Activity.RESULT_OK
: başarısını gösterir; bir yetkilendirme kodu döndürülür. -
Activity.RESULT_CANCELLED
: Kullanıcı işlemini iptal etti Sinyaller söyledi. Bu durumda, Google uygulaması, yetkilendirme URL'nizi kullanarak hesap bağlamayı dener. -
-2
: bir hata meydana geldiğini gösterir. Farklı hata türleri aşağıda açıklanmıştır.
-
-
ERROR_TYPE
(int
) hatanın tipi, aşağıdaki değerlerden birini alır:-
1
: kurtarılabilir hata: Google uygulama yetkilendirme URL kullanarak bağlama hesabını dener. -
2
: Kurtarılamaz hata: Google uygulama düşükle sonlanması bağlayan hesap. -
3
: Geçersiz veya eksik istek parametreleri.
-
-
ERROR_CODE
(int
): Hatanın doğasını gösteren bir tamsayıdır. Her hata kodu araçları dediğimiz görmek için hata kodlarının masaya . ERROR_DESCRIPTION
(String
, isteğe bağlı): hatasını açıklayan İnsan tarafından okunabilir bir durum mesajı.
İçin bir değer AUTHORIZATION_CODE
alınması bekleniyor resultCode == Activity.RESULT_OK
. Diğer tüm durumlarda, değeri AUTHORIZATION_CODE
boş olması gerekir. Eğer resultCode == -2
, daha sonra ERROR_TYPE
değeri doldurulması öngörülmektedir.
Hata kodları tablosu
Aşağıdaki tablo, farklı hata kodlarını ve her birinin kurtarılabilir veya kurtarılamaz bir hata olup olmadığını gösterir:
Hata kodu | Anlam | kurtarılabilir | kurtarılamaz |
---|---|---|---|
1 | INVALID_REQUEST | ✔ | |
2 | NO_INTERNET_CONNECTION | ✔ | |
3 | OFFLINE_MODE_ACTIVE | ✔ | |
4 | CONNECTION_TIMEOUT | ✔ | |
5 | INTERNAL_ERROR | ✔ | |
6 | AUTHENTICATION_SERVICE_UNAVAILABLE | ✔ | |
8 | CLIENT_VERIFICATION_FAILED | ✔ | |
9 | INVALID_CLIENT | ✔ | |
10 | INVALID_APP_ID | ✔ | |
11 | INVALID_REQUEST | ✔ | |
12 | AUTHENTICATION_SERVICE_UNKNOWN_ERROR | ✔ | |
13 | AUTHENTICATION_DENIED_BY_USER | ✔ | |
14 | CANCELLED_BY_USER | ✔ | |
15 | FAILURE_OTHER | ✔ | |
16 | USER_AUTHENTICATION_FAILED | ✔ |
Tüm hata kodları için aşağıdaki aracılığıyla hata sonucu dönmelidir setResult
uygun yedek trigerred sağlamak için.