API SafetyNet reCAPTCHA

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

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

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

Дополнительные условия предоставления услуг

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

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

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

Зарегистрируйте пару ключей reCAPTCHA

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

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

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

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

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

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

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

Используйте API reCAPTCHA

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

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

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

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

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

Следующий фрагмент кода показывает, как вызвать этот метод:

Котлин

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. Вам все еще необходимо проверить токен ответа пользователя на вашем бэкэнд-сервере.

Чтобы узнать, как проверить токен ответа пользователя, см. раздел «Проверка ответа пользователя» .