【问题标题】:PassportJS with Facebook strategy, is my code correct?PassportJS 与 Facebook 策略,我的代码是否正确?
【发布时间】:2016-09-02 02:16:53
【问题描述】:

我在我的应用程序中使用带有passportJS 的NodeJs,以允许用户使用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 的回调 URL。它还将“?code=”查询字符串附加到回调 URL。这个查询字符串是 Facebook 返回的哈希版本,在我的情况下是公共信息和电子邮件吗?

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

到目前为止似乎一切正常,但我的理解是否正确? 'code' 查询字符串是 facebook 返回的详细信息的散列版本吗?为什么我的代码中还需要serializeUserdeserializeUser 函数?我什么时候使用refreshTokenaccessToken

【问题讨论】:

    标签: node.js facebook express passport.js


    【解决方案1】:

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

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

    passport.serializeUser 在您调用时在登录时调用一次

    req.logIn(someValue,function(){})
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-03
      相关资源
      最近更新 更多