1. Integrity API를 통해 Integrity Token 과 Access Token 발급을 요청한다.
2. Play 서버에 Integrity Token과 Access Token을 전달하여 복호화 및 검증을 요청한다.
3. 검증을 통과했다면 JSON 형태의 Response를 전달한다.
Standard Request 방식으로 Integrity API를 사용해서 Integrity Token을 생성합니다.
withContext(Dispatchers.IO) {
standardIntegrityManager.prepareIntegrityToken(
StandardIntegrityManager.PrepareIntegrityTokenRequest
.builder()
.setCloudProjectNumber(CLOUD_PROJECT_NUMBER)
.build()
)
.await()
.request(
StandardIntegrityTokenRequest.builder()
.setRequestHash(requestHash)
.build()
)
.await()
.token()
}
CLOUD_PROJECT_NUMBER
requestHash
Google에서 제공하는 API를 사용하려면 Access Token을 생성해야 합니다.
withContext(Dispatchers.IO) {
gcpInputStream.use {
val credentials = GoogleCredentials.fromStream(it)
.createScoped(listOf(INTEGRITY_SCOPE))
credentials.refreshIfExpired()
(credentials as? ServiceAccountCredentials)?.accessToken
?.tokenValue
.orEmpty()
}
}
gcpInputStream
INTEGRITY_SCOPE
https://www.googleapis.com/auth/playintegrity
Google API를 활용하여 Token을 복호화 및 검증합니다.
@POST("v1/${패키지명}:decodeIntegrityToken")
suspend fun decodeToken(
@Header("Authorization") accessToken: String,
@Body request: IntegrityRequest
): IntegrityResponse
@Serializable
data class IntegrityRequest(
@SerialName("integrity_token")
val token: String
)
integrityAPI.decodeToken(
accessToken = "Bearer $accessToken",
request = IntegrityRequest(token = integrityToken)
)
패키지명
에는 앱의 패키지명을 기입합니다.v1/com.beok.runewords:decodeIntegrityToken
if (response.tokenPayloadExternal.requestDetails.requestHash != requestHash)
play integrity api 관련 찾고있는 와중에 포스팅 정말 유용하게 봤습니다! 혹시 실례가 안된다면 코드 전문을 볼 수 있는 곳이 있을까요?