Как получить заголовок HTTP-авторизации с Express и Apollo-Server - PullRequest
0 голосов
/ 05 мая 2020

Я не могу получить доступ к заголовку «Авторизация» в каждом HTTP-запросе на моем Apollo-сервере, реализованном с помощью express. Вот моя настройка express, Apollo-Server, CORS и др. c.

const corsConfig = {
  credentials: true,
  allowedHeaders: ['Authorization'],
  exposedHeaders: ['Authorization']
};

const app = express()

const server = new ApolloServer({
    schema,
    context: ({ req }) => {
      return {
        req
      };
    }
  });

server.applyMiddleware({
  app,
  path,
  cors: corsConfig
});

http.createServer(app).listen(port, () => logger.info(`Service started on port ${port}`));

И внутри моих преобразователей я ввожу контекст, в частности объект req (это пример graphQL преобразователь конечных точек):

const exampleQuery = async (parent, input , { req }) => {
    console.log(req.headers); 
    /*
    The output of this log:
      {
        'content-type': 'application/json',
         accept: '*/*',
        'content-length': '59',
        'user-agent': 'node-fetch/1.0 (+https://github.com/bitinn/node-fetch)',
        'accept-encoding': 'gzip,deflate',
         connection: 'close',
         host: 'localhost:3301',
        'Access-Control-Allow-Headers': 'Authorization',
        'Access-Control-Expose-Headers': 'Authorization'
    }

    */
}

Я отправил запросы на эту конечную точку с заголовком «Авторизация», содержащим токен в качестве значения. Однако заголовка авторизации нет в объекте req.headers (на самом деле, его нет и во всем объекте req). Я уверен, что мои HTTP-запросы Postman / Insomnia к этой конечной точке отправляют заголовок авторизации, однако, похоже, он не проходит через мой Apollo-Server. Кто-нибудь знает, почему заголовок авторизации не проходит? для передачи заголовка авторизации отдельным микросервисам, где находятся преобразователи. Вы должны добавить функцию buildService внутри конструктора ApolloGateway, где вы указываете, что RemoteGraphQLDataSource будетSendRequest of context.req.headers.authentication для базовых микросервисов

1 Ответ

0 голосов
/ 06 мая 2020

Работает, как ожидалось, например

server.ts:

import { ApolloServer, gql, makeExecutableSchema } from 'apollo-server-express';
import express from 'express';
import http from 'http';

const corsConfig = {
  credentials: true,
  allowedHeaders: ['Authorization'],
  exposedHeaders: ['Authorization'],
};

const typeDefs = gql`
  type Query {
    hello: String
  }
`;
const resolvers = {
  Query: {
    hello: (_, __, { req }) => {
      console.log(req.headers);
      return 'world';
    },
  },
};
const schema = makeExecutableSchema({ typeDefs, resolvers });

const app = express();
const path = '/graphql';
const port = 3000;
const server = new ApolloServer({
  schema,
  context: ({ req }) => {
    return {
      req,
    };
  },
});
server.applyMiddleware({ app, path, cors: corsConfig });

http.createServer(app).listen(port, () => console.info(`Service started on port ${port}`));

Отправить HTTP-запрос GraphQL-запроса через curl:

curl -X POST -H "Content-Type: application/json" -H "Authorization: Bearer abc123" --data '{ "query": "{ hello }" }' http://localhost:3000/graphql
{"data":{"hello":"world"}}

Журналы на стороне сервера :

Service started on port 3000
{ host: 'localhost:3000',
  'user-agent': 'curl/7.54.0',
  accept: '*/*',
  'content-type': 'application/json',
  authorization: 'Bearer abc123',
  'content-length': '24' }
...