Настройка защищенного (wss) сервера веб-сокетов с Apollo и GraphQL

Я использую следующий шаблон для настройки соединения через websockets для подписок Apollo/GraphQL:

import express from 'express';
import {
  graphqlExpress,
  graphiqlExpress,
} from 'apollo-server-express';
import bodyParser from 'body-parser';
import cors from 'cors';
import { execute, subscribe } from 'graphql';
import { createServer } from 'http';
import { SubscriptionServer } from 'subscriptions-transport-ws';

import { schema } from './src/schema';

const PORT = 3000;
const server = express();

server.use('*', cors({ origin: `http://localhost:${PORT}` }));

server.use('/graphql', bodyParser.json(), graphqlExpress({
  schema
}));

server.use('/graphiql', graphiqlExpress({
  endpointURL: '/graphql',
  subscriptionsEndpoint: `ws://localhost:${PORT}/subscriptions`
}));

// Wrap the Express server
const ws = createServer(server);
ws.listen(PORT, () => {
console.log(`Apollo Server is now running on http://localhost:${PORT}`);
  // Set up the WebSocket for handling GraphQL subscriptions
  new SubscriptionServer({
    execute,
    subscribe,
    schema
  }, {
    server: ws,
    path: '/subscriptions',
  });
});

Как я могу изменить соединение, чтобы использовать протокол защищенных веб-сокетов? Простое изменение "ws://" на "wss://" не работает.

2 ответа

Я сделал образец для graphql-subscription безопасное соединение через websocket.

Вот ссылка: https://github.com/mrdulin/apollo-server-express-starter/tree/master/src/subscription/wss-with-nodejs-server

Ключевым моментом является то, что вам нужно tls или же ssl полномочия.

Для разработки вы можете создавать самоподписанные учетные данные, используя openssl,

Вам нужно использовать https вместо http пакет. Вам также необходимо иметь сертификат. Eather самоподписанный или из центра сертификации.

Это может выглядеть так:

import { createServer } from 'https';

...

// load / get certificate

...

const wss = createServer(sslCredentails, server);
wss.listen(PORT, () => {
console.log(`Apollo Server is now running on https://localhost:${PORT}`);
  // Set up the WebSocket for handling GraphQL subscriptions
  new SubscriptionServer({
    execute,
    subscribe,
    schema
  }, {
    server: wss,
    path: '/subscriptions',
  });
});

Другие вопросы по тегам