登录管理平台

使用服务端配置的 ADMIN_KEY 登录。登录后可以管理 OSS 渠道、创建访问 Token,并上传文件。

概览统一管理你的对象存储渠道
连接检查中

欢迎回来

从一个页面配置渠道、管理凭证并完成文件上传。

已配置渠道
—
当前可用的存储连接
有效 Token
—
已撤销记录不会计入
当前 Provider
Huawei OBS
第一期已接入
平台状态
检查中
服务运行状态

渠道概览

已配置的对象存储连接

渠道ProviderBucket状态
加载中…

快速开始

完成下面三步即可上传文件

配置渠道

填入华为云 OBS 的 Endpoint、Bucket 和 AK/SK。

创建 Token

为你的业务客户端创建一个 Token。

签名上传

上传工作台会在浏览器内生成请求签名。

渠道管理

管理平台连接的对象存储服务,当前支持华为云 OBS。

新增 / 更新渠道

相同渠道 ID 保存时会更新原配置。

Huawei OBS

已配置渠道

密钥不会在列表中展示。

渠道Bucket状态
暂无渠道

访问 Token

Token 用于生成上传请求签名,原文只在创建时返回一次。

创建访问 Token

建议按业务系统分别创建并定期轮换。

Token 列表

已撤销的 Token 不能继续上传。

名称创建时间状态
暂无 Token

上传工作台

请求会使用 Token 在浏览器内生成 HMAC-SHA256 签名。

1 · 选择渠道

请求中的渠道参数决定使用哪一个 OSS 连接。

2 · 生成签名

签名绑定方法、路径、时间戳、nonce、渠道和对象 Key。

3 · 上传对象

平台校验签名后将文件流转发给华为云 OBS。

接口文档

平台全部 REST API、鉴权方式与上传签名算法说明。

接口总览

除健康检查外所有接口均返回 JSON,错误统一为 {"error":{"code","message"}} 结构。

方法路径鉴权说明
GET/healthz无健康检查
POST/api/v1/auth/loginADMIN_KEY登录并创建 12 小时会话 Cookie
POST/api/v1/auth/logout会话退出登录并销毁会话
GET/api/v1/channels管理鉴权渠道列表,不返回 AK/SK
POST/api/v1/channels管理鉴权创建渠道,相同渠道 ID 会覆盖更新
POST/api/v1/tokens管理鉴权创建 Token,原文仅在创建响应中返回一次
GET/api/v1/tokens管理鉴权Token 元数据列表
DELETE/api/v1/tokens/{id}管理鉴权撤销 Token,撤销后立即失效
POST/api/v1/tokens/{id}/temporary管理鉴权基于现有 Token 生成临时 Token,仅存 Redis,到期自动失效
POST/api/v1/uploadToken + HMAC 签名multipart 上传文件并转发到对象存储
POST/api/v1/presignToken + HMAC 签名生成 OBS 直传临时链接,前端直接 PUT 上传、不经平台中转

管理鉴权

渠道与 Token 管理接口的两种认证方式

方式一:请求头携带 X-Admin-Key: <ADMIN_KEY>,适合服务端脚本调用。
方式二:先调用登录接口,浏览器持有 oss_session HttpOnly Cookie(12 小时有效),本控制台即使用该方式。

POST /api/v1/auth/login {"admin_key": "your-admin-key"} 200 => Set-Cookie: oss_session=...; HttpOnly

上传签名算法

签名绑定请求目标,防篡改、防重放

请求需携带 Authorization: Bearer <token>、X-OSS-Timestamp(Unix 秒,服务端允许 ±5 分钟偏差)、X-OSS-Nonce(每次请求唯一的随机串,重复使用返回 409)和 X-OSS-Signature。待签名字符串按以下顺序用换行连接,以 Token 原文为密钥做 HMAC-SHA256,结果使用 Base64(Raw URL)编码:

临时 Token(POST /api/v1/tokens/{id}/temporary 生成,仅存 Redis)签名方式相同,以临时 Token 原文为密钥;来源 Token 撤销或过期后其临时 Token 立即失效。

HTTP_METHOD /api/v1/upload X-OSS-Timestamp X-OSS-Nonce channel object_key

调用示例(Python)

保存为脚本,替换环境变量后可直接运行

import base64, hashlib, hmac, os, time, uuid, requests token = os.environ["OSS_TOKEN"] channel, key, endpoint = "hw-prod", "images/a.png", "http://localhost:8080/api/v1/upload" timestamp, nonce = str(int(time.time())), uuid.uuid4().hex canonical = "\n".join(["POST", "/api/v1/upload", timestamp, nonce, channel, key]) signature = base64.urlsafe_b64encode(hmac.new(token.encode(), canonical.encode(), hashlib.sha256).digest()).rstrip(b"=").decode() with open("a.png", "rb") as file: response = requests.post(endpoint, headers={ "Authorization": "Bearer " + token, "X-OSS-Timestamp": timestamp, "X-OSS-Nonce": nonce, "X-OSS-Signature": signature, }, data={"channel": channel, "object_key": key}, files={"file": ("a.png", file, "image/png")}) print(response.status_code, response.json())
错误码HTTP 状态含义
unauthorized401Token 无效、签名错误或时间戳偏差过大
replay_detected409Nonce 已被使用,疑似重放请求
channel_not_found404渠道不存在或已停用
invalid_object_key400对象 Key 非法(为空、包含 .. 或超过 1024 字符)
provider_upload_failed502对象存储侧上传失败,可重试
invalid_hours400临时 Token 时长必须是 1-24 小时
temp_store_unavailable503未配置 Redis 或 Redis 不可用,无法签发临时 Token
presign_failed502直传链接生成失败,检查渠道 AK/SK 与 Endpoint 配置