# utils/oss_signer.R # 阿里云 OSS 签名生成器 (R语言实现) # 参考文档: https://help.aliyun.com/document_detail/31951.html library(digest) library(base64enc) #' 生成 OSS API 签名头 #' @param config 包含 access_key_id, access_key_secret, bucket 的列表 #' @param verb HTTP 方法 (GET, PUT, etc.) #' @param resource OSS 资源路径 (例如 "/my-bucket/data/file.csv") #' @param content_type 内容类型 (可选) #' @param content_md5 内容 MD5 (可选) #' @return 包含 Authorization 和 Date 的命名向量 generate_oss_signature <- function(config, verb, resource, content_type = "", content_md5 = "") { # 1. 生成标准时间戳 (GMT 格式) # 例如: "Thu, 18 Feb 2026 08:00:00 GMT" date <- format(Sys.time(), "%a, %d %b %Y %H:%M:%S GMT", tz="GMT") # 2. 构造 CanonicalizedResource # 格式: /BucketName/ObjectName canonicalized_resource <- paste0("/", config$bucket, "/", resource) # 3. 构造 StringToSign # 格式: # VERB + "\n" + # Content-MD5 + "\n" + # Content-Type + "\n" + # Date + "\n" + # CanonicalizedOSSHeaders + # CanonicalizedResource # 注意: 这里简化处理,未包含 CanonicalizedOSSHeaders (x-oss-*) string_to_sign <- paste( verb, content_md5, content_type, date, canonicalized_resource, sep = "\n" ) # 4. 计算 HMAC-SHA1 签名 # 使用 AccessKeySecret 作为密钥 signature <- base64encode(hmac(config$access_key_secret, string_to_sign, algo = "sha1", raw = TRUE)) # 5. 构造 Authorization 头 auth_header <- paste0("OSS ", config$access_key_id, ":", signature) # 返回需要的 Headers return(c( "Authorization" = auth_header, "Date" = date )) }