56 lines
1.7 KiB
R
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
|
|
))
|
|
} |