@forrestjs/service-hasura-auth

5.2.2 • Public • Published

Fastify Hasura Auth

Adds Hasura Auth webhook compatible APIs.

With default settings you should configure your Hasura instance as:

HASURA_GRAPHQL_AUTH_HOOK=http://your-service.com/hasura-auth
HASURA_GRAPHQL_AUTH_HOOK_MODE=POST

Change the Default Prefix

const serviceFastify = require("@forrestjs/service-fastify");
const serviceHasuraAuth = require("@forrestjs/service-hasura-auth");

forrestjs.run({
  settings: {
    hasuraAuth: {
      // this is the default value
      prefix: "/hasura-auth"
    }
  },
  services: [serviceFastify, serviceHasuraAuth]
});

Setup a GET handler

The following example let you add a validation method to an Hasura GET Webhook:

const serviceFastify = require("@forrestjs/service-fastify");
const serviceHasuraAuth = require("@forrestjs/service-hasura-auth");

forrestjs.run({
  services: [serviceFastify, serviceHasuraAuth],
  features: [
    {
      target: "$HASURA_AUTH_GET",
      handler: {
        validate: async (request, reply) => {
          const userId = request.headers["x-user-id"];

          if (!userId) {
            throw new Error("User ID not found");
          }

          request.hasuraClaims.push("role", "user");
          request.hasuraClaims.push("user-id", userId);
        }
      }
    }
  ]
});

Setup a POST handler

The following example let you add a validation method to an Hasura POST Webhook:

const serviceFastify = require("@forrestjs/service-fastify");
const serviceHasuraAuth = require("@forrestjs/service-hasura-auth");

forrestjs.run({
  services: [serviceFastify, serviceHasuraAuth],
  features: [
    {
      target: "$HASURA_AUTH_POST",
      handler: {
        validate: async (request, reply) => {
          const userId = request.body.headers["x-user-id"];

          if (!userId) {
            throw new Error("User ID not found");
          }

          request.hasuraClaims.push("role", "user");
          request.hasuraClaims.push("user-id", userId);
        }
      }
    }
  ]
});

Please refer to Hasura POST Webhook documentation to figure out what's inside the request object.

The validate() Function

Use the validate() function to decorate your request with Hasura's claims:

request.hasuraClaims.push("role", "user");

or block the request by throwing a simple Javascript error:

throw new Error("Thy shall not pass!");
  • any claim you add will be serialized and automatically prefixed with x-hasura-{yourClaim} for your convenience
  • any Error will produce a 401 response status code accordingly to Hasura's specs

Configure your Route

When extending $HASURA_AUTH_GET or $HASURA_AUTH_POST you can pass all the Fastify's Route params that will be simply proxied to Fastify:

const myExtension = {
  target: "$HASURA_AUTH_POST",
  handler: {
    // Hasura Auth API:
    validate: (request, reply) => {},

    // Fastify API:
    preHandler: (request, reply) => {},
    schema: {}
  }
};

NOTE: You can not change method and handler, and url is defaulted to / but you can override it.

Package Sidebar

Install

npm i @forrestjs/service-hasura-auth

Weekly Downloads

434

Version

5.2.2

License

MIT

Unpacked Size

10.9 kB

Total Files

9

Last publish

Collaborators

  • marcopeg