外观
系统凭据与密钥使用规范
定义 CodeNote Android 端所有第三方凭据、密钥、端点的统一管理规范。 目标:消除硬编码、统一调用、可扩展。
1. 凭据清单
1.1 涉及的全部凭据
| # | 凭据 | 当前位置 | 当前方式 | 改后来源 |
|---|---|---|---|---|
| 1 | OSS Endpoint | OssConfiguration.kt | 常量硬编码 | credentials.properties |
| 2 | OSS Bucket | OssConfiguration.kt | 常量硬编码 | credentials.properties |
| 3 | OSS Base URL | OssConfiguration.kt | 常量硬编码 | credentials.properties |
| 4 | OSS Folder | OssConfiguration.kt | 常量硬编码 | credentials.properties |
| 5 | PNVS 方案 Code | PnsManager.kt | 常量硬编码 | credentials.properties |
| 6 | PNVS 方案密钥 | PnsManager.kt | 常量硬编码 | credentials.properties |
| 7 | 高德定位 API Key | AndroidManifest.xml | 硬编码字面量 | credentials.properties → manifestPlaceholders |
| 8 | 高德天气 API Key | 无(未接入) | - | credentials.properties |
1.2 不改动的凭据
| 凭据 | 原因 |
|---|---|
| JKS storePassword / keyPassword | 构建配置,build.gradle.kts 的 signingConfigs 固有属性 |
| OSS AccessKey ID / Secret | 运行时通过 STS 临时凭证获取,不硬编码在 App 内 |
| deploy.sh 中 OSS AK/SK | CI/CD 脚本凭据独立管理 |
2. 目录结构
codenote-android/
├── credentials.properties # 真实凭据(提交 git)
├── credentials.properties.example # 模板(提交 git)
│
└── core/common/src/main/java/.../
├── OssConfiguration.kt # 委托到 Credentials
└── Credentials.kt # 统一入口凭据文件直接提交 git,不排除。凭据本身是项目配置的一部分,版本追踪有助于审计和回滚。
3. Build 集成
3.1 根 build.gradle.kts
kotlin
plugins {
id("com.google.android.libraries.mapsplatform.secrets-gradle-plugin") version "2.0.1" apply false
}3.2 app/build.gradle.kts
kotlin
plugins {
id("com.google.android.libraries.mapsplatform.secrets-gradle-plugin")
}
secrets {
propertiesFileName = "credentials.properties"
defaultPropertiesFileName = "credentials.properties.example"
}
android {
defaultConfig {
// 从 credentials.properties 读取 amap.key
val credFile = file("../credentials.properties")
if (credFile.exists()) {
manifestPlaceholders["amapKey"] = credFile.readText()
.lines()
.find { it.startsWith("amap.key=") }
?.removePrefix("amap.key=")
?.trim() ?: ""
}
}
}3.3 生成 BuildConfig 字段对照表
| properties key | BuildConfig 字段 | 使用位置 |
|---|---|---|
oss.endpoint | OSS_ENDPOINT | Credentials.oss.endpoint |
oss.bucket | OSS_BUCKET | Credentials.oss.bucket |
oss.base_url | OSS_BASE_URL | Credentials.oss.baseUrl |
oss.folder | OSS_FOLDER | Credentials.oss.folder |
pnvs.scheme_code | PNVS_SCHEME_CODE | Credentials.pnvs.schemeCode |
pnvs.auth_secret | PNVS_AUTH_SECRET | Credentials.pnvs.authSecret |
amap.key | AMAP_KEY | Credentials.amap.key / manifest |
weather.key | WEATHER_KEY | Credentials.weather.key |
4. 新增凭据流程
1. credentials.properties 加一行 比如:new_service.api_key=xxx
2. Credentials.kt 加 object + val object NewService { val apiKey get() = BuildConfig.NEW_SERVICE_API_KEY }
3. 使用处引用 Credentials.newService.apiKey5. 安全注意事项
| 注意 | 说明 |
|---|---|
| 凭据提交 git | credentials.properties 直接纳入版本管理,回滚可追溯 |
deploy.sh | CI 脚本凭据独立维护,不纳入此体系 |
| 签名证书密码 | 仍写在 build.gradle.kts 的 signingConfigs 中(构建脚本固有属性) |
| OSS AK/SK | 服务端通过 STS 临时凭证下发,App 内不持久化 AK/SK |