facebook-pasport的callback可以dynamic构build吗?

当使用facebook-passport时,通常要做的就是在你使用的FacebookStrategy的构造函数中指定redirect_uri ,如下所示:

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

那么你会设置这样的路线:

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

是否有可能更改callbackurl,以便它包含传递给初始login调用参数的信息?

注意:这个问题更多的是为了保存信息而花费了我一些时间来解决问题,以避免其他人走上同样的道路。

       

网上收集的解决方案 "facebook-pasport的callback可以dynamic构build吗?"

我使用https://github.com/jaredhanson/passport-facebook/issues/2中的一些信息find答案,并通过挖掘护照oauth2组件确定callbackuris的方式,以及有关护照自定义callback的信息这个页面http://passportjs.org/guide/authenticate/

下面是一个将调用映射到/auth/facebook/login/1234以使用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); }); 

@OMGPOP,在这里你可以传入查询参数到你的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 }); 

看看我的博客了解更多信息: http : //blog.pingzhang.io/javascript/2016/09/22/passport-facebook/

我正在努力做到这一点与Angularjs专门做,并希望redirect到login启动从相同的url。

我的解决scheme是在Angularjs中创build一个刚刚实现位置的路由。 我知道这并不是专门回答这个问题,但我认为这对任何希望这样做的人都会有所帮助。

在服务器上:

 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度路由器:

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

angular度控制器:

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

你也可以在控制器中做一些其他的客户端路由。