如何在Kotlin/JS(Kotlin多平台)中获取local.properties内的API Key?
在Kotlin/JS(Kotlin多平台)中获取API Key的方案
下面是几种替代Android local.properties、在Kotlin/JS环境下安全获取API Key的可行方案:
1. 通过Gradle编译参数传递
这种方式和Android的思路最接近,把local.properties里的配置通过Gradle传递给Kotlin/JS编译过程:
- 先在项目根目录的
local.properties中添加API Key:API_KEY=your_real_api_key - 在项目根目录的
build.gradle.kts中读取该属性,并注入到JS编译配置:// 加载local.properties文件 val localProps = java.util.Properties().apply { file("local.properties").takeIf { it.exists() }?.inputStream()?.let { load(it) } } val apiKey = localProps.getProperty("API_KEY") ?: error("请在local.properties中配置API_KEY") kotlin { js(IR) { browser { compilations.all { // 将API_KEY作为编译常量注入 kotlinOptions.freeCompilerArgs += "-Xdefine=API_KEY:$apiKey" } } } } - 在Kotlin/JS代码中直接引用这个编译常量:
val apiKey = definedExternally<String>("API_KEY") // 后续使用apiKey即可
2. 读取本地JSON配置文件
这是前端项目常用的方式,通过加载本地配置文件获取密钥:
- 在
src/jsMain/resources目录下创建app-config.json(不要提交到Git,添加到.gitignore):{ "apiKey": "your_real_api_key" } - 使用Kotlinx Serialization读取该文件:
import kotlinx.serialization.Serializable import kotlinx.serialization.json.Json import kotlinx.browser.window import kotlin.js.Promise @Serializable data class AppConfig(val apiKey: String) fun loadAppConfig(): Promise<AppConfig> { return window.fetch("app-config.json") .then { it.text() } .then { Json.decodeFromString<AppConfig>(it) } } // 使用示例 loadAppConfig().then { config -> println("Loaded API Key: ${config.apiKey}") // 在这里执行需要API Key的逻辑 }
3. 读取系统环境变量
适合本地开发或CI/CD场景,直接从环境变量中获取密钥:
- 本地开发时设置环境变量:
- Linux/macOS终端:
export API_KEY=your_real_api_key - Windows PowerShell:
$env:API_KEY="your_real_api_key"
- Linux/macOS终端:
- 在Kotlin/JS代码中读取环境变量:
val apiKey = js("process.env.API_KEY") as? String ?: "fallback_key_if_needed" - 如果使用webpack打包,需要在
webpack.config.d目录下创建env-plugin.js,确保环境变量能被webpack识别:const webpack = require('webpack'); module.exports = { plugins: [ new webpack.DefinePlugin({ 'process.env.API_KEY': JSON.stringify(process.env.API_KEY) }) ] };
重要提示
- 无论使用哪种方式,绝对不要将API Key硬编码到源代码中,也不要将包含密钥的配置文件提交到版本控制
- 如果API Key涉及敏感操作(比如付费接口、用户数据操作),建议通过后端代理请求,避免在前端直接暴露密钥
内容的提问来源于stack exchange,提问作者sanao
相关产品推荐
相关产品推荐

