Files

56 lines
1.7 KiB
R

# 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
))
}