2013-03-20 2 views
12

Wenn die übliche Sache mit Facebook-Pass zu tun ist, um die redirect_uri im Konstruktor des FacebookStrategy thst spezifizieren Sie so etwas wie diese,:Kann der Rückruf für Facebook-Passport dynamisch aufgebaut werden?

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); 
    }); 
    }) 
); 

Dann würden Sie wie folgt aufgebaut Routen:

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" 
    } 
)) 

Ist es möglich, die Callback-URL so zu ändern, dass sie Informationen aus Parametern enthält, die an den ersten Login-Aufruf übergeben wurden?

HINWEIS: Diese Frage ist mehr für das Bewahren von Informationen, die mich eine Weile brauchten, um zu vermeiden, dass andere die gleichen Wege gehen.

Antwort

32

fand ich die Antwort einige Infos hier mit https://github.com/jaredhanson/passport-facebook/issues/2 und durch das Graben durch die Art und Weise der Pass oauth2 Komponente bestimmt Rückruf uris und Informationen über Pass eigene Callbacks am Ende dieser Seite http://passportjs.org/guide/authenticate/ gefunden.

Hier ein Beispiel ist, die Anrufe zu /auth/facebook/login/1234 ordnet den Rückruf zu verwenden /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

Danke für das Posten, es war eine Menge Hilfe. Ich habe das Gleiche getan und es hat funktioniert. Eine Sache, die mir bei der Verwendung dynamischer Callback-URLs aufgefallen ist, ist, dass ich die CallbackURL bei der Konfiguration der neuen FacebookStrategy nicht einstellen muss (...). –

+0

großartige Funktion. Ich bin mir nicht sicher, ob Sie das einfach für Twitter und Google tun können, aber wenn nicht, gibt es eine gute Lösung [hier] (http://stackoverflow.com/questions/9885711/custom-returnurl-on-node-js passports-google-strategie) für jeden, der diesen oauth-service nutzt. –

+0

kann ich Abfragezeichenfolge wie req.query.xxx in URL anstelle von Param? Ich bekomme immer eine ungültige URI – OMGPOP

6

@OMGPOP, hier können Sie in Abfrage params in Ihre callbackUrl passieren.

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 
}); 

überprüfen mein Blog für weitere Informationen: http://blog.pingzhang.io/javascript/2016/09/22/passport-facebook/

+0

Ich musste encodeURIComponent (req.query.queryParams) um den redirect_uri Mismatch Fehler zu vermeiden. – runios

0

kämpfte ich dies mit AngularJS speziell zu tun, und wollte wieder auf die gleiche URL umleiten, die das Login aus initiiert wurde.

Meine Lösung war eine Route in Angularjs zu erstellen, die nur einen Ort zurück implementiert. Ich weiß, dass dies nicht speziell die Frage beantwortet, aber ich dachte, es wäre hilfreich für jeden, der dasselbe machen möchte.

Auf dem 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); 
}) 

Angular Router:

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

Winkelregler:

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

Sie wahrscheinlich auch einige andere Client-Seite-Routing in der Steuerung tun könnte.