Сервер Apollo с паспортом JWT - PullRequest
       20

Сервер Apollo с паспортом JWT

0 голосов
/ 18 сентября 2018

Я пытаюсь реализовать graphql с JWT для паспорта, но поведение не то, что я ожидаю.

Конечная точка graphql не должна закрываться при аутентификации, так как несколько запросов являются открытыми, яМне было интересно, как я могу сделать GraphQL открытым и отфильтровать внутренне, если пользователь вошел в систему с помощью распознавателей?

Это мой код прямо сейчас, он работает правильно с JWT, но он закрывает конечную точку graphql и возвращает "Unauthorized""если я не укажу токен.

import express from 'express'
import { ApolloServer } from 'apollo-server-express'

import passport from 'passport'
import passportJWT from 'passport-jwt'

import schema from './schemas'

const { JWT_SECRET } = process.env

const path = '/graphql'

// ...

const users = [
  {
    id: 1,
    name: 'John',
    email: 'john@mail.com',
    password: 'john123'
  },
  {
    id: 2,
    name: 'Sarah',
    email: 'sarah@mail.com',
    password: 'sarah123'
  }
]

// ...

const { Strategy, ExtractJwt } = passportJWT

const params = {
  secretOrKey: JWT_SECRET,
  jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken()
}

// ...

const strategy = new Strategy(params, (payload, done) => {
  const user = users[payload.id] || null

  if (user) {
    return done(null, {
      id: user.id
    })
  }

  return done(new Error('The user has not been found'), null)
})

passport.use(strategy)

// ...

const app = express()

passport.initialize()

app.use(path, passport.authenticate('jwt', { session: false }))

// ...

const server = new ApolloServer({
  schema
})

server.applyMiddleware({
  app,
  path
})

app.listen(
  {
    port: 4000
  },
  () => console.log(`The GraphQL server is running on port ${GRAPHQL_PORT}`)
)

1 Ответ

0 голосов
/ 19 сентября 2018

Если JWTToken отсутствует, passport-jwt завершится ошибкой с несанкционированным статусом, переданным в информацию. Вы можете обращаться с ними, как показано ниже

app.use(path, bodyParser.json(), function(req, res, next) {
    passport.authenticate('jwt', (err, user, info) => {
        if (err) { res.status(500).send({"error": err}); return; }
        next();
    })(req, res, next);
});
...