Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

fastify-jwt-jwks

nearform141.6kApache-2.02.0.2TypeScript support: included

JWT JWKS verification plugin for Fastify

fastify, fastify-plugin

readme

fastify-jwt-jwks

Package Version ci

JSON Web Key Set (JWKS) verification plugin for Fastify, internally uses @fastify/jwt.

Note

JSON Web Key Sets (JWKS) are used to verify that a signed JWT originated from a particular authorization server, and that the token hasn't been tampered with. If you are looking to implement JWT authentication in your Fastify application you may be looking for @fastify/jwt.

Installation

Just run:

npm install fastify-jwt-jwks --save

Usage

Register as a plugin, providing one or more of the following options:

  • jwksUrl: JSON Web Key Set url (JWKS). The public endpoint returning the set of keys that contain amongst other things the keys needed to verify JSON Web Tokens (JWT). Eg. https://domain.com/.well-known/jwks.json
  • audience: The intended consumer of the token. This is typically a set of endpoints at which the token can be used. If you provide the value true, the domain will be also used as audience. Accepts a string value, or an array of strings for multiple audiences.
  • issuer: The domain of the system which is issuing OAuth access tokens. By default the domain will be also used as audience. Accepts a string value, or an array of strings for multiple issuers.
  • secret: The OAuth client secret. It enables verification of HS256 encoded JWT tokens.
  • complete: If to return also the header and signature of the verified token.
  • secretsTtl: How long (in milliseconds) to cache RS256 secrets before getting them again using well known JWKS URLS. Setting to 0 or less disables the cache. Defaults to 1 week.
  • cookie: Used to indicate that the token can be passed using cookie, instead of the Authorization header.
    • cookieName: The name of the cookie.
    • signed: Indicates whether the cookie is signed or not. If set to true, the JWT will be verified using the unsigned value.
  • namespace: A string used to namespace the decorators of this plugin. This is to allow this plugin to be applied multiple times to a single Fastify instance. See the description of the namespace parameter in @fastify/jwt.

Since this plugin is based on the @fastify/jwt verify, it is also possibile to pass the options documented here, see the example below.

Once registered, your fastify instance and request will be decorated as describe by @fastify/jwt.

In addition, the request will also get the authenticate decorator.

This decorator can be used as preValidation hook to add authenticate to your routes. The token information will be available in request.user.

Example:

const fastify = require('fastify')
const server = fastify()

await server.register(require('fastify-jwt-jwks'), {
  jwksUrl: '<JWKS url>',
  audience: '<app audience>'
})

server.get('/verify', { preValidation: server.authenticate }, (request, reply) => {
  reply.send(request.user)
})

server.listen(0, err => {
  if (err) {
    throw err
  }
})

You can configure there to be more than one JWT API audience:

await server.register(require('fastify-jwt-jwks'), {
  jwksUrl: '<JWKS url>',
  audience: ['<app audience>', '<admin audience>']
})

You can include @fastify/jwt verify options:

await server.register(require('fastify-jwt-jwks'), {
  jwksUrl: '<JWKS url>',
  audience: ['<app audience>', '<admin audience>'],
  cache: true, // @fastify/jwt cache
  cacheTTL: 100, // @fastify/jwt cache ttl
  errorCacheTTL: -1 // @fastify/jwt error cache ttl
})

You can also use the namespace option to apply this plugin multiple times to the same Fastify instance, in order to perform JWT verification with different JWKs URLs:

await server.register(require('fastify-jwt-jwks'), {
  jwksUrl: '<JWKS url>',
  audience: '<app audience>'
})

await server.register(require('fastify-jwt-jwks'), {
  jwksUrl: '<JWKS url 2>',
  audience: '<app audience 2>',
  namespace: 'newToken'
})

server.get('/verify',
  {
    preValidation: async function (request, reply) {
      try {
        await server.authenticate()
      } catch (err) {
        await server.newTokenAuthenticate()
      }
    }
  },
  (request, reply) => { reply.send(request.user) }
)

Contributing

See CONTRIBUTING.md

Developer notes

Tests

Tests are currently split into unit and integration tests.

License

Copyright NearForm Ltd. Licensed under the Apache-2.0 license.

changelog

2020-12-01 / 0.4.0

  • feat: Merge pull request #43 from nearform/chore/cli-example
  • chore: add cli example
  • feat: Merge pull request #42 from nearform/dependabot/npm_and_yarn/prettier-2.2.1
  • chore(deps-dev): Bump prettier from 2.2.0 to 2.2.1
  • fix: Merge pull request #41 from nearform/fix/close-cache
  • chore: switch to node-fetch
  • fix: close cache on server close
  • feat: Merge pull request #38 from nearform/dependabot/npm_and_yarn/eslint-plugin-standard-5.0.0
  • feat: Merge pull request #37 from nearform/dependabot/npm_and_yarn/eslint-7.14.0
  • chore(deps-dev): Bump eslint-plugin-standard from 4.1.0 to 5.0.0
  • chore(deps-dev): Bump eslint from 7.13.0 to 7.14.0
  • feat: Merge pull request #36 from nearform/dependabot/npm_and_yarn/prettier-2.2.0
  • chore(deps-dev): Bump prettier from 2.1.2 to 2.2.0
  • feat: Merge pull request #35 from nearform/dependabot/npm_and_yarn/eslint-config-standard-16.0.2
  • chore(deps-dev): Bump eslint-config-standard from 16.0.1 to 16.0.2
  • feat: Update ci.yml
  • feat: Merge pull request #33 from nearform/dependabot/npm_and_yarn/eslint-config-standard-16.0.1
  • chore(deps-dev): Bump eslint-config-standard from 14.1.1 to 16.0.1
  • fix: Merge pull request #34 from nearform/fix-typo
  • feat: Fix typo in CI
  • feat: Use auto merge action (#32)
  • feat: Merge pull request #20 from nearform/dependabot/npm_and_yarn/eslint-7.13.0
  • chore(deps-dev): Bump eslint from 7.5.0 to 7.13.0
  • chore: run ci only on PR (#31)
  • feat: Merge pull request #30 from nearform/dependabot/npm_and_yarn/fastify-plugin-3.0.0
  • feat: Merge pull request #29 from nearform/dependabot/npm_and_yarn/nock-13.0.5
  • chore(deps): Bump fastify-plugin from 2.0.1 to 3.0.0
  • feat: Merge pull request #28 from nearform/dependabot/npm_and_yarn/got-11.8.0
  • chore(deps-dev): Bump nock from 13.0.2 to 13.0.5
  • chore(deps): Bump got from 11.5.1 to 11.8.0
  • feat: Merge pull request #26 from nearform/dependabot/npm_and_yarn/fastify-3.8.0
  • feat: Merge pull request #27 from nearform/dependabot/npm_and_yarn/eslint-config-standard-14.1.1
  • feat: Merge pull request #25 from nearform/dependabot/npm_and_yarn/eslint-plugin-import-2.22.1
  • feat: Merge pull request #23 from nearform/dependabot/npm_and_yarn/eslint-plugin-standard-4.1.0
  • feat: Merge pull request #24 from nearform/dependabot/npm_and_yarn/jest-26.6.3
  • feat: Merge pull request #22 from nearform/dependabot/npm_and_yarn/fastify-jwt-2.1.3
  • chore(deps-dev): Bump eslint-config-standard from 14.1.0 to 14.1.1
  • feat: Merge pull request #21 from nearform/dependabot/npm_and_yarn/node-cache-5.1.2
  • chore(deps-dev): Bump fastify from 3.1.1 to 3.8.0
  • chore(deps-dev): Bump eslint-plugin-import from 2.18.2 to 2.22.1
  • feat: Merge pull request #19 from nearform/dependabot/npm_and_yarn/prettier-2.1.2
  • chore(deps-dev): Bump jest from 26.1.0 to 26.6.3
  • feat: Merge pull request #18 from nearform/dependabot/npm_and_yarn/http-errors-1.8.0
  • chore(deps-dev): Bump eslint-plugin-standard from 4.0.1 to 4.1.0
  • chore(deps): Bump fastify-jwt from 2.1.2 to 2.1.3
  • chore(deps): Bump node-cache from 5.0.1 to 5.1.2
  • chore(deps-dev): Bump prettier from 2.0.5 to 2.1.2
  • chore(deps): Bump http-errors from 1.7.3 to 1.8.0
  • chore: dependabot auto merge (#17)
  • chore(deps): Bump find-my-way from 3.0.1 to 3.0.5 (#16)

2019-11-20 / 0.2.0

  • chore: Added CHANGELOG.md
  • fix: Switch to got for HTTP fetching. Fixes #5.
  • chore: Fix README example. Fixes #5.

2019-11-20 / 0.1.0

  • chore: Disable coverage.
  • chore: Remove codecov.
  • chore: Add GitHub CI action.
  • fix: Throw in case of bad options. Fixes #3.
  • fix: Do not swallow errors. Fixes #4.
  • feat: Introduce RS256 key caching. Closes #2.
  • feat: Use strict mode. Closes #1.
  • feat: Initial commit.