Как передать заголовок запроса для ускорения настроек плагина при регистрации

Я могу получить доступ к заголовку запроса при получении или после вызова

fastify.get('/route1',(req,res,next)=>{
  console.log(req.headers.Authorization)
  ...
}

Я ищу способ передать его в плагин зарегистрировать вызов, в частности, fastify-graphql

const { graphqlFastify } = require("fastify-graphql");
fastify.register(graphqlFastify,
         {
            prefix: "/graphql",
            graphql: {
                schema: schema,
                rootValue: resolvers,
                context:{auth:req.headers.Authorization}    <-----
            }
        },
        err => {
            if (err) {
                console.log(err);
                throw err;
            }
        }
 );

Есть ли способ написать обертку или какие-нибудь идеи?

0 ответов

Для тех, кому нужен доступ к заголовкам запросов в контексте graphql, попробуйте graphql-fastify

использование

Create /graphql endpoint like following

const graphqlFastify = require("graphql-fastify");

fastify.register(graphqlFastify, {
    prefix: "/graphql",
    graphQLOptions
});

graphQLOptions

graphQLOptions может быть предоставлен в виде объекта или функции, которая возвращает параметры graphql

graphQLOptions: {
    schema: schema,
    rootValue: resolver
    contextValue?: context
}

Если это функция, у вас есть доступ к http-запросу и ответу. Это позволяет вам выполнять аутентификацию и передавать области аутентификации в контекст graphql. Смотрите следующий псевдокод

const graphQLOptions = function (request,reply) {
    const auth = decodeBearerToken(request.headers.Authorization);
    // auth may contain userId, scope permissions

    return  {
         schema: schema,
         rootValue: resolver,
         contextValue: {auth}
     }
});

Таким образом, context.auth доступен для функций распознавателя, что позволяет вам проверить область действия / разрешения пользователя, прежде чем продолжить.

Я думаю, ты не можешь этого сделать.

Если вы прочитаете код, вы обнаружите, что:

Поэтому я думаю, что вы должны проверить auth-client со стандартным JWT, а затем использовать другой токен на стороне сервера.

Окончательное решение может быть проверить Apollo 2.0 и открыть вопрос на fastify-graphql.

Вот небольшой фрагмент, который объясняет идею:

const fastify = require('fastify')({ logger: true })
const { makeExecutableSchema } = require('graphql-tools')
const { graphiqlFastify, graphqlFastify } = require('fastify-graphql');


const typeDefs = `
type Query {
    demo: String,
    hello: String
}
`
const resolvers = {
  Query: {
    demo: (parent, args, context) => {
      console.log({ args, context });
      return 'demo'
    },
    hello: () => 'world'
  }
}

const schema = makeExecutableSchema({ typeDefs, resolvers })

fastify.register(graphqlFastify, {
  prefix: '/gr',
  graphql: {
    schema,
    context: function () {
      return { serverAuth: 'TOKEN' }
    },
  },
});

fastify.listen(3000)

// curl -X POST 'http://localhost:3000/gr' -H 'Content-Type: application/json' -d '{"query": "{ demo }"}'
Другие вопросы по тегам