跳到主要内容

签名生成

1. 简易认证

快速、容易使用的认证方式。(TAMS国内版暂不提供此种认证方式)

获取认证Token

使用认证Token

将Token放入请求header的Authorization中:

Bearer {your_token}

一个简单的请求示例:

POST https://ap-east-1.tensorart.cloud/v1/jobs
Content-Type: application/json; charset=UTF-8
Authorization: Bearer eW91cl90b2tlbg==
{"request_id":"1562068719690532983734","stages":[{"type":"INPUT_INITIALIZE","inputInitialize":{"seed":-1,"count":2}},{"type":"DIFFUSION","diffusion":{"width":512,"height":512,"prompts":[{"text":"1girl"}],"steps":15,"sd_model":"600423083519508503","clip_skip":2,"cfg_scale":7}}]}

2. 标准认证

更高的安全性,建议生产环境下使用。

准备

应用需要创建好公钥与私钥,并将公钥上传至TAMS平台,见签名介绍

构造签名串

请求示例

POST https://ap-east-1.tensorart.cloud/v1/jobs
Content-Type: application/json; charset=UTF-8
{"request_id":"1562068719690532983734","stages":[{"type":"INPUT_INITIALIZE","inputInitialize":{"seed":-1,"count":2}},{"type":"DIFFUSION","diffusion":{"width":512,"height":512,"prompts":[{"text":"1girl"}],"steps":15,"sd_model":"600423083519508503","clip_skip":2,"cfg_scale":7}}]}

应用的技术开发人员按照当前文档约定的规则构造签名串。TAMS会使用同样的方式构造签名串。如果平台构造签名串的方式错误,将导致签名验证不通过。 待签字符串构造格式如下:

待签字符串 =
HTTP 请求方法 + \n +
URL + \n +
请求时间戳 + \n +
请求随机串 + \n +
请求报文消息体
  1. 以上面的请求示例为例,请求方法为 POST,后跟换行符。
POST\n
  1. 请求的 URL 为除去域名部分的 URL,后跟换行符。如果请求 URL 中带有查询参数,需要同时保留。
/api/v1/generation?k1=v1&k2=v2
  1. 获取发起请求时的系统当前时间戳,即格林威治时间 1970 年 01 月 01 日 00 时 00 分 00 秒(北京时间 1970 年 01 月 01 日 08 时 00 分 00 秒)起至 现在的总秒数,作为请求时间戳,后跟换行符。API 会拒绝处理很久之前 发起的请求,请应用保持自身系统的时间准确。
1688985132\n
  1. 生成一个请求随机串,后跟换行符。 随机串仅允许数字、英文和中划线(-) 。不同的请求请使用不同的随机串,使用相同的随机串可能会被识别为无效请求。这里,我们使用命令行直接生成一个。
hexdump -n 16 -e '4/4 "%08x" 1 "\n"' /dev/random
5afedaa0150c6abbd78143ed615ab6
5afedaa0150c6abbd78143ed615ab6\n
  1. 获取请求中的请求报文消息体(Request Body) ,请使用发起 HTTP 请求时真实发送的 JSON 报文, 请求报文为空时,则使用空字符串
{
"request_id": "1562068719690532983734",
"stages": [
{
"type": "INPUT_INITIALIZE",
"inputInitialize": { "seed": -1, "count": 2 }
},
{
"type": "DIFFUSION",
"diffusion": {
"width": 512,
"height": 512,
"prompts": [{ "text": "1girl" }],
"steps": 15,
"sd_model": "600423083519508503",
"clip_skip": 2,
"cfg_scale": 7
}
}
]
}
  1. 以上各部分构造待签字符串
POST
/v1/jobs
1688985132
5afedaa0150c6abbd78143ed615ab6
{"request_id":"1562068719690532983734","stages":[{"type":"INPUT_INITIALIZE","inputInitialize":{"seed":-1,"count":2}},{"type":"DIFFUSION","diffusion":{"width":512,"height":512,"prompts":[{"text":"1girl"}],"steps":15,"sd_model":"600423083519508503","clip_skip":2,"cfg_scale":7}}]}

计算签名

使用应用私钥对待签字符串进行 SHA256withRSA 签名,并对签名结果进行Base64 编码得到签名值

将签名添加到 HTTP 请求头

请求通过 HTTP Authorization 头来传递签名。Authorization 由认证类型和 签名信息两个部分组成。 Authorization: 认证类型 签名信息 Authorization: 认证类型 appid=应用id,nonce_str=请求随机串,timestamp=时间戳,signature=签名

  1. 认证类型,目前为 TAMS-SHA256-RSA(该值仅作为示例,具体 待定);
  2. 签名信息:
  • 发起请求的应用 ID appid
  • 请求随机串 nonce_str
  • 时间戳 timestamp
  • 签名 signature 签名信息里的各项值以 key=value 形式拼接,用逗号(,)分割,无顺序要求。 示例如下:*注意,示例因为排版可能存在换行,实际数据应在一行
Authorization: TAMS-SHA256-RSA app_id=20003093682940,nonce_str=5afed
aa0150c6abbd78143ed615ab6,timestamp=1688985132,signature=TPewM7YwG+9S1Vs
55EDcmONsPQn5mltkCjXzXr2mUSn7SGaKD1vggq2Megfhyu3a2SHRBS1g94VRaMFKrVTH
bhNgcV8d26LjLU98Em2w+d+ZrnoG1NVrXSnB1WQJSQeeue4X+giKHFDqpok92p5Yw/IwX
z0u8UaEgXMRJSC3HqfmY4u9zI4YRld4xn7wJIRpn1k0MQ/zTzbZbFDPfYmTEbP6QofvR6G8z
Z19Sx3b2LWvG+RPENGEmFAeB87/NSL3w6P8iGcVJI85iG12jc3shUWK22t/3BXj8bzFGYfV3q
i3f2gXgBd7PsFfNuK9jf//kqKXTevlJu90CZQewidMhg==

最终以 cURL 为例,发送请求:

curl 'https://ap-east-1.tensorart.cloud/v1/jobs' \-H 'Content-Type: application/json' \-H
'Accept: application/json' \-H 'Authorization: TAMS-SHA256-RSA
app_id=20003093682940,nonce_str=5
afedaa0150c6abbd78143ed615ab6,timestamp=1688985132,signature=TPewM7YwG+9S
1Vs55EDcmONsPQn5mltkCjXzXr2mUSn7SGaKD1vggq2Megfhyu3a2SHRBS1g94VRaMFKr
VTHbhNgcV8d26LjLU98Em2w+d+ZrnoG1NVrXSnB1WQJSQeeue4X+giKHFDqpok92p5Yw
/IwXz0u8UaEgXMRJSC3HqfmY4u9zI4YRld4xn7wJIRpn1k0MQ/zTzbZbFDPfYmTEbP6QofvR
6G8zZ19Sx3b2LWvG+RPENGEmFAeB87/NSL3w6P8iGcVJI85iG12jc3shUWK22t/3BXj8bzFG
YfV3qi3f2gXgBd7PsFfNuK9jf//kqKXTevlJu90CZQewidMhg==' \-d
'{"request_id":"1562068719690532983734","stages":[{"type":"INPUT_INITIALIZE","inputInitialize":{"seed":-1,"count":2}},{"type":"DIFFUSION","diffusion":{"width":512,"height":512,"prompts":[{"text":"1girl"}],"steps":15,"sd_model":"600423083519508503","clip_skip":2,"cfg_scale":7}}]}'

签名DEMO

以下是各个语言签名实现的demo,方便大家简单快速的使用