Como usar assinaturas-transporte-ws com passaporte e sessão expressa
Estou usando uma estratégia local de passaporte que funciona bem com o express:
passport.use(localStrategy);
passport.serializeUser((user, done) => done(null, JSON.stringify(user)));
passport.deserializeUser((obj, done) => done(null, JSON.parse(obj)));
app.use(passport.initialize());
app.use(passport.session());
Esse localStrategy está fazendo uma chamada do Mongoose para obter o usuário com base em sua publicação pubey e acho que request.user é preenchido dessa maneira.
Eu configurei meu ponto final do graphql assim:
app.use('/graphql', bodyParser.json(), graphqlExpress(request => ({
debug: true,
schema,
context: {
user: request.user,
req: request,
},
formatError: (e) => {
console.log(JSON.stringify(e, null, 2));
return e;
},
})));
E minhas assinaturas desta maneira:
const ws = createServer(app);
// Run the server
ws.listen(settings.APP_PORT, () => {
console.log(`App listening on port ${settings.APP_PORT}!`);
// Set up the WebSocket for handling GraphQL subscriptions
new SubscriptionServer({
execute,
subscribe,
schema,
onConnect: (connectionParams, webSocket) => {
console.log(webSocket.upgradeReq);
return { user: connectionParams };
},
}, {
server: ws,
path: '/subscriptions',
});
});
Minha sessão está funcionando bem em consultas e mutações no graphql. Mas não com minhas assinaturas.
Meu objetivo é ter acesso à minha sessão de usuário no contexto do resolvedor de assinaturas. Talvez eu precise acessar algo como request.user no onConnect para preencher o contexto, mas não sei como fazer.