SafetyNet reCAPTCHA API

В SafetyNet входит reCAPTCHA API, который позволяет защитить приложение от вредоносного трафика.

reCAPTCHA – это бесплатный сервис, который использует усовершенствованный механизм анализа рисков, чтобы защитить ваше приложение от спама и других злоупотреблений. Если у сервиса есть подозрения, что с приложением взаимодействует не человек, а бот, он показывает проверочный код, который нужно ввести, чтобы приложение продолжило работу.

В этом документе рассказывается, как интегрировать API reCAPTCHA из SafetyNet в приложение.

Дополнительные условия использования

Получая доступ к reCAPTCHA API или используя его, вы принимаете Условия использования API Google и приведенные ниже Условия использования reCAPTCHA. Прежде чем начать работу с API, внимательно прочитайте все применимые условия и правила.

Условия использования reCAPTCHA

Вы соглашаетесь с тем, что работа reCAPTCHA API предполагает сбор данных об аппаратном и программном обеспечении (например, об устройстве и приложениях) и результатов проверок целостности, а также отправку их в Google для анализа, и подтверждаете, что понимаете это. В соответствии с разделом 3(d) Условий использования API Google вы соглашаетесь с тем, что при использовании этих API вы обязаны предоставлять посетителям все необходимые уведомления, касающиеся сбора данных и их отправки в Google, а также получать их согласие на эти операции.

Как зарегистрировать пару ключей reCAPTCHA

Чтобы зарегистрировать пару ключей для использования с SafetyNet reCAPTCHA API, перейдите на сайт регистрации reCAPTCHA для Android и выполните следующие действия:

  1. В открывшейся форме укажите следующую информацию:

    • Ярлык. Уникальный ярлык для ключа. Обычно это название компании или организации.
    • Тип reCAPTCHA. Выберите reCAPTCHA v2, а затем reCAPTCHA Android.
    • Пакеты. Укажите название пакета каждого приложения, которое использует этот ключ API. Чтобы приложение могло использовать API, название пакета, которое вы вводите, должно точно совпадать с названием пакета приложения. Каждое название пакета нужно указывать в отдельной строке.
    • Владельцы. Добавьте адреса электронной почты всех сотрудников организации, которые отслеживают оценки reCAPTCHA для вашего приложения.
  2. Установите флажок Принять Условия использования reCAPTCHA.

  3. Отправлять оповещения владельцам. Установите этот флажок, если хотите получать электронные письма о reCAPTCHA API, а затем нажмите Отправить.

  4. На следующей странице вы увидите открытый и закрытый ключи в разделах Site key (Ключ сайта) и Secret key (Секретный ключ) соответственно. Ключ сайта используется при отправке запроса на проверку, а секретный ключ – при проверке токена ответа пользователя.

Добавьте зависимость SafetyNet API

Прежде чем использовать reCAPTCHA API, добавьте в проект SafetyNet API. Если вы используете Android Studio, добавьте эту зависимость в файл Gradle на уровне приложения. Подробнее о настройке SafetyNet API…

Как использовать reCAPTCHA API

В этом разделе описывается, как вызвать reCAPTCHA API, чтобы отправить запрос на проверку CAPTCHA и получить токен ответа пользователя.

Отправьте запрос на подтверждение

Чтобы вызвать SafetyNet reCAPTCHA API, используйте метод verifyWithRecaptcha(). Обычно этот метод соответствует выбору пользователем элемента пользовательского интерфейса, например кнопки, в вашем действии.

При использовании метода verifyWithRecaptcha() в приложении необходимо сделать следующее:

  • Передайте ключ сайта API в качестве параметра.
  • Переопределите методы onSuccess() и onFailure(), чтобы обработать оба возможных результата запроса на проверку. В частности, если API передает экземпляр ApiException в onFailure(), вам нужно обработать каждый возможный код статуса, который можно получить с помощью getStatusCode().

В приведенном ниже фрагменте кода показано, как вызвать этот метод.

Kotlin

fun onClick(view: View) {
    SafetyNet.getClient(this).verifyWithRecaptcha(YOUR_API_SITE_KEY)
            .addOnSuccessListener(this as Executor, OnSuccessListener { response ->
                // Indicates communication with reCAPTCHA service was
                // successful.
                val userResponseToken = response.tokenResult
                if (response.tokenResult?.isNotEmpty() == true) {
                    // Validate the user response token using the
                    // reCAPTCHA siteverify API.
                }
            })
            .addOnFailureListener(this as Executor, OnFailureListener { e ->
                if (e is ApiException) {
                    // An error occurred when communicating with the
                    // reCAPTCHA service. Refer to the status code to
                    // handle the error appropriately.
                    Log.d(TAG, "Error: ${CommonStatusCodes.getStatusCodeString(e.statusCode)}")
                } else {
                    // A different, unknown type of error occurred.
                    Log.d(TAG, "Error: ${e.message}")
                }
            })
}

Java

public void onClick(View v) {
    SafetyNet.getClient(this).verifyWithRecaptcha(YOUR_API_SITE_KEY)
        .addOnSuccessListener((Executor) this,
            new OnSuccessListener<SafetyNetApi.RecaptchaTokenResponse>() {
                @Override
                public void onSuccess(SafetyNetApi.RecaptchaTokenResponse response) {
                    // Indicates communication with reCAPTCHA service was
                    // successful.
                    String userResponseToken = response.getTokenResult();
                    if (!userResponseToken.isEmpty()) {
                        // Validate the user response token using the
                        // reCAPTCHA siteverify API.
                    }
                }
        })
        .addOnFailureListener((Executor) this, new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    if (e instanceof ApiException) {
                        // An error occurred when communicating with the
                        // reCAPTCHA service. Refer to the status code to
                        // handle the error appropriately.
                        ApiException apiException = (ApiException) e;
                        int statusCode = apiException.getStatusCode();
                        Log.d(TAG, "Error: " + CommonStatusCodes
                                .getStatusCodeString(statusCode));
                    } else {
                        // A different, unknown type of error occurred.
                        Log.d(TAG, "Error: " + e.getMessage());
                    }
                }
        });
}

Проверка токена ответа пользователя

Когда reCAPTCHA API выполняет метод onSuccess(), это означает, что пользователь успешно прошел проверку. Однако этот метод только указывает, что пользователь правильно решил CAPTCHA. Вам по-прежнему нужно будет проверять токен ответа пользователя на своем внутреннем сервере.

Подробнее о том, как подтверждать ответы пользователей…