API SafetyNet reCAPTCHA

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

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

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

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

Получая доступ к reCAPTCHA API или используя его, вы соглашаетесь с Условиями обслуживания Google API и следующими Условиями обслуживания 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. На следующей странице ваши открытый и закрытый ключи появятся в разделе «Ключ сайта» и «Секретный ключ» соответственно. Вы используете ключ сайта при отправке запроса на проверку , а секретный ключ — при проверке токена ответа пользователя .

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

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

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

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

Отправить запрос на проверку

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

При использовании метода 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}")
                }
            })
}

Ява

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

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