Использование Fastify JWT с postgraphile

Я пытаюсь настроить postgraphile с сервером fastify, и он работал, как ожидалось. Теперь я добавил промежуточное ПО для аутентификации с помощью плагина fastify-jwt в конечную точку graphql, предоставляемую postgraphile, но когда я обращаюсь к конечной точке graphql с помощью графической среды IDE, я смог увидеть схему и запросить данные без заголовка авторизации. Как заставить плагин fastify-jwt работать с postgraphile?

Вот мой код:

installPostgraphile.js

const { postgraphile } = require('postgraphile');
const PgSimplifyInflectorPlugin = require('@graphile-contrib/pg-simplify-inflector');

module.exports = async function (fastify) {
  fastify.log.info('Establishing PostgreSQL DB connection...');

  await fastify
    .use(
      postgraphile(
        'postgres://postgres:postgres@localhost:5432/demo',
        'app_public',
        {
          dynamicJson: true,
          appendPlugins: [PgSimplifyInflectorPlugin],
          enhanceGraphiql: process.env.NODE_ENV !== 'production' ? true : false,
          graphileBuildOptions: {
            nestedMutationsSimpleFieldNames: true,
            nestedMutationsDeleteOthers: false,
          },
          disableQueryLog: process.env.NODE_ENV !== 'production' ? true : false,
          graphiql: process.env.NODE_ENV !== 'production' ? true : false,
          watchPg: process.env.NODE_ENV !== 'production' ? true : false,
        }
      )
    )
    .ready((err) => {
      if (err) return fastify.log.error(err);
    });
};

server.js

const Fastify = require('fastify');
const helmet = require('fastify-helmet');
const cors = require('fastify-cors');
const JWT = require('fastify-jwt');
const fp = require('fastify-plugin');
const installPostgraphile = require('./installPostgraphile');

const app = Fastify({
  logger: true,
});

// Register Plugins
app.register(cors);
app.register(helmet);

app.register(JWT, {
  secret: 'supersecret',
});

app.post('/login', (req, reply) => {
  // some code to authenticate
  const token = instance.jwt.sign({ payload: { user: 'foo' } });
  reply.send(token);
});

app.decorate('authenticate', async function (request, reply) {
  try {
    // Autorization logic
    await request.jwtVerify();
  } catch (err) {
    reply.send(err);
  }
});

app.addHook('onRoute', (routeOptions) => {
  if (routeOptions.url === '/graphql') {
    routeOptions.preValidation = [app.authenticate];
  }
});

app.register(fp(installPostgraphile));

app.listen(process.env.PORT || 3000, (err) => {
  if (err) {
    app.log.error(err);
    process.exit(1);
  }
});

Любая помощь приветствуется.


person thotam    schedule 27.04.2020    source источник


Ответы (1)


Проблема: вы используете функцию промежуточного программного обеспечения fastify fastify.use(postgraphile...

Функции, зарегистрированные как промежуточное ПО, выполняются перед обработчиком preValidation, в который вы добавили логику app.authenticate.
документ о жизненном цикле показывает, что: как вы можете видеть, единственный обработчик, который запускается до промежуточного программного обеспечения, - это onRequest, поэтому вам следует изменить:

routeOptions.onRequest = [app.authenticate];
person Manuel Spigolon    schedule 28.04.2020
comment
Спасибо. Я попытался изменить код, как вы сказали. Но все же я вижу ту же проблему. app.addHook('onRoute', (routeOptions) => { if (routeOptions.url === '/graphql') { routeOptions.onRequest = [app.authenticate]; } - person thotam; 29.04.2020
comment
Не могли бы вы добавить журнал routeOptions? - person Manuel Spigolon; 29.04.2020