Skip to content

The implementation of jsonwebtoken with knex as the storage

License

Notifications You must be signed in to change notification settings

aduyng/jwt-knex

Repository files navigation

jwt-knex

This library completely repeats the entire functionality of the library jsonwebtoken, with one important addition. jwt-knex allows you to store the token label in database with knex to verify validity. The absence of a token label in redis makes the token not valid. To destroy the token in jwt-knex, there is a destroy method. This makes it possible to make a token not valid until it expires.

The package is tested with oracledb but should be working just when passing an instance of knex in.

This package is inspired by jwt-redis

Installation

npm install jwt-knex

Support

This library is implemented as a part of other project and might contains bugs. Please create an issue on github, any contribution are welcomed.

Quick start

  1. Create and run the migration script with knex to create the required table

    knex migrate:make add_jwt_tables

    Enter the following code to create the table. Make sure you add JWT_ORACLE_TABLE_NAME to your environment variables:

    exports.up = (knex) =>
      knex.schema.createTable(process.env.JWT_ORACLE_TABLE_NAME, (table) => {
        table.string("key", 255).primary();
        table.bigInteger("expiredAt").unsigned().defaultTo(Number.MAX_SAFE_INTEGER);
      });
    
    exports.down = (knex) =>
      knex.schema.dropTable(process.env.JWT_ORACLE_TABLE_NAME);

    Run the migration script with knex.

    knex migrate:latest
  2. Added the jwt-knex package as in below:

    const knex = require("knex")(knexConfig);
    const JwtKnex = require("jwt-knex");
    
    const secretOrPrivateKey = "secret";
    const jwt = new JwtKnex({
      knex,
      secretOrPrivateKey,
      tableName: process.env.JWT_ORACLE_TABLE_NAME
    });
    
    const payload = {
      sub: "1234567890",
      name: "John Doe",
      admin: true,
      jti: "jti",
    };
    
    jwt
      .sign({ payload, expiresIn: "10h" })
      .then(token => jwt.verify({ token }))
      .then(() => jwt.destroy({ jti: payload.jti }));

// TODO: documenting the APIs

Contribution

  1. Clone this repo
  2. Start the docker compose
    docker-compose up
  3. Migrate the database
    npm run knex -- migrate:latest
  4. Run tests
    npm t

About

The implementation of jsonwebtoken with knex as the storage

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published