2013-07-30 9 views
2

Мне должно быть что-то упустить. Я использую стратегию Facebook для получения паспортов для аутентификации пользователей. Это делается с помощью 2-х запросов/[маршрутные обработчики]:passjs facebook передать запрос на обратный вызов

//one to initiate the the auth: 
init: function (req, res, next) { 
    passport.authenticate('facebook', { 
     callbackURL: URL + '/facebook/callback', 
     state: req.body //attempting to put some state 
    })(req, res, next) 
} 

//one callback 
callback: function (req, res, next) { 
    passport.authenticate('facebook', { 
     callbackURL: URL + '/facebook/callback' 
    }, 
    function (err, profile, accessToken, refreshToken) { 
     if (err) return next(err) 
     res.send(passedReqBody) 
    })(req, res, next) 
} 

//the verify callback doesn't do much. 
//Application logic is done in route callback handlers 
passport.use(new FacebookStrategy({ 
    clientID: config.facebook.id, 
    clientSecret: config.facebook.secret 
}, 
//When setting passReqToCallback to true, it is set as the first argument 
//to the verify callback. As in: 
//function (req, accessToken, refreshToken, params, profile, done) { 
//But this is the 'callback' request object. I want the 'init' request object. 
function (accessToken, refreshToken, params, profile, done) { 
    //params.state is undefined 
    return done(null, profile, accessToken, refreshToken); 
})); 

Моя проблема заключается в том, что я хочу, чтобы запрос POST тело первой функции, которая будет выставлена ​​в обработчик обратного маршрута.

Существует опция, доступная для конструктора OAuth2Strategy «passReqToCallback», который посылает последний запрос обратно на проверки обратного вызова, который не является полезным для меня (я хочу первый request.body)

Следующая вещь, которая выглядел правдоподобным путь, было использование опции «государственной», как в https://github.com/jaredhanson/passport-oauth/blob/master/lib/passport-oauth/strategies/oauth2.js#L169

Но эти значения не доступны на обратный вызов getOAuthAccessToken https://github.com/jaredhanson/passport-oauth/blob/master/lib/passport-oauth/strategies/oauth2.js#L124

Мой текущий вариант, чтобы добавить дополнительную переменную внутри OAuth2Strategy .prototype.authenticate(), которая устанавливается на 1-ю функцию и возвращается обратно, без изменений, к функции обратного вызова, но я не могу себе представить, что это путь.

ответ

6

Из того, что вы описали, лучший подход может зависеть от вашего приложения, но вот быстрое изменение вашего init и callback промежуточного слоя:

init: function (req, res, next) { 
    // SAVE BODY IN SESSION 
    req.session.initBody = req.body; 

    passport.authenticate('facebook', { 
     callbackURL: URL + '/facebook/callback', 
     state: req.body //attempting to put some state 
    })(req, res, next) 
} 

//one callback 
callback: function (req, res, next) { 
    passport.authenticate('facebook', { 
     callbackURL: URL + '/facebook/callback' 
    }, 
    function (err, profile, accessToken, refreshToken) { 
     if (err) return next(err) 
     // RESTORE BODY FROM SESSION 
     res.send(req.session.initBody); 
     delete req.session.initBody; 
    })(req, res, next) 
} 

Обратите внимание, что исходное тело запроса в настоящее время сохраняются на сессию а затем восстанавливается после обратного вызова. Если вы хотите, чтобы данные выдержали цикл запроса/ответа, это один из способов сделать это. Я бы предупредил, однако, что мутирующий статус в обратном вызове GET не рекомендуется, поэтому будьте осторожны, если вы измените что-либо на основе исходного тела.

+0

U r спасательный спаситель :)) –

Смежные вопросы