使用Striga API创建用户时HMAC不匹配导致401认证错误求助
排查Striga API HMAC认证失败(401 "HMAC's did not match")的解决方案
以下是针对PHP环境下Striga API签名验证失败的核心排查点和解决步骤:
1. 确认HMAC签名生成的核心要素完全匹配API要求
Striga的HMAC签名通常基于请求方法、请求路径、时间戳、请求体四个关键部分生成,缺一不可且顺序严格:
- 请求方法必须为大写
POST,部分API对方法大小写敏感; - 请求路径需完全匹配(如
/users和/users/会被视为不同路径,需严格对齐文档); - 时间戳需与请求头
Timestamp的取值完全一致(通常为Unix时间戳,精确到秒,避免毫秒或格式差异); - 请求体必须是原始发送的JSON字符串,禁止使用
JSON_PRETTY_PRINT等格式化参数,确保json_encode输出的字符串与实际发送内容完全一致。
2. 检查密钥与加密算法的正确性
- 确认使用Striga控制台提供的Secret Key(而非API Key)生成签名,二者不可混用;
- 加密算法必须为
HMAC-SHA256,检查PHP代码中是否调用hash_hmac('sha256', $signString, $secretKey); - 密钥需完整复制,避免手动输入时遗漏空格或特殊字符。
3. 验证请求头的格式与完整性
Authorization头格式需严格遵循Striga要求,示例格式通常为Striga <API_KEY>:<HMAC_SIGNATURE>,禁止随意修改分隔符或前缀;- 确保
Content-Type头设置为application/json,且请求体无JSON语法错误; Timestamp头的取值必须与生成签名时使用的时间戳完全相同,避免时间差导致的验证失败。
4. PHP代码的具体排查点
- 检查签名拼接逻辑是否符合Striga文档要求,示例正确拼接方式如下:
$method = 'POST'; $path = '/v1/users'; // 替换为实际接口路径 $timestamp = time(); // 需与请求头Timestamp一致 $requestBody = json_encode($userData); // 无额外格式化参数 $signString = $method . $path . $timestamp . $requestBody; $hmac = hash_hmac('sha256', $signString, $yourSecretKey); - 避免对路径或请求体做不必要的URL编码,除非Striga文档明确要求。
5. 调试验证技巧
- 打印生成签名的所有原始参数(方法、路径、时间戳、请求体)和最终HMAC值,用在线HMAC生成器手动验证是否匹配;
- 使用抓包工具(如Charles)捕获实际请求,对比代码生成内容与实际发送内容的差异(重点排查编码、空格、换行符等细节)。
内容的提问来源于stack exchange,提问作者Daniel González Pitt
相关产品推荐
相关产品推荐

