PassportJS采用Facebook策略,我的代码是否正确?

时间:2016-05-06 21:57:47

标签: node.js facebook express passport.js

我在我的应用程序中使用带有passportJS的NodeJ,以允许用户使用Facebook登录/注册。它似乎工作正常,不知道我是否完全理解那里发生的事情。所以想法是用户可以尝试使用Facebook详细信息从我的应用程序中的不同页面登录。在Facebook返回所有详细信息后,我将其登录或使用Facebook返回的内容注册新用户,完成此操作后将其重定向到同一页面但已登录。代码为:

var passport = require('passport'),
    FacebookStrategy = require('passport-facebook').Strategy;


function setupFBStrategy(req, res, next) {
    return function(req, res, next) {
        var redirectUrl = req.params.currentPage;

        console.log('setupFBStrategy')
        passport.use(new FacebookStrategy({
                clientID: 'abc',
                clientSecret: 'def',
                // step 2 ################################
                callbackURL: "/auth/facebook/callback?currentPage="+redirectUrl,
                passReqToCallback: true,
                profileFields: ['first_name', 'last_name', 'photos', 'email']
                },
                function(req, accessToken, refreshToken, profile, done) {
 // step 5 ###########################
// verify callback. Now I have user email inside 'profile' and I authenticate this aginst my database. I use `done(..)` to further instruct my app if the registration/authentication with my system was success or not
                }
        ));
        next();
    }
}

app.use(passport.initialize());

// step 1 ################################
app.get('/auth/facebook/cp/:currentPage', setupFBStrategy(), passport.authenticate('facebook', { authType: 'rerequest', scope: ['email'] }));

app.get('/auth/facebook/callback',
    function(req, res, next) {
    console.log(req.query.currentPage)
         passport.authenticate('facebook', {
            successRedirect: '/'+req.query.currentPage, // redirects when user allowed or logged in with username password
            failureRedirect: '/'+req.query.currentPage // takes here when user clicks cancel when asked to give permissions
        })(req,res,next);
    }
);

passport.serializeUser(function(user, done) {
    console.log('serialize='+user)
    done(null, {});
});

passport.deserializeUser(function(user, done) {
    console.log('deserialize=' + user);
    done(null, {});
});

步骤如下:

  1. 在我的应用用户点击“登录/注册Facebook”,向auth/facebook/cp路线发出请求。

  2. 路由呼叫setUpFBStrategy。我追加当前页面用户正在查看callbackUrl。

  3. PassportJS将重定向发送回用户浏览器,用户浏览器重定向到Facebook进行身份验证。

  4. 当facebook完成对用户的身份验证后,它会将重定向发送到用户浏览器,以便浏览器重定向到使用步骤2中指定的URL的callbackURL。它还会将“?code=”查询字符串附加到回调URL。这个查询字符串版本是Facebook返回的版本,所以我的案例是公共信息和电子邮件吗?

  5. 现在我的服务器“auth/facebook/callback”已执行并验证是否已执行回调。取决于我在内部调用done(null,profile)等,验证回调服务器返回重定向到浏览器,浏览器重定向到successRedirectfailureRedirect 'successRedirect'或'{ {1}}'路线。

  6. 到目前为止所有似乎都有效,但我的理解是正确的吗?是failureRedirect'查询字符串散列版本的细节facebook返回?为什么我的代码中甚至需要codeserializeUser函数?我何时会使用deserializeUserrefreshToken

1 个答案:

答案 0 :(得分:0)

是的,您的代码似乎没问题。

passport.serializeUser和passport.deserializeUser以及护照提供的功能

当你打电话

时,会在登录时调用一次passport.serializeUser
req.logIn(someValue,function(){})

这里someValue是您要在护照会话中存储的值

并在每次请求时,当您调用req.isAuthenticated()函数检查护照会话是否存在时,将调用passport.deserializeUser返回true或false。 并且在用户浏览结束时退出登记时,您调用req.session.destroy来销毁该特定用户会话。