我有一个带有一些中间件的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上下文中。但是,尤其是与身份验证有关的时候,我不想发布自己的版本来运行相关的中间件,也不愿复制整个身份验证。
执行此操作的好方法是什么?我想对webSocket.upgradeReq
应用一系列中间件(至少到目前为止,我已经确定相关的中间件不涉及响应),使其尽可能适合常规流程。我正在考虑
但是我对这一切还不够熟悉,以至于无法确定什么是最佳途径。