Ich habe ein benutzerdefiniertes Ktor-Plugin erstellt, das die UUID aus dem sicheren Speicher lädt oder eine neue generiert und speichert, falls sie noch nicht existiert.
Code: Select all
@OptIn(ExperimentalUuidApi::class)
val DeviceIdPlugin = createClientPlugin("DeviceIdPlugin", ::DeviceIdConfig) {
val secureStorage = pluginConfig.secureStorage
val deviceIdProvider = Mutex()
var cachedDeviceId: String? = null
suspend fun getDeviceId(): String {
return cachedDeviceId ?: deviceIdProvider.withLock {
cachedDeviceId ?: secureStorage.load(SecureStorageKeys.DEVICE_UUID)?.also {
cachedDeviceId = it
} ?: Uuid.random().toString().also { newId ->
secureStorage.save(SecureStorageKeys.DEVICE_UUID, newId)
cachedDeviceId = newId
}
}
}
onRequest { request, _ ->
val deviceId = getDeviceId()
request.headers.append("X-Device-ID", deviceId)
}
}
class DeviceIdConfig {
lateinit var secureStorage: SecureStorage
}
interface SecureStorage {
suspend fun save(key: String, value: String): Boolean
suspend fun load(key: String): String?
}
Code: Select all
val httpModule = module {
single {
// Cache device info at HttpClient creation time (these don't change during app lifecycle)
val deviceModel = getDeviceModel()
val appVersion = getAppVersion()
val osVersion = getOsVersion()
HttpClient(CIO) {
install(DeviceIdPlugin) {
this.secureStorage = get()
}
install(DefaultRequest) {
contentType(ContentType.Application.Json)
header("X-Phone-Model", getDeviceModel())
header("X-App-Version", getAppVersion())
header("X-OS-Version", getOsVersion())
header("X-Timestamp", Clock.System.now().toEpochMilliseconds().toString())
}
}
}
}
- Ist dies eine korrekte und sichere Methode zum Generieren und Zwischenspeichern einer dauerhaften
Gerätekennung mithilfe eines Ktor-Plugins?
Mobile version