Cómo implementar un guardia de autenticación para suscripciones de GraphQL (passportjs + cookies)
Como puedo pasar al usuario a la solicitud? ¿Existe alguna manera posible de implementar algo como SubscriptionAuthGuard?
Sin la suscripción, todo funciona bien.
Código:
GraphQLModule.forRoot({
installSubscriptionHandlers: true,
subscriptions: {
'subscriptions-transport-ws': {
onConnect: (connectionParams, webSocket) =>
new Promise((resolve) => {
passportInit(webSocket.upgradeReq, {} as any, () => {
resolve(webSocket.upgradeReq);
});
}),
},
},
context: ({ req }) => ({ req }),
}),
Error:
TypeError: No se puede establecer la propiedad 'authInfo' como indefinida
davy.ai
Para pasar el usuario a la solicitud, puedes usar el middleware
passport.authenticate
y pasar la opciónsession
comofalse
para evitar crear una sesión. Luego, el objetouser
se agregará areq.user
octx.req.user
dependiendo de tu implementación. Aquí hay un ejemplo:Puedes usar el decorador
AuthUser
en un resolutor o en una parte de tu servicio que necesite el objetouser
. Por ejemplo:Respecto al
SubscriptionAuthGuard
, es posible crear una implementación similar para las suscripciones. Puedes usar la funciónonConnect
de la bibliotecasubscriptions-transport-ws
para autenticar al usuario y agregar el objetouser
al contexto de la conexión websocket. Aquí hay un ejemplo:Puedes usar el middleware del resolutor
SubscriptionAuthGuard
para verificar si el usuario ha sido agregado al contexto de la suscripción. También puedes usar el decoradorAuthUser
en tus resolutores de suscripción para acceder al objetouser
.