我想使用SafetyNet Attestation API(介意这个文档似乎已经过时,因为它使用的方法已被弃用)。使用最新版本的Play服务(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
的{{1}}中调用。无论我尝试了什么,它都会导致失败,onCreate(...)
是e
的实例,但它没有提供有关错误的有用信息,因为状态消息为ApiException
且状态为代码是8,根据the documentation - 是一个“内部错误”。我试着用5秒的延迟来调用它,但没有成功。测试设备具有API 24和Google Play服务11.0.55。
任何人都知道出了什么问题以及解决方案是什么?
修改:旧null
方式似乎工作正常,但已弃用,所以我不想使用它。
答案 0 :(得分:0)
根据此thread,如果您收到错误代码8(INTERNAL_ERROR
),请在开发者控制台中仔细检查您的应用注册。请注意,每个注册的Android客户端都由(包名称,Android签名证书SHA-1)对唯一标识。如果您的调试和生产环境有多个软件包名称/签名证书,请确保注册每对软件包名称/签名证书。
验证:
- 打开Credentials page并选择您的项目
- 确保每对都有 Android 类型的OAuth 2.0客户端ID。要为Android客户端创建新的OAuth 2.0客户端ID,请从下拉列表中选择新凭据 - > OAuth2客户端ID ,然后选择Android并在其中输入您的包名称/签名证书指纹。
醇>
如果不起作用,我建议您与Google Play团队联系以获取帮助。您可以通过以下链接与他们联系:https://support.google.com/googleplay#topic=3364260&contact=1。
答案 1 :(得分:0)
确保在以下代码中使用正确的WEB API KEY:
SafetyNet.getClient(this)
.attest(nonce, WEB_API_KEY)......
请参阅以下图片以查找WEB API KEY: FCM Console
答案 2 :(得分:0)
我使用safetynet建议您将程序与以下各项匹配: github SaftyNetHelper
需求/依赖项