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调用参数的信息?
注意:这个问题更多的是为了保存信息而花费了我一些时间来解决问题,以避免其他人走上同样的道路。
下面是一个将调用映射到/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(); });
你也可以在控制器中做一些其他的客户端路由。