如何将路由处理程序中的变量传递给passport-freshbooks策略的中间件定义?

时间:2015-01-06 09:33:01

标签: node.js passport.js freshbooks-api passport-freshbooks

我正在使用passport-freshbooks策略,就像任何其他策略一样,除了我认为它没有正确编写(如果我没有遗漏任何东西)。我发现你需要在定义阶段将变量传递给它的中间件,你只能通过路由处理程序从用户那里获得。

passport.use(new FreshbooksStrategy({
    // This is the USER's subdomain, who's supposed to login
    subdomain: SUBDOMAIN,
    ...

要设置上面的subdomain,您需要先从用户那里获取

app.get('/login', function(req,res){
    res.send('<form>Enter your freshbooks account URL or subdomain(..submit)</form>')
});
app.post('/login', function(req,res){
    var subdomain = req.body.subdomain.split('.')[0].split('/').pop();
});

那么如何在护照策略的中间件定义中设置此subdomain

它可能需要改变策略本身,但我不确定如何继续,任何想法?

issue on github

2 个答案:

答案 0 :(得分:2)

Passport有一个“passReqToCallback”选项,可以在您的策略中访问您的请求对象。启用此选项后,req将作为验证回调的第一个参数传递。

这里用于一个例子。 (来自他们的docs

passport.use(new TwitterStrategy({
    consumerKey: TWITTER_CONSUMER_KEY,
    consumerSecret: TWITTER_CONSUMER_SECRET,
    callbackURL: "http://www.example.com/auth/twitter/callback",
    passReqToCallback: true
  },
  function(req, token, tokenSecret, profile, done) {
    if (!req.user) {
      // Not logged-in. Authenticate based on Twitter account.
    } else {
      // Logged in. Associate Twitter account with user.  Preserve the login
      // state by supplying the existing user after association.
      // return done(null, req.user);
    }
  }
));

答案 1 :(得分:0)

我最终攻击了图书馆并让它在某一点上工作。最终,我放弃了项目,所以我没有任何分享的修复。但是,如果你正在考虑修改策略,那么你就是在正确的道路上。