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

将NodeJS认证令牌脚本转换为Apps Script时生成无效令牌的问题排查

排查Google Apps Script(GAS)认证令牌无效问题

你的GAS代码和NodeJS版本的核心逻辑存在多处偏差,导致生成的令牌无效,具体问题和修正方案如下:

问题点分析

  • 变量名拼写错误:GAS中定义的变量是locationID,但拼接payload时误用了未定义的businessID,导致该部分值为undefined,生成的payload与NodeJS版本完全不符。
  • 时间戳处理错误:NodeJS直接使用数字类型的时间戳拼接payload,而GAS里用JSON.stringify()把时间戳转成了带引号的字符串(比如1699999999变成"1699999999"),彻底改变了payload的原始内容。
  • 冗余的Payload转换:GAS中对tokenPayload做了无意义的base64编码/解码,还额外用JSON.stringify()处理,导致传入HMAC签名的内容和NodeJS的原始字符串不一致,最终签名结果错误。

修正后的GAS代码

function apiInfo() {
  var secret = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
  var apiKey = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX";
  var businessId = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"; // 修正变量名,和NodeJS对齐

  var prefix = "abc-admin-v1";
  var unixTimestamp = Math.floor(new Date().getTime() / 1000); // 和NodeJS一致用floor,避免round的差异
  var payload = prefix + businessId + unixTimestamp; // 直接拼接原始值,无多余转换

  var rawKey = Utilities.base64Decode(secret);
  var rawMac = Utilities.computeHmacSha256Signature(payload, rawKey);
  var signature = Utilities.base64Encode(rawMac);

  var token = signature + payload;
  var httpBasicPayload = apiKey + ":" + token;
  var httpBasicCredentials = Utilities.base64Encode(httpBasicPayload);

  console.log(httpBasicCredentials); // 输出结果用于验证
}

修正说明

  1. 统一变量名:将locationID改为businessId,避免未定义变量导致的拼接错误。
  2. 对齐时间戳逻辑:用Math.floor()替代Math.round(),确保和NodeJS的时间戳计算完全一致,且直接使用数字拼接,不做JSON转换。
  3. 移除冗余操作:删除无意义的base64编解码和JSON序列化,直接用原始字符串生成HMAC签名,确保签名逻辑和NodeJS完全匹配。

内容的提问来源于stack exchange,提问作者Steven Polanco

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 16:46:07