Аттестация SafetyNet завершилась неудачно из-за внутренней ошибки

Я хочу использовать API SafetyNet Attestation (помните, что эта документация кажется устаревшим, так как методы, которые он использует, устарели). Используя последнюю версию Play Services (11.0.1), я придумал следующий код:

SecureRandom secureRandom = new SecureRandom();
byte[] nonce = new byte[16];
secureRandom.nextBytes(nonce); // just some random bytes for testing

SafetyNet.getClient(this)
    .attest(nonce, API_KEY)
    .addOnCompleteListener(this, task -> {
        if (task.isSuccessful()) {
            SafetyNetApi.AttestationResponse result = task.getResult();
            String jws = result.getJwsResult();
            Log.d(TAG, "JWS: " + jws);
        } else {
            Exception e = task.getException();

            if (e instanceof ApiException) {
                Log.e(TAG, "Attestation failure: " + ((ApiException) e).getStatusMessage() + ", code: " + ((ApiException) e).getStatusCode(), e);
            } else {
                Log.e(TAG, "Attestation failure: " + e, e);
            }
        }
    });

где API_KEY — это ключ API из консоли разработчика Google. Этот код вызывается в Activity onCreate(...). Что бы я ни пытался, это приводит к сбою, и e является экземпляром ApiException, но он не предоставляет никакой полезной информации о том, что пошло не так, поскольку сообщение о состоянии — null, а код состояния — 8, что, согласно документация - это "внутренняя ошибка ". Я пытался вызвать это с 5-секундной задержкой, но безуспешно. Тестовое устройство имеет API 24 и сервисы Google Play 11.0.55.

Кто-нибудь знает, что идет не так и какое решение для этого?


Изменить: старый способ SafetyNet.SafetyNetApi.attest(googleApiClient, nonce) работает нормально, но он устарел, поэтому я не хочу его использовать.


person Gergely Kőrössy    schedule 16.06.2017    source источник
comment
Вы решили это? У меня возникает та же проблема, если я включаю ключевые ограничения, хотя другие функции работают нормально с теми же ограничениями.   -  person Jonah H.    schedule 25.08.2017
comment
@jhirsch Да, просто передайте null вместо фактического ключа API в качестве аргумента. Я думаю, что кто-то ответил/прокомментировал его ранее, но я его больше не вижу. Не спрашивайте, однако, почему это работает, в то время как правильный ключ API дает ошибку...   -  person Gergely Kőrössy    schedule 25.08.2017
comment
@ GergelyKőrössy, вам удалось решить эту проблему с помощью ключа API?   -  person Vamsi Challa    schedule 28.10.2017
comment
Нет, вместо этого я просто использую null.   -  person Gergely Kőrössy    schedule 28.10.2017


Ответы (2)


На основании этой потока, если вы получаете код ошибки 8 (INTERNAL_ERROR), дважды проверьте регистрацию своего приложения в консоли разработчика. Обратите внимание, что каждый зарегистрированный клиент Android однозначно идентифицируется парой (имя пакета, сертификат подписи Android SHA-1). Если у вас есть несколько имен пакетов/сертификатов подписи для среды отладки и рабочей среды, обязательно зарегистрируйте каждую пару из них.

Проверять:

  1. Откройте страницу учетных данных и выберите свой проект.
  2. Убедитесь, что каждая пара имеет идентификаторы клиентов OAuth 2.0, типизированные для Android. Чтобы создать новый идентификатор клиента OAuth 2.0 для вашего клиента Android, выберите Новые учетные данные->Идентификатор клиента OAuth2 в раскрывающемся списке, выберите Android и введите имя пакета / отпечаток сертификата подписи.

Если это не сработает, я рекомендую вам обратиться за помощью к команде Google Play. Вы можете найти их по этой ссылке здесь: https://support.google.com/googleplay#topic=3364260&contact=1.

person abielita    schedule 18.06.2017
comment
Устаревший метод работает нормально, так что это явно не проблема ключа API. (Также обратите внимание, что в этом случае вам нужен не ключ OAuth, потому что пользовательские данные не задействованы.) - person Gergely Kőrössy; 18.06.2017

Убедитесь, что вы используете правильный КЛЮЧ WEB API в следующем коде:

SafetyNet.getClient(this)
    .attest(nonce, WEB_API_KEY)......

См. следующее изображение, чтобы найти КЛЮЧ WEB API: Консоль FCM

person Milap Patadia    schedule 15.11.2017