A tiny Clojure library designed to assist with signature verification in (ring) webhook handlers.
The first thing you need is the raw bytes from the server's InputStream
.
In a typical Clojure ring-based api, you can find this stream under :body
,
however it is highly likely that it will have already been consumed (i.e. it will be empty)
by the time your endpoint middleware/handler sees it (by earlier content-negotiating/formatting/coercing middleware).
For example, your api's clients may be sending JSON, but you're are actually receiving Clojure maps under :body-params
.
It is important that you don't use those maps for signature-verification (e.g. by converting back to JSON)!
Instead, use this as your very first middleware, which will simply add a new key to the request map (:body-raw
).
uri-pred
takes the request's :uri
, and decides whether the logic applies for it. For example, this could be
the set of all webhook paths.
With :body-raw
available in the request-map, you're all set to do the actual signature verification.
Simply wrap your handler, with the middleware returned by this function. Options are:
Mac
algorithm to use (defaults to 'HmacSHA256')SecretKeySpec
when signing (mandatory)identity
)=
)HexFormat
instance (defaults to (HexFormat/of)
)Returns the following (instead of calling the handler its wrapping) when signature doesn't match (or missing):
{:status 403
:body "Signature either wrong, or missing!"
:headers {"Content-Type" "text/plain"}}
See core_test.clj
for example usage.
Returns a function that takes arbitrary 'claims' (a map),
and produces signed-JWT data (a map of 3 keys - :header, :claims, :signature).
In addition, the returned map's metadata will contain the full :token
.
This function expects a ->json-bytes
fn as its first argument.
If you have jsonista
on your classpath, simply pass write-value-as-bytes
,
otherwise you can always compose - e.g. (comp (memfn ^String getBytes) clojure.data.json/write-str)
.
Not related to java.io.Reader
, this is kind-of the opposite of jws-producer
.
Returns a function that takes a JWS token (String), and returns it as a map, with
some potentially useful metadata - :token
(input arg) & :verify
(signature
verification predicate - takes the secret as its only arg).
Copyright © 2024 Dimitrios Piliouras
This program and the accompanying materials are made available under the terms of the Eclipse Public License 2.0 which is available at http://www.eclipse.org/legal/epl-2.0.
This Source Code may also be made available under the following Secondary Licenses when the conditions for such availability set forth in the Eclipse Public License, v. 2.0 are satisfied: GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version, with the GNU Classpath Exception which is available at https://www.gnu.org/software/classpath/license.html.
Can you improve this documentation? These fine people already did:
Dimitrios Piliouras & jimpilEdit on GitHub
cljdoc builds & hosts documentation for Clojure/Script libraries
Ctrl+k | Jump to recent docs |
← | Move to previous article |
→ | Move to next article |
Ctrl+/ | Jump to the search field |