Ключ API лежит в коде и в истории git
Что не так. Ключ погодного сервиса записан значением по умолчанию в интерфейсе Retrofit и попал в коммиты.
Почему это важно. Поиск секретов в репозитории — одна из первых проверок. Удаление строки не поможет: ключ останется в истории и его можно достать.
interface WeatherApi {
@GET("forecast")
suspend fun forecast(
@Query("q") city: String,
@Query("appid") key: String = "3f9a1c7e5b2d4f6a8c0e1b3d5f7a9c2e",
): ForecastDto
}Как исправить. Отзовите этот ключ в кабинете сервиса и получите новый. Новый положите в local.properties (он уже в .gitignore), передайте через BuildConfig и добавляйте к запросам интерцептором:
val localProps = Properties().apply {
rootProject.file("local.properties").takeIf { it.exists() }?.inputStream()?.use(::load)
}
android {
buildFeatures { buildConfig = true }
defaultConfig {
buildConfigField("String", "WEATHER_API_KEY", "\"${localProps.getProperty("weather.apiKey", "")}\"")
}
}class ApiKeyInterceptor @Inject constructor() : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val url = chain.request().url.newBuilder()
.addQueryParameter("appid", BuildConfig.WEATHER_API_KEY)
.build()
return chain.proceed(chain.request().newBuilder().url(url).build())
}
}Из собранного APK ключ всё равно можно извлечь. Для тестового этого достаточно, но одна строка в README «в продакшене запросы шли бы через свой бэкенд» покажет, что вы это понимаете.