1. 问题背景与初步排查
在Google Apps Script中调用Gemini API时遇到"InvalidSignature"错误,这是一个典型的API签名验证失败问题。根据我的经验,这类错误通常由以下几个关键环节导致:
- 签名生成算法不一致:客户端生成的签名与服务端验证逻辑不匹配
- 时间戳不同步:请求时间与服务端时间偏差超过允许范围
- 密钥处理错误:API密钥或密钥的编码/解码过程出现问题
- 请求头设置不当:必要的认证头缺失或格式错误
重要提示:Gemini API使用HMAC SHA-384算法进行签名验证,这与许多其他加密货币交易所常用的SHA-256不同,这是第一个需要确认的关键点。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 签名生成机制深度解析
2.1 标准签名生成流程
正确的签名生成应包含以下步骤:
-
构造请求载荷:
javascript复制const payload = { request: "/v1/your/endpoint", nonce: Date.now(), // 其他必要参数... }; const payloadBase64 = Utilities.base64Encode(JSON.stringify(payload)); -
生成签名:
javascript复制const signature = Utilities.computeHmacSignature( Utilities.MacAlgorithm.HMAC_SHA_384, payloadBase64, apiSecret ); const signatureHex = signature.map(byte => ('0' + (byte & 0xFF).toString(16)).slice(-2)).join('');
2.2 常见错误点分析
根据问题描述中的代码片段,我发现几个潜在问题:
-
密钥处理不完整:
- 原始代码中
geminiApiSecret变量被截断 - 缺少密钥的Base64解码步骤(如果密钥是Base64编码的)
- 原始代码中
-
时间戳问题:
- 未显示nonce生成逻辑
- 时间戳精度不足可能导致重复
-
编码不一致:
- Python和JavaScript的字符串处理差异
- 字节数组到十六进制字符串的转换方式
3. 完整解决方案实现
3.1 修正后的Headers生成函数
javascript复制function createHeaders(payload) {
c
