将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); // 输出结果用于验证 }
修正说明
- 统一变量名:将
locationID改为businessId,避免未定义变量导致的拼接错误。 - 对齐时间戳逻辑:用
Math.floor()替代Math.round(),确保和NodeJS的时间戳计算完全一致,且直接使用数字拼接,不做JSON转换。 - 移除冗余操作:删除无意义的base64编解码和JSON序列化,直接用原始字符串生成HMAC签名,确保签名逻辑和NodeJS完全匹配。
内容的提问来源于stack exchange,提问作者Steven Polanco
相关产品推荐
相关产品推荐

