我想使用SafetyNet Attestation API(请注意,该文档似乎已过时,因为它使用的方法已被弃用)。使用最新版本的 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
Google Developer Console 中的 API 密钥在哪里。Activity
此代码在's中调用onCreate(...)
。无论我尝试什么,它都会导致失败,并且e
是 的一个实例ApiException
,但它没有提供任何有用的信息来说明发生了什么问题,因为状态消息是null
并且状态代码是 8,根据文档,它是“内部错误”。我试图以 5 秒的延迟调用它,但没有成功。测试设备具有 API 24 和 Google Play 服务 11.0.55。
任何人都知道出了什么问题以及解决方案是什么?
编辑:旧SafetyNet.SafetyNetApi.attest(googleApiClient, nonce)
方法似乎工作正常,但它已被弃用,所以我不想使用它。