Verifies Slack request signatures (Events API, slash commands, interactivity).
Slack sends X-Slack-Request-Timestamp and X-Slack-Signature
(v0=<hex HMAC-SHA256(signing_secret, "v0:" <> timestamp <> ":" <> raw_body)>).
Verify against the raw request body, before any JSON/form parsing.
:ok = Noizu.Slack.Signature.verify(secret, ts_header, raw_body, sig_header)Requests older (or newer) than the replay window (default 300 s) are rejected. Comparison is constant-time.
Summary
Functions
Computes the v0=<hex> signature for timestamp + body (useful in tests).
Verifies a request. Returns :ok or {:error, %Error{tag: :signature, reason: r}}
with r in :invalid_timestamp | :stale_timestamp | :invalid_signature.
Functions
Computes the v0=<hex> signature for timestamp + body (useful in tests).
@spec verify( String.t(), String.t() | integer(), iodata(), String.t() | nil, keyword() ) :: :ok | {:error, Noizu.Slack.Error.t()}
Verifies a request. Returns :ok or {:error, %Error{tag: :signature, reason: r}}
with r in :invalid_timestamp | :stale_timestamp | :invalid_signature.
Options: :tolerance (seconds, default 300), :now (unix seconds; default
System.os_time(:second)).