Как передать заголовок запроса для ускорения настроек плагина при регистрации
Я могу получить доступ к заголовку запроса при получении или после вызова
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 доступен для функций распознавателя, что позволяет вам проверить область действия / разрешения пользователя, прежде чем продолжить.
Я думаю, ты не можешь этого сделать.
Если вы прочитаете код, вы обнаружите, что:
- fastify-graphql вызывает
runHttpQuery
- runHttpQuery вызывает
context
без прохождения запроса
Поэтому я думаю, что вы должны проверить 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 }"}'