可以动态构建facebook-pasport的回调吗?

Mic*_*son 12 facebook node.js passport.js

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

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);
    });
  })
);
Run Code Online (Sandbox Code Playgroud)

然后你会设置这样的路线:

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"
  }
))
Run Code Online (Sandbox Code Playgroud)

是否可以更改回调网址,使其包含传递给初始登录调用的参数的信息?

注意:这个问题更多的是为了保留我需要一段时间才能解决的信息,以避免其他人沿着相同的路径前进.

Mic*_*son 33

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

这是一个映射调用/auth/facebook/login/1234以使用回调的示例/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);
 });
Run Code Online (Sandbox Code Playgroud)

  • 感谢发布这个,这是很多帮助.我做了同样的工作.在使用动态回调网址时我注意到的一件事是在配置新的FacebookStrategy(...)时不需要设置callbackURL. (2认同)

Pin*_*lue 6

@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
});
Run Code Online (Sandbox Code Playgroud)

查看我的博客以获取更多信息:http://blog.pingzhang.io/javascript/2016/09/22/passport-facebook/