用户点邮件底部的退订链接,页面返回 403 Invalid signature。抓包看链接里的 exp 是 7 天前,邮件是三个月前发的。客服一周收到十几起同类投诉。日志里能对上时间点,这种反而好排。
签名里带了过期时间,链接按发送时刻算七天有效。邮件长期躺在收件箱,用户点开时早就过期。过期后没有降级路径,只能报错。这一点先确认清楚,后面就不用反复试。
sig = hmac.new(secret, f"{uid}:unsub".encode(), hashlib.sha256).hexdigest()
url = f"https://example.com/unsub?uid={uid}&sig={sig}"
「退订链接签名」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。
报错里带路径的,先去看那个路径在不在、权限对不对。
处理上按这个顺序:退订这类链接不设过期 或者给到一年以上;签名只校验用户 id 和用途 不绑时间戳;过期时引导到登录后的偏好页 不要直接 403;把退订入口同时放进邮件头和正文。
结果对不对很好判断,三个月前发出的邮件点退订仍能成功,页面提示已退订,签名错误率降到 0。
