Я хочу использовать 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)
работает нормально, но он устарел, поэтому я не хочу его использовать.
null
вместо фактического ключа API в качестве аргумента. Я думаю, что кто-то ответил/прокомментировал его ранее, но я его больше не вижу. Не спрашивайте, однако, почему это работает, в то время как правильный ключ API дает ошибку... - person Gergely Kőrössy   schedule 25.08.2017null
. - person Gergely Kőrössy   schedule 28.10.2017