ts = str(int(time.time())) raw = 'page=1&size=20&ts=%s&key=xxx' % ts sign = hashlib.md5(raw.encode()).hexdigest()
抓搜索接口每次返回 401,body 里 code=1002 sign invalid,同样的参数在浏览器里能过,差别只有 ts 字段长度,浏览器 10 位,脚本 13 位。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。
追下去是这么回事:签名串把 ts 原样拼进去做 HMAC,时间戳单位不同算出来的摘要完全不同。服务端还有 5 分钟时效校验,本地时钟偏 6 分钟同样会失败。
「接口签名时间戳」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。同一份配置存在多处的,先确认改的是被加载的那一份。
新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。
处理上按这个顺序:按文档确认参与签名的字段顺序;ts 取整到秒再用 str 转换;用原始字符串拼接不做 URL 编码;本地先复算一遍和服务端日志比对。
确认没问题再收工,改完后接口返回 200,sign 与服务端日志记录的值一致,连续 200 次请求 401 为 0。
