Materno
Materno

Reputation: 353

Fastify pass custom parameter to preHandler

I'm just learning fastify and I'm not sure how to achieve what I want: I have this route:

this.fastify.get('/ping', {
    preHandler: [
        this.fastify.jwtVerify,
    ],
}, this.configHandler.getConfiguration.bind(this.configHandler));

The pre handler does get executed and contains the known parameters like the request and the reply.

I want to pass a custom parameter to my preHandler function. Currently the preHandler is verifying the jwt token passed in the auth header. What I want to achieve is to pass scopes to the handler which may also be checked.

My preHandler currently is a plugin registered like this:

const jwtVerifyPlugin: FastifyPluginAsync = async (fastify: FastifyInstance, options: FastifyPluginOptions) => {
    fastify.decorate('jwtVerify', async function (request: FastifyRequest, reply: FastifyReply) {
       //jwtVerficiation happens here
       //scope verification should follow
    })
}

So overall: I have to add scopes somewhere at the route and I have to get those scopes somwhere inside my preHandler.

Any idea how I can do that?

Thanks!

Upvotes: 0

Views: 2346

Answers (1)

Marko
Marko

Reputation: 1000

You can define your decorate function like this:

const jwtVerifyPlugin: FastifyPluginAsync = async (fastify: FastifyInstance, options: FastifyPluginOptions) => {
    fastify.decorate('jwtVerify', function (options?: { scopes?: string[] }) {
        return async function (request: FastifyRequest, reply: FastifyReply, done: HookHandlerDoneFunction) {
            if (options?.scopes) {
                // access scopes here
            }
            done();
        };
      })
}

and then use it like this:

this.fastify.get('/ping', {
    preHandler: [
        this.fastify.jwtVerify({ scopes: ['admin'] }),
    ],
}, this.configHandler.getConfiguration.bind(this.configHandler));

Upvotes: 3

Related Questions