refactor(config): 七牛/微信密钥外置——AK/SK+微信AppID 入本地 app_config, domain/bucket 走远程配置
- app_config.json + AppConfig: qiniu_access_key/qiniu_secret_key/wechat_app_id/wechat_app_secret(扁平snake_case) - RemoteConfig.VersionFields + audio_domain/audio_bucket(4层可携带), VersionDecision + audioDomain/audioBucket - VersionResolver.resolve 复用 pickStr 解析 audioDomain/audioBucket(4层逐级回退) - QiniuToken.uploadToken(accessKey,secretKey,bucket) 改传参,去掉硬编码常量 - AudioProvider.doUpload: AK/SK取本地配置, domain/bucket取远程配置(cfg.resolve), URL用远程domain - WeChatApi.configure(appId) 注入AppID(去WX_APP_ID常量), EntryAbility.onCreate 从配置注入 - 更新 QiniuToken 单测传参 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
e5d8eeb3b1
commit
c39d8eb400
@@ -1,27 +1,26 @@
|
||||
/**
|
||||
* 七牛 uploadToken 端侧生成(设计 §7)。
|
||||
* ⚠️ 刻意对齐原 Android 工程:AK/SK 端侧硬编码、不走服务端——违背 CLAUDE.md 附录B 加固红线,
|
||||
* 已与用户明确确认(对齐原工程)。token 算法见七牛官方:AK:urlsafeB64(HMAC_SHA1(SK,policy)):policy。
|
||||
* 七牛 uploadToken 端侧生成(设计 §7)。token 算法见七牛官方:AK:urlsafeB64(HMAC_SHA1(SK,policy)):policy。
|
||||
* ⚠️ 不走服务端(对齐原工程):AK/SK 由调用方从本地 app_config 注入、bucket 从远程配置注入,
|
||||
* 本类不再持有任何密钥常量。AK/SK 入端仍违背 CLAUDE.md 附录B 加固红线,已与用户确认。
|
||||
*/
|
||||
import { cryptoFramework } from '@kit.CryptoArchitectureKit';
|
||||
import { buffer, util } from '@kit.ArkTS';
|
||||
|
||||
export class QiniuToken {
|
||||
private static readonly ACCESS_KEY: string = 'ngN3rFW1j8dn7ZGpATKl7mreaNmp2Ei_l9AIhkIf';
|
||||
private static readonly SECRET_KEY: string = '6VXav9eqUCORJTYvTFOeTVRonAyk4Hrs-PIZ8jmZ';
|
||||
// bucket 取 'gameaudio'(有 d,与回放域名 gameaudio.daoqi88.cn / Android NewwebviewActivity 一致);
|
||||
// 原 webviewActivity 里的 'gameauio'(无 d) 是拼写错误,七牛上无该 bucket(区域查询 no such bucket)。
|
||||
private static readonly BUCKET: string = 'gameaudio';
|
||||
|
||||
/** 生成 uploadToken(deadline=now+1h)。 */
|
||||
static async uploadToken(): Promise<string> {
|
||||
/**
|
||||
* 生成 uploadToken(deadline=now+1h)。
|
||||
* @param accessKey 七牛 AccessKey(本地 app_config.qiniu_access_key)
|
||||
* @param secretKey 七牛 SecretKey(本地 app_config.qiniu_secret_key)
|
||||
* @param bucket 存储空间名(远程配置 audio_bucket)
|
||||
*/
|
||||
static async uploadToken(accessKey: string, secretKey: string, bucket: string): Promise<string> {
|
||||
const deadline: number = Math.floor(Date.now() / 1000) + 3600;
|
||||
const policy: string = `{"scope":"${QiniuToken.BUCKET}","deadline":${deadline}}`;
|
||||
const policy: string = `{"scope":"${bucket}","deadline":${deadline}}`;
|
||||
const encodedPolicy: string =
|
||||
QiniuToken.urlsafeBase64(new Uint8Array(buffer.from(policy, 'utf-8').buffer));
|
||||
const sign: Uint8Array = await QiniuToken.hmacSha1(QiniuToken.SECRET_KEY, encodedPolicy);
|
||||
const sign: Uint8Array = await QiniuToken.hmacSha1(secretKey, encodedPolicy);
|
||||
const encodedSign: string = QiniuToken.urlsafeBase64(sign);
|
||||
return `${QiniuToken.ACCESS_KEY}:${encodedSign}:${encodedPolicy}`;
|
||||
return `${accessKey}:${encodedSign}:${encodedPolicy}`;
|
||||
}
|
||||
|
||||
private static async hmacSha1(secret: string, message: string): Promise<Uint8Array> {
|
||||
|
||||
Reference in New Issue
Block a user