2015-09-24 27 views
6

Sto utilizzando passport-facebook per accedere a una webapp stack MEAN. Dopo il login riuscito, voglio generare un token Web JSON (jwt) e reindirizzare a una pagina nella mia SPA. (res.redirect ('/ #/posts /' + doc.generateJWT()); - vedere il codice associato di seguito).Come restituire token web json (jwt) con passport-facebook senza mostrarlo nell'URL di reindirizzamento

La mia domanda è: Come si invia il JWT alla pagina di reindirizzamento senza mostrarlo nell'URL?

Codice:

passport.serializeUser(function(user, done) { 
    done(null, user); 
}); 

passport.deserializeUser(function(obj, done) { 
    done(null, obj); 
}); 


passport.use(new FacebookStrategy({ 
    clientID: FACEBOOK_APP_ID, 
    clientSecret: FACEBOOK_APP_SECRET, 
    callbackURL: FACEBOOK_CALLBACKURL 
    }, 
    function(accessToken, refreshToken, profile, done) { 
    process.nextTick(function() { 
     User.findOne({'fbid':profile.id},function(err, docs) {     
       if (err){ 
       //console.log('Error in SignUp: '+err); 
       return res.status(401).json(info); 
       }     
       else { 
        if (docs) { 
         //console.log('User already exists'); 
         globalid = profile.id; 
         return done(null,docs); 
        } else { 
         // if there is no user with that fbid 
         // create the user 
         var newUser = new User(); 
         // set the user's local credentials 
         newUser.fbid = profile.id; 
         globalid = profile.id; 

         newUser.firstname = profile.name.givenName; 
         newUser.lastname = profile.name.familyName; 
         newUser.gender = profile.gender; 
         if(profile.emails){ 
         newUser.fbemail = profile.emails[0].value; 
         }; 
         newUser.fblink = profile.profileUrl; 
         newUser.fbverified = profile.verified; 

         // save the user 
         newUser.save(function(err) { 
          if (err){ 
          //console.log('Error in Saving user: '+err); 
          return res.status(401).json(info); 
          } 
          //console.log('User Registration succesful'); 
          return done(null, newUser); 
         }); 
        } 
       } 
       }); 
    }); 
})); 

var router = express.Router(); 

router.get('/auth/facebook', 
    passport.authenticate('facebook', { scope : 'email' } 
)); 

router.get('/auth/facebook/callback', 
    passport.authenticate('facebook', { session: false, failureRedirect: '/'}), 
    function(req, res,done) { 
    var redirection = true; 
    User.findOne({ 'fbid': globalid }, function (err, doc){ 
      //console.log("Generating token"); 
      doc.token = doc.generateJWT(); 
      doc.save(function(err) { 
       if (err){ 
       //console.log('Error in Saving token for old user: '+err); 
       return res.status(401).json(info); 
       } 
      else 
      { 
       //console.log('User Login succesful'); 
       redirection = doc.mobileverified; 
       //console.log(redirection); 
       //return done(null, doc); 
       if(doc.mobileverified === true){ 
        console.log("Token:",doc.generateJWT());      
        res.redirect('/#/posts/'+ doc.generateJWT()); 
       } 
       else{ 

        console.log("Token:",doc.generateJWT()); 
        //res.json({token: doc.generateJWT()}); 
        res.redirect('/#/register/' + doc.generateJWT());           
       } 
      } 
      }); 
     }); 
    }); 

Molte grazie in anticipo!

risposta

14

Se non si vuole mostrare il proprio gettone l'url è necessario inviare la risposta come JSON

var fbOptions = { 
    clientID: FACEBOOK_APP_ID, 
    clientSecret: FACEBOOK_APP_SECRET, 
    callbackURL: FACEBOOK_CALLBACKURL 
}; 
passport.use(new FacebookStrategy(fbOptions, function(token, refreshToken, profile, done) { 
    var user = profile; 
    // NOTE: ‘my_token’ we will use later 
    user.my_token = 'generate your jwt token'; 
    done(null, user); 
})); 

E poi sul router riportare il token come JSON

app.get('/auth/facebook/callback', passport.authenticate('facebook', {session: false, failureRedirect : '/'}), function(req, res) { 
// The token we have created on FacebookStrategy above 
var token = req.user.my_token; 
res.json({ token: token }); 
}); 
+0

In realtà, anche se lo si invia come intestazione in JSON, è impossibile per un client ottenerlo a causa della richiamata. –