Приложение Флип для Android

При связывании App Flip на основе OAuth (App Flip) ваше приложение Android вставляется в процесс связывания аккаунтов Google. Традиционный процесс связывания учетных записей требует, чтобы пользователь ввел свои учетные данные в браузере. Использование App Flip откладывает вход пользователя в ваше приложение Android, что позволяет использовать существующие авторизации. Если пользователь вошел в ваше приложение, ему не нужно повторно вводить свои учетные данные, чтобы связать свою учетную запись. Для реализации App Flip в вашем приложении Android требуется минимальное количество изменений кода.

Из этого документа вы узнаете, как изменить приложение Android для поддержки App Flip.

Попробуйте образец

App Флип связи образца приложения демонстрирует Флип-совместимого аккаунт App связывающих интеграций на Android. Вы можете использовать это приложение, чтобы проверить, как реагировать на входящее намерение App Flip от мобильных приложений Google.

Образец приложения предварительно настроен для интеграции с App Флип инструмент тестирования для Android , который можно использовать для проверки интеграции вашего Android приложения с App Флип перед настройкой учетной записи связь с Google. Это приложение имитирует намерение, запускаемое мобильными приложениями Google, когда включен App Flip.

Как это работает

Для выполнения интеграции App Flip необходимо выполнить следующие шаги:

  1. Проверяет приложение Google , если ваше приложение установлено на устройстве , используя его имя пакета.
  2. Приложение Google использует проверку подписи пакета, чтобы убедиться, что установленное приложение является правильным.
  3. Приложение Google создает намерение начать определенное действие в вашем приложении. Это намерение включает дополнительные данные, необходимые для связывания. Он также проверяет, поддерживает ли ваше приложение App Flip, разрешая это намерение через платформу Android.
  4. Ваше приложение проверяет, что запрос исходит от приложения Google. Для этого ваше приложение проверяет подпись пакета и предоставленный идентификатор клиента.
  5. Ваше приложение запрашивает код авторизации с вашего сервера OAuth 2.0. В конце этого потока он возвращает приложению Google либо код авторизации, либо ошибку.
  6. Приложение Google получает результат и продолжает связывание учетной записи. Если предоставляется код авторизации, обмен токенами происходит от сервера к серверу, так же, как это происходит в потоке связывания OAuth на основе браузера.

Измените свое приложение Android для поддержки App Flip

Для поддержки App Flip внесите следующие изменения кода в свое приложение Android:

  1. Добавить <intent-filter> к вашему AndroidManifest.xml файл со строкой действий , который соответствует значению, указанному в Флип Intent поле App.

    <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>
    
  2. Проверьте подпись вызывающего приложения.

    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
    }
    
  3. Извлеките идентификатор клиента из параметров намерения и убедитесь, что идентификатор клиента соответствует ожидаемому значению.

    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...
        }
    }
    
  4. После успешной авторизации верните полученный код авторизации обратно в Google.

    // Successful result
    val data = Intent().apply {
        putExtra("AUTHORIZATION_CODE", authCode)
    }
    setResult(Activity.RESULT_OK, data)
    finish()
    
  5. Если произошла ошибка, вместо этого верните результат ошибки.

    // Error result
    val error = Intent().apply {
        putExtra("ERROR_TYPE", 1)
        putExtra("ERROR_CODE", 1)
        putExtra("ERROR_DESCRIPTION", "Invalid Request")
    }
    setResult(-2, error)
    finish()
    

Содержание намерения запуска

Намерение Android, запускающее ваше приложение, включает следующие поля:

  • CLIENT_ID ( String ): Google client_id зарегистрирован под вашим приложением.
  • SCOPE ( String[] ): список областей запрошенных.
  • REDIRECT_URI ( String ): Перенаправление URL.

Содержание данных ответа

Данные , возвращаемые в приложение Google устанавливается в приложении по телефону setResult() . Эти данные включают следующее:

  • AUTHORIZATION_CODE ( String ): Значение кода авторизации.
  • resultCode ( int ): Общается успех или провал процесса и принимает одно из следующих значений:
    • Activity.RESULT_OK : Указывает успех; возвращается код авторизации.
    • Activity.RESULT_CANCELLED : Сигналы о том , что пользователь отменил процесс. В этом случае приложение Google попытается установить связь с аккаунтом, используя ваш URL-адрес авторизации.
    • -2 : Указывает , что произошла ошибка. Ниже описаны различные типы ошибок.
  • ERROR_TYPE ( int ): тип ошибки, который принимает одно из следующих значений:
    • 1 : Извлекаемые ошибка: Google приложение будет пытаться счет связывания с использованием URL авторизации.
    • 2 : неустранимая ошибка: приложение ликвидирует Google счета ссылок.
    • 3 : Invalid или отсутствующие параметры запроса.
  • ERROR_CODE ( int ): целое число , представляющее характер ошибки. Для того, чтобы увидеть , что каждое средство код ошибки, обратитесь к таблице кодов ошибок .
  • ERROR_DESCRIPTION ( String , опционально): удобочитаемое статусное сообщение с описанием ошибки.

Значение для AUTHORIZATION_CODE , как ожидается , когда resultCode == Activity.RESULT_OK . Во всех остальных случаях значение для AUTHORIZATION_CODE должно быть пустым. Если resultCode == -2 , то ERROR_TYPE значение , как ожидается, будут заполнены.

Таблица кодов ошибок

В приведенной ниже таблице показаны различные коды ошибок и показаны ли они исправимой или неустранимой ошибкой:

Код ошибки Значение Восстанавливаемый Безвозвратно
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

Для всех кодов ошибок, вы должны вернуть результат ошибки через setResult , чтобы обеспечить соответствующий запасной вариант является trigerred.