You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用curl发起带API Key与Secret授权的PUT请求遇401错误求解

API请求401未授权:授权方式疑问与排查

背景信息

调用某SaaS平台API时,生成了两类凭证:

  • API Key ID:631f39f37564not/631f39f475646real/635c1192756key
  • Secret Key:-----BEGIN RSA PRIVATE KEY----- ABCDE1234 -----END RSA PRIVATE KEY-----

使用以下bash脚本发起请求:

#!/bin/bash

export FIELD=90

HOST=https://example.com

PUT_BODY="{\"value\":\"${FIELD}\",\"valueObjectType\":\"String\"}"
curl -sk -X PUT "${HOST}/api/v3/xyz/endpoint" \
  -H 'content-type: application/json' \
  -H 'x-requested-with: XMLHttpRequest' \
  -H "referer: ${HOST}/" \
  -H "Authorization: apikey 631f39f37564not/631f39f475646real/635c1192756key" \
  -d"${PUT_BODY}" | jq '.'

请求返回401未授权错误:

{
"error": {
"status_code": 401,
"status": "Unauthorized"
}
}

疑问

  1. 当前-H "Authorization: apikey 631f39f37564not/631f39f475646real/635c1192756key"的API Key指定方式是否正确?
  2. 是否需要在请求中附加Secret Key?
  3. 注:无法使用Bearer Token,只能用API Key授权。

解答

1. 当前Authorization头的正确性存疑

apikey <KEY_ID>这种格式是部分平台的授权方式,但结合你持有RSA私钥的情况,大概率不符合该平台的实际要求:

  • 若平台采用Basic认证,通常需要将API Key ID:Secret Key拼接后做Base64编码,格式为Authorization: Basic $(echo -n "KEY_ID:SECRET" | base64),但你这里是RSA私钥,这种方式可能性极低。
  • 若平台采用RSA签名认证,仅传Key ID完全不够,需要用私钥对请求的关键信息(如HTTP方法、请求路径、时间戳、请求体哈希等)生成签名,再将Key ID和签名一起放在请求头中(比如Authorization: apikey {KEY_ID}:{SIGNATURE},或单独设置签名头)。
  • 另外需注意:部分平台对apikey的大小写有要求(比如ApiKey或APIKey),需严格匹配文档规范。

2. 绝对不能直接附加Secret Key(RSA私钥)

你持有的是RSA私钥,绝对不能将其直接放在请求头或请求体中传输,这会导致凭证泄露,引发安全风险。正确的用法是用私钥对请求内容做签名,服务端会用对应的公钥验证签名的有效性,以此确认请求的合法性。

3. 下一步排查建议

  • 优先查阅该SaaS平台的API文档,找到「API Key授权」「签名认证」相关章节,明确以下规则:
    • 授权头的具体格式要求;
    • 签名需要覆盖的请求内容(如是否包含时间戳、HTTP方法、URI等);
    • 签名使用的算法(如SHA256withRSA)。
  • 检查API Key ID是否复制正确(比如是否有多余的斜杠、字符遗漏);
  • 尝试发起最简单的GET测试请求(若平台提供),排除PUT请求体的影响,先验证授权方式是否正确。

内容的提问来源于stack exchange,提问作者100MIL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 20:30:58