(Ya hago fbStrategy.passReqToCallback = true
) Estoy copiando https://scotch.io/tutorials/easy-node-authentication-linking-all-accounts-together pero quiero usar este servicio de autenticación social para múltiples aplicaciones, ej. : el que controla el sistema de calefacción, el que enciende los aspersores, etc.
Básicamente, si una de estas aplicaciones verifica con el servidor y no tiene un token correcto, se redirige a este servicio de autenticación social (social-auth). Cuando el usuario presiona los botones de inicio de sesión social, toma el parámetro de qué aplicación proviene y lo agrega como parámetro para /auth/facebook/:appid
// send to facebook to do the authentication app.get('/auth/facebook/:appId', function(req,res,next){ passport.authenticate( 'facebook', { scope : 'email' } )(req,res,next); });
req
of req,res,next
es el registro de usuario serializado. En este punto, social-auth no sabe quién es el usuario.
fbStrategy.passReqToCallback = true; passport.use(new FacebookStrategy(fbStrategy, function(req, token, refreshToken, profile, done) { var email = (profile.emails[0].value || '').toLowerCase() process.nextTick(function() {...
Una vez que se completa la autorización, quiero redirigir de nuevo a la aplicación de llamada y necesito el :appId
para continuar y poder volver al sitio correcto.
Ahora, en general, funcionaría si solo hiciera que una variable como currentAppId
accesible para las diversas estrategias sociales, pero si tiene varias personas que se autentican al mismo tiempo, es posible que un usuario regrese a la aplicación incorrecta o alguna otra aplicación de usuarios. Es por eso que necesito appId
para viajar como parámetro para passport.authenticate
. ¿Dónde debo mirar para averiguar cómo? ¿Podría envolver passport.authenticate
. autenticar o modificar las cosas de otra manera?
Puede usar la solicitud en sí para transferir algunos parámetros adicionales desde y hacia la función de estrategia. En el siguiente ejemplo, los dos parámetros _toParam
y _fromParam
se utilizan para este problema.
app.get('/auth/facebook/:appId', function(req,res,next){ req._toParam = 'Hello'; passport.authenticate( 'facebook', { scope : 'email' } )(req,res,next); }) fbStrategy.passReqToCallback = true; passport.use(new FacebookStrategy(fbStrategy, function(req, token, refreshToken, profile, done) { console.log(req._toParam); req._fromParam = 'Hello 2'; var email = (profile.emails[0].value || '').toLowerCase() process.nextTick(function() {...
Si necesita almacenar la identificación para futuras solicitudes, puede usar un mapa con el socket de la solicitud actual como clave.
En mi caso, debido al flujo de autenticación, configurar una variable en req
no funcionaba.
La segunda opción, establecer passReqToCallBack: true
me estaba dando muchos problemas, por lo que tampoco era una opción. Puede encontrar más información aquí .
La solución me llegó después de la respuesta que Dhiraj publicó en el hilo anterior, configuré una sola cadena en el state
y pude usar la cadena en las devoluciones de llamada.
login: (req, res, next) => passport.authenticate('google', { scope: ['profile', 'email'], state: req.query.username }, () => next())(req, res, next), onSuccess: async(req, res) => { console.log(req.query.state) },