Как убрать аутентификацию для запроса на самоанализ в Graphql - PullRequest
1 голос
/ 26 мая 2019

Может быть, это очень простой вопрос, поэтому, пожалуйста, потерпите меня.Позвольте мне объяснить, что я делаю и что мне действительно нужно.


ОБЪЯСНЕНИЕ


Я создал сервер Graphql с помощью ApolloGraphql (модуль apollo-server-express npm).

Вот фрагмент кода, чтобы дать вам представление.

api.js

import express from 'express'
import rootSchema from './root-schema'
.... // some extra code
app = express.router()
app.use(jwtaAuthenticator) // --> this code authenticates Authorization header
.... // some more middleware's added
const graphQLServer = new ApolloServer({
  schema: rootSchema, // --> this is root schema object
  context: context => context,
  introspection: true, 
})
graphQLServer.applyMiddleware({ app, path: '/graphql' })

server.js

import http from 'http'
import express from 'express'
import apiRouter from './api' // --> the above file
const app = express()
app.use([some middlewares])
app.use('/', apiRouter)
....
....
export async function init () {

try {
  const httpServer = http.createServer(app)
  httpServer
    .listen(PORT)
    .on('error', (err) => { setTimeout(() => process.exit(1), 5000) })
  } catch (err) {
    setTimeout(() => process.exit(1), 5000)
  }
  console.log('Server started --- ', PORT)
}
export default app

index.js

require('babel-core')
require('babel-polyfill')
require = require('esm')(module/* , options */)
const server = require('./server.js') // --> the above file

server.init()

ПОСТАНОВКА ЗАДАЧИ


Я использую узел index.js для запуска приложения.Итак, приложение ожидает, что заголовок Authorization (токен JWT) будет присутствовать постоянно, даже для запроса introspection .Но это не то, что я хочу, я хочу, чтобы запрос самоанализа был разрешен даже без токена.Чтобы каждый мог ознакомиться с документацией.

Пожалуйста, пролите немного света и, пожалуйста, укажите, как лучше всего это сделать.Удачного кодирования:)

Ответы [ 2 ]

1 голос
/ 27 мая 2019

Существует множество различных способов обработки авторизации в GraphQL, как показано в документах :

  • Добавление промежуточного программного обеспечения для express (или другого фреймворка, например hapi или koa)
  • Проверка авторизации внутри отдельных распознавателей
  • Проверка авторизации внутри ваших моделей данных
  • Использование пользовательских директив

Добавление промежуточного ПО Express отлично подходит для предотвращения несанкционированного доступа ко всей вашей схеме. Если вы хотите разрешить неаутентифицированный доступ к некоторым полям, но не к другим, как правило, рекомендуется переместить логику авторизации со слоя структуры на уровень GraphQL или модель данных, используя один из указанных выше методов.

0 голосов
/ 04 июня 2019

Итак, наконец, я нашел решение, и вот что я сделал.

Позвольте мне сначала сказать, что было добавлено 2 промежуточных продукта на базовый путь ,Например:

app //--> this is express.Router()
  .use(jwtMw) // ---> these are middlewares
  .use(otherMw)

jwtMw - это тот, который проверяет аутентификацию пользователя , и поскольку даже introspection запрос попадает подэтот MW, он также аутентифицировал , что также.Итак, после некоторых исследований я нашел это решение:

jwtMw.js

function addJWTMeta (req, res, next) {
   // we can check for null OR undefined and all, then check for query Introspection, with better condition like with ignore case
   if (req.body.query.trim().startsWith('query Introspection')) {
      req.isIntrospection = true
      return next()
   }
   ...
   ...
   // ---> extra code to do authentication of the USER based on the Authorization header
}
export default addJWTMeta

otherMw.js

function otherMw (req, res, next) {
  if (req.isIntrospection) return next()
  ...
  ...
  // ---> extra code to do some other context creation
}
export default otherMw

Итак, здесь, в jwtMw.js , мы проверяем, что если запрос - это Интроспекция , просто добавьте переменную в req объект и перейдите вперед, а затем в следующее промежуточное ПО.после jwtMw.js тот, кто захочет проверить запрос на самоанализ, просто проверит для этой переменной (в данном случае isIntrospection) , и если она присутствует и true Пожалуйста, продолжайте.Мы можем добавить этот код и масштабировать к каждому промежуточному программному обеспечению , что, если req.isIntrospection , просто продолжить или выполнить фактическую обработку иначе.

Удачное кодирование:)

...