2013-03-20 11 views
12

Quando si usa facebook-passaporto la solita cosa da fare è specificare l'redirect_uri nel costruttore della THST FacebookStrategy si utilizza, qualcosa di simile:La callback per Facebook-pasport può essere costruita dinamicamente?

passport.use("facebook", new FacebookStrategy({ 
    //TODO: Correctly configure me 
    clientID: "XXXXXXX" 
    , clientSecret: "XXXXXXXXX" 
    , callbackURL: "http://localhost:3007/auth/facebook/callback" 
    }, 
    function(accessToken,refreshToken,profile,done) { 
    User.findByFacebookId(profile.id, function(err,user) { 
     if(err){ return done(err);} 
     if(!user){ return done(null,false)} 
     return done(null, user); 
    }); 
    }) 
); 

Poi si dovrebbe impostare percorsi come questo:

app.get('/auth/facebook/login', passport.authenticate('facebook')); 
app.get('/auth/facebook/login_callback', passport.authenticate('facebook', { 
    successRedirect:"/login_ok.html" 
    , failureRedirect:"/login_failed.html" 
    } 
)) 

È possibile modificare l'URL di richiamata in modo che contenga informazioni dai parametri passati alla chiamata di accesso iniziale?

NOTA: questa domanda è più utile per preservare le informazioni che mi hanno richiesto un po 'di tempo per risolvere il problema, per evitare che altre persone continuassero lungo gli stessi percorsi.

risposta

32

Ho trovato la risposta utilizzando alcune informazioni trovate qui https://github.com/jaredhanson/passport-facebook/issues/2 e scavando attraverso il modo in cui il componente oauth2 del passaporto determina l'uris di richiamata e le informazioni sui callback personalizzati del passaporto nella parte inferiore di questa pagina http://passportjs.org/guide/authenticate/.

Ecco un esempio che mappa le chiamate a /auth/facebook/login/1234 per usare il callback /auth/facebook/login_callback/1234

app.get('/auth/facebook/login/:id', function(req,res,next) { 
    passport.authenticate(
    'facebook', 
    {callbackURL: '/auth/facebook/login_callback/'+req.params.id } 
)(req,res,next); 
}); 

app.get('/auth/facebook/login_callback/:id', function(req,res,next) { 
    passport.authenticate(
    'facebook', 
    { 
     callbackURL:"/auth/facebook/login_callback/"+req.params.id 
    , successRedirect:"/login_ok.html" 
    , failureRedirect:"/login_failed.html" 
    } 
    ) (req,res,next); 
}); 
+2

Grazie per aver postato questo, è stato un grande aiuto. Ho fatto lo stesso e ha funzionato. Una cosa che ho notato usando url di callback dinamici è che non è necessario impostare callbackURL quando si configura la nuova FacebookStrategy (...). –

+0

grande funzionalità. non sono sicuro che tu possa farlo semplicemente per Twitter e Google, ma in caso contrario, c'è una buona soluzione [qui] (http://stackoverflow.com/questions/9885711/custom-returnurl-on-node-js -passaporti-google-strategy) per chiunque usi quei servizi oauth. –

+0

posso usare una stringa di query come req.query.xxx in url invece di param? Ottiene sempre URI non valido – OMGPOP

6

@OMGPOP, qui si può passare parametri di query nella vostra callbackUrl.

var Passport = require('passport'); 
var FacebookStrategy = require('passport-facebook').Strategy; 
const Router = require("express").Router(); 
var fbConfig = { 
    display: "popup", 
    clientID: "YourFbClientId", 
    clientSecret: "YourFbClientSecret", 
    callbackURL: "http://localhost:8686/auth/facebook/callback", 
    profileFields: ['id', 'name', 'gender', 'displayName', 'photos', 'profileUrl', 'email'] 
} 

Passport.use(new FacebookStrategy(fbConfig, 
    function(accessToken, refreshToken, profile, callback) { 
    return callback(null, accessToken); 
    } 
)); 

Router.get("/auth/facebook", function(req, res, next) { 
    var callbackURL = fbConfig.callbackURL + "?queryParams=" + req.query.queryParams; 
    Passport.authenticate("facebook", { scope : ["email"], callbackURL: callbackURL })(req, res, next); 
}); 

Router.get("/auth/facebook/callback", function(req, res, next) { 
    Passport.authenticate("facebook", { 
    callbackURL: fbConfig.callbackURL + "?queryParams=" + req.query.queryParams, 
    failureRedirect: "/login", 
    session: false 
    })(req, res, next) }, 
    function(req, res) { 
    console.log(req.query.queryParams); 
    //do whatever you want 
}); 

controllare il mio blog per ulteriori informazioni: http://blog.pingzhang.io/javascript/2016/09/22/passport-facebook/

+0

Ho dovuto codificareURIComponent (req.query.queryParams) per evitare l'errore di mancata corrispondenza redirect_uri. – runios

0

stavo lottando per fare questo in particolare con Angularjs, e volevo reindirizzare indietro alla stessa URL che l'accesso è stato avviato da.

La mia soluzione era quella di creare un percorso in Angularjs che implementasse appena una posizione. So che questo non risponde in modo specifico alla domanda, ma ho pensato che sarebbe stato utile per chiunque volesse fare lo stesso.

Sul server:

app.get('/auth/facebook/', passport.authenticate ('facebook')); 

app.get('/auth/facebook/callback', function (req, res, next) { 
    var authenticator = passport.authenticate ('facebook', { 
      successRedirect: '/fbcallback', 
      failureRedirect: '/' 
    }); 

    delete req.session.returnTo; 
    authenticator (req, res, next); 
}) 

angolare router:

when('/fbcallback', { 
    template: "", 
    controller: 'fbCtrl' 
}). 

angolare regolatore:

app.controller("fbCtrl", function() { 
    window.history.back(); 
}); 

Si potrebbe probabilmente fare qualche altro di routing lato client nel controller pure.

Problemi correlati