API аттестации Google Safety Net не отвечает на эмуляторы
Мы пытаемся добавить API безопасности в наше приложение. Когда мы тестируем на реальных устройствах, все работает нормально, однако при тестировании на эмуляторах нет ответа от серверов безопасности. Целью API является обнаружение эмулируемых устройств, поэтому не знаю, почему он не работает на эмуляторе.
Ниже приведен вызов API:
SafetyNet.getClient(activity).attest(getRequestNonce(nonceData), "<Key-here>").addOnSuccessListener(activity, new OnSuccessListener() {
public void onSuccess(AttestationResponse response) {
String[] jwtParts = response.getJwsResult().split("\\.");
if(jwtParts.length == 3) {
String sharedpreferences = new String(Base64.decode(jwtParts[1], 0));
SharedPreferences editor = context.getSharedPreferences("DecodedPayload", 0);
Editor editor1 = editor.edit();
editor1.putString("decodedPayload", sharedpreferences);
editor1.commit();
Log.d("ContentValues", "The Safety net response is: " + sharedpreferences);
} else {
SharedPreferences sharedpreferences1 = context.getSharedPreferences("DecodedPayload", 0);
Editor editor2 = sharedpreferences1.edit();
editor2.putString("decodedPayload", "CND");
editor2.commit();
Log.d("ContentValues", "The safety net response could not be decoded");
}
}
}).addOnFailureListener(activity, new OnFailureListener() {
public void onFailure(@NonNull Exception e) {
if(e instanceof ApiException) {
ApiException apiException = (ApiException)e;
Log.d("ContentValues", "Error while fetching safety net result: " + ((ApiException)e).getStatusCode() + " " + ((ApiException)e).getStatusMessage());
SharedPreferences sharedpreferences = context.getSharedPreferences("DecodedPayload", 0);
Editor editor = sharedpreferences.edit();
editor.putString("decodedPayload", "ERR");
editor.commit();
Log.d("ContentValues", "The safety net response could not be decoded");
} else {
Log.d("ContentValues", "Unknown Error while fetching safety net results: " + e.getMessage());
}
}
});
}
Ни один из обработчиков не получает ответ даже после ожидания в течение 30 секунд. Может кто-нибудь, пожалуйста, помогите.
2 ответа
Скорее всего, на вашем эмуляторе не установлены службы Google Play. Поскольку Службы Google Play отвечают за реализацию Аттестации, Аттестация просто не будет работать на устройстве без Служб Google Play.
При использовании Аттестации или любого другого API Сервисов Google Play вы должны убедиться, что Сервисы Google Play установлены и соответствуют той версии, которая вам нужна (в оптимальном случае вы должны убедиться, что это последняя версия).
Исторически официальные изображения AVD не включали Сервисы Google Play, и вы могли технически загружать их. Однако примерно в апреле 2017 года появились официальные изображения AVD, включающие Play Store (а вместе с ним и Google Play Services).
Это поздний ответ, но, возможно, кому-то понадобится в будущем. Попробуйте использовать разных слушателей, поставляемых с SafetyNet, все полные и успешные слушатели не отвечают, несмотря на то, что SafetyNet возвращает успех. Также вы можете проверить API-вызовы и их успешность, ситуации с ошибками из Google Cloud Platform на панели инструментов API проверки устройств Android.
SafetyNet.getClient(this).attest(generateOneTimeRequestNonce(), "API_KEY")
.addOnFailureListener { e ->
Log.i(TAG, "SafetyNet callback fail")
}
.addOnSuccessListener { resp ->
Log.i(TAG, "SafetyNet callback success")
val response = parseJsonWebSignature(resp.jwsResult)!!
when {
response.isCtsProfileMatch -> {
//profile of the device running your app matches the profile of a device that has passed Android compatibility testing.
}
response.isBasicIntegrity -> {
//then the device running your app likely wasn't tampered with, but the device has not necessarily passed Android compatibility testing.
}
else -> {
//handle fail, maybe warn user device is unsupported or in compromised state? (this is up to you!)
}
}
}