У меня есть приложение Express с некоторыми промежуточными программами и сервер Apollo с подписками. Я думаю, что это должен быть соответствующий код установки:
const app = express();
const ws = createServer(app);
app.use(cookieParser());
app.use(
expressJwt({
secret: config.auth.jwt.secret,
credentialsRequired: false,
getToken: req => req.cookies.id_token,
}),
);
app.use(passport.initialize());
const server = new ApolloServer({
...schema,
subscriptions: {
path: '/subscriptions',
onConnect: (connectionParams, webSocket) => {
// TODO
return {};
},
},
});
server.applyMiddleware({ app });
server.installSubscriptionHandlers(ws);
JWT сохраняется в файле cookie и извлекается и обрабатывается cookieParser()
и expressJwt(...)
. На TODO
у меня есть доступ к webSocket.upgradeReq.headers.cookie
, и я мог бы сделать это и здесь, чтобы добавить его в контекст веб-сокета. Тем не менее, особенно в связи с аутентификацией, я бы предпочел не использовать свою собственную версию соответствующего промежуточного программного обеспечения или дублировать всю аутентификацию.
Какой хороший способ сделать это? Я хочу применить серию промежуточного программного обеспечения к webSocket.upgradeReq
(по крайней мере, промежуточное программное обеспечение, которое я определил как релевантное до сих пор, не касайтесь ответа), насколько это возможно, в соответствии с обычным процессом. Я рассматриваю
- с использованием библиотеки (я видел express-websocket , но он кажется бездействующим, а вещи с буфером - жуткими),
- создание второго экземпляра Express и подключение чего-либо,
- с использованием одного компонента из Express (Router?),
- вызов промежуточного программного обеспечения вручную,
но я недостаточно знаком со всем этим, чтобы понять, какой маршрут лучше.