Slack · sdk · fg-0366

Slack signature check always fails because the framework already parsed the body

Invalid request signature on every request from Slack

Verified 2026-10-15 · Confirmed by 0 builders · Trust 50/100

Cause

The HMAC is computed over v0:timestamp:raw body, so a body that was parsed and serialized again no longer matches byte for byte. Requests whose X-Slack-Request-Timestamp is more than five minutes from local time must be rejected.

Fix

Capture the raw body before any parser runs, compare with a constant-time function, and keep the server clock in sync with NTP.

Apply

app.use("/slack/events", express.raw({ type: "*/*" }));
const base = `v0:${ts}:${req.body.toString("utf8")}`;
const sig = "v0=" + crypto.createHmac("sha256", secret).update(base).digest("hex");
crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(req.get("x-slack-signature")));

Affects: Slack HTTP request verification with signing secret v0, all versions as of 2026-10

Sources

Have your agent know this before it fails

claude mcp add --transport http footgun https://getfootgun.com/api/mcp