Это типичный ответ JSON, который вы получите после выполнения safetyNetClient.attest(nonce, apiKey)
:
{
"jwsResult": "foo.bar.zar",
"uid": "11426643",
"authCode": "H3o28i\/ViJUPRAW\/q4IUe1AMAbD-2jYp82os9v",
"app": 1,
"androidId": "vece15a43449afa9"
}
Здесь foo.bar.zar
- это строка в кодировке base64, что-то вроде aisnfaksdf.8439hundf.ghbadsjn
, где каждая часть соответствует:
<Base64 encoded header>.<Base64 encoded JSON data>.<Base64 encoded signature>
Вам нужно взять bar
и Base64 декодировать, чтобы получить Safet yNet результат JSON:
private fun extractJwsData(jws: String?): ByteArray? {
val parts = jws?.split("[.]".toRegex())?.dropLastWhile { it.isEmpty() }?.toTypedArray()
if (parts?.size != 3) {
System.err.println("Failure: Illegal JWS signature format. The JWS consists of "
+ parts?.size + " parts instead of 3.")
return null
}
return Base64.decode(parts[1], Base64.DEFAULT)
}
Затем построить java, используя понравившуюся библиотеку JSON, например GSON:
val model = Gson().fromJson(extractJwsData(jws).toString(), SafetyNetApiModel::class.java)
Где SafetyNetApiModel
это:
class SafetyNetApiModel {
@SerializedName("nonce")
var nonce: String? = null
@SerializedName("timestampMs")
var timestampMs: Long? = null
@SerializedName("apkPackageName")
var apkPackageName: String? = null
@SerializedName("apkCertificateDigestSha256")
var apkCertificateDigestSha256: List<String>? = null
@SerializedName("apkDigestSha256")
var apkDigestSha256: String? = null
@SerializedName("ctsProfileMatch")
var ctsProfileMatch: Boolean? = null
@SerializedName("basicIntegrity")
var basicIntegrity: Boolean? = null
}
Посмотрите на this для справки.