SafetyNet reCAPTCHA API

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

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

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

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

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

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

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

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

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

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

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

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

  4. На открывшейся странице ваши открытый и закрытый ключи будут указаны в разделах Ключ сайта и Секретный ключ соответственно. Ключ сайта используется при отправке запроса на проверку, а секретный ключ – при проверке токена ответа пользователя.

Добавьте зависимость 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());
                    }
                }
        });
}

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

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

Чтобы узнать, как проверить токен ответа пользователя, ознакомьтесь с разделом Как подтверждать ответы пользователей.