Create and verify JSON Web Tokens with Deno or the browser.
Please use the native
Web Crypto API
to generate a secure CryptoKey.
const key = await crypto.subtle.generateKey(
{ name: "HMAC", hash: "SHA-512" },
true,
["sign", "verify"],
);Takes Header, Payload and CryptoKey and returns the url-safe encoded
jwt.
import { create } from "https://deno.land/x/djwt@$VERSION/mod.ts";
const jwt = await create({ alg: "HS512", typ: "JWT" }, { foo: "bar" }, key);Takes jwt, CryptoKey and VerifyOptions and returns the Payload of the
jwt if the jwt is valid. Otherwise it throws an Error.
import { verify } from "https://deno.land/x/djwt@$VERSION/mod.ts";
const payload = await verify(jwt, key); // { foo: "bar" }Takes a jwt and returns a 3-tuple
[header: unknown, payload: unknown, signature: Uint8Array] if the jwt has a
valid serialization. Otherwise it throws an Error. This function does
not verify the digital signature.
import { decode } from "https://deno.land/x/djwt@$VERSION/mod.ts";
const [header, payload, signature] = decode(jwt);This helper function simplifies setting a
NumericDate. It takes either a
Date object or a number (in seconds) and returns the number of seconds from
1970-01-01T00:00:00Z UTC until the specified UTC date/time.
// A specific date:
const exp = getNumericDate(new Date("2025-07-01"));
// One hour from now:
const nbf = getNumericDate(60 * 60);The optional exp (expiration time) claim in the payload identifies the
expiration time on or after which the JWT must not be accepted for processing.
Its value must be a number containing a NumericDate value. This module
checks if the current date/time is before the expiration date/time listed in the
exp claim.
const jwt = await create(header, { exp: getNumericDate(60 * 60) }, key);The optional nbf (not before) claim identifies the time before which the jwt
must not be accepted for processing. Its value must be a number containing a
NumericDate value.
The optional aud (audience) claim identifies the recipients that the JWT is
intended for. By passing the option audience with the type
string | string[] | RegExp to verify, this application tries to identify the
recipient with a value in the aud claim. If the values don't match, an Error
is thrown.
The following signature and MAC algorithms have been implemented:
- HS256 (HMAC SHA-256)
- HS384 (HMAC SHA-384)
- HS512 (HMAC SHA-512)
- RS256 (RSASSA-PKCS1-v1_5 SHA-256)
- RS384 (RSASSA-PKCS1-v1_5 SHA-384)
- RS512 (RSASSA-PKCS1-v1_5 SHA-512)
- PS256 (RSASSA-PSS SHA-256)
- PS384 (RSASSA-PSS SHA-384)
- PS512 (RSASSA-PSS SHA-512)
- ES256 (ECDSA using P-256 and SHA-256)
- ES384 (ECDSA using P-384 and SHA-384)
- ES512 (ECDSA using P-521 and SHA-512) (Not supported yet!)
- none (Unsecured JWTs).
This application uses the JWS Compact Serialization only.
The following projects use djwt:
- Oak Middleware JWT
- deno_rest: A Boilerplate for deno RESTful apis
Feel free to ask questions and start discussions in our discord server.
We welcome and appreciate all contributions to djwt.
A big Thank You to timreichen and all the other amazing contributors.