对象预签名

接口

  • POST /api/v1/open/objects/presign:为租户授权范围内的对象生成对象存储上传或下载预签名 URL。
  • POST /api/v1/open/objects/credentials:创建租户自己的对象存储 access key,secret 只返回一次。
  • GET /api/v1/open/objects/credentials:列出租户对象存储凭证,不返回 secret。
  • GET /api/v1/open/objects/credentials/{credential_id}:获取对象存储凭证,不返回 secret。
  • PUT /api/v1/open/objects/credentials/{credential_id}:更新或轮换对象存储凭证。
  • POST /api/v1/open/objects/resources:创建 bucket/key prefix/method/TTL 策略,可绑定指定 credential_id
  • GET /api/v1/open/objects/resources:列出租户对象资源策略。
  • PUT /api/v1/open/objects/resources/{resource_id}:更新租户对象资源策略。
API 服务只签发 URL,不代理对象字节。客户端拿到 URL 后直接与对象存储服务交互。 对象存储凭证和资源策略是租户级配置资源,不应该放在每次 presign 请求里。

鉴权

  • 必须通过开放平台签名鉴权:X-Api-IdX-Api-TimestampX-Api-NonceX-Api-Signature
  • X-Request-Id 可选;未传时平台生成
  • 需要租户域内授权:open:object:create
  • 租户身份来自认证凭据绑定,请求体不能声明或覆盖租户

请求体

FieldTypeRequiredDescription
bucketstringyes对象存储 bucket
object_keystringyes对象 key,必须命中租户对象资源策略的前缀
methodstringyesPUTGET
expires_secondsintegernoURL 有效期;缺省 900,最大 3600,且不能超过资源策略
content_typestringno上传时建议传入;仅 PUT 响应会返回对应 header
{
  "bucket": "utmos-objects",
  "object_key": "tenant_001/uploads/flight-task.bin",
  "method": "PUT",
  "expires_seconds": 900,
  "content_type": "application/octet-stream"
}

响应

{
  "method": "PUT",
  "url": "https://objects.example/utmos-objects/tenant_001/uploads/flight-task.bin?...",
  "headers": {
    "Content-Type": "application/octet-stream"
  },
  "expires_at": "2026-05-21T12:15:00Z",
  "request_id": "req-object-001"
}

安全规则

  • 平台只根据认证后的 tenant_idclient_id 做对象策略匹配。
  • 对象策略必须允许 bucket、key 前缀、method 和 TTL。
  • object_key 不能以 / 开头,也不能包含 ../
  • 平台记录安全审计事实,但不持久化预签名 URL、访问密钥、secret key、session token 或对象内容。
  • 日志不得记录签名 URL、对象内容或对象存储密钥。

常见错误

codeHTTP说明
UNAUTHORIZED401缺少或无效的认证身份
SIGNATURE_INVALID401签名不匹配
TIMESTAMP_EXPIRED401请求时间戳超过允许偏差窗口
NONCE_REPLAYED401nonce 在重放窗口内重复使用
FORBIDDEN403当前客户端无租户域内权限
OBJECT_POLICY_DENIED403bucket、key、method 或 TTL 不满足对象资源策略
OBJECT_SIGNING_FAILED500对象存储预签名失败
VALIDATION_FAILED400字段缺失、类型非法或超出范围
INTERNAL_ERROR500平台内部错误