2013-03-20 2 views
12

При использовании facebook-паспорт обычная вещь, чтобы сделать, это указать redirect_uri в конструкторе FacebookStrategy THST вы используете, что-то вроде этого:Можно ли динамически построить обратный вызов для facebook-pasport?

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

Возможно ли изменить URL-адрес обратного вызова, чтобы он содержал информацию из параметров, переданных в первоначальный логин?

ПРИМЕЧАНИЕ. Этот вопрос больше подходит для сохранения информации, которая занимала меня некоторое время, чтобы выработать, чтобы другие не сходили по тем же путям.

ответ

32

Я нашел ответ, используя некоторую информацию, найденную здесь 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); 
}); 
+2

Спасибо, что разместили это, это было очень полезно. Я сделал то же самое, и это сработало. Одна вещь, которую я заметил при использовании динамических обратных ссылок, - это то, что не требуется устанавливать callbackURL при настройке новой FacebookStrategy (...). –

+0

отличная возможность. Я не уверен, что вы можете сделать это просто для Twitter и Google, но если нет, есть хорошее решение [здесь] (http://stackoverflow.com/questions/9885711/custom-returnurl-on-node-js -passports-google-strategy) для тех, кто использует эти услуги oauth. –

+0

Можно ли использовать строку запроса, например req.query.xxx, в url вместо param? Я всегда получаю недопустимый URI. – OMGPOP

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

Проверьте мой блог для получения дополнительной информации: http://blog.pingzhang.io/javascript/2016/09/22/passport-facebook/

+0

Мне пришлось кодироватьURIComponent (req.query.queryParams), чтобы избежать ошибки несоответствия redirect_uri. – runios

0

Я изо всех сил, чтобы сделать это именно с Angularjs, и хотел, чтобы перенаправить обратно на тот же URL, что Логин инициированного из.

Моим решением было создать маршрут в Angularjs, который просто реализует местоположение назад. Я знаю, что это не отвечает конкретно на вопрос, но я думал, что это будет полезно для тех, кто хочет сделать то же самое.

На сервере:

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

Угловая маршрутизатор:

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

Угловая контроллер:

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

Вы могли бы сделать какой-либо другой стороне клиента маршрутизации в контроллере, а также.

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