【发布时间】: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, {});
});
步骤如下:
在我的应用中,用户点击“登录/注册 facebook”,向
auth/facebook/cp路由发出请求。路由呼叫
setUpFBStrategy。我将用户正在查看的当前页面附加到 callbackUrl。PassportJS 将重定向发送回用户浏览器,用户浏览器重定向到 facebook 进行身份验证。
当 facebook 完成对用户的身份验证后,它会向用户浏览器发送重定向,因此浏览器会重定向到带有步骤 2 中指定的 URL 的回调 URL。它还将“
?code=”查询字符串附加到回调 URL。这个查询字符串是 Facebook 返回的哈希版本,在我的情况下是公共信息和电子邮件吗?现在我的服务器 '
auth/facebook/callback' 被执行并且验证回调被执行。取决于我是否在内部调用done(null,profile)等,验证回调服务器返回重定向到浏览器和浏览器重定向到'successRedirect或failureRedirectsuccessRedirect' 或'failureRedirect' 路由。
到目前为止似乎一切正常,但我的理解是否正确? 'code' 查询字符串是 facebook 返回的详细信息的散列版本吗?为什么我的代码中还需要serializeUser 和deserializeUser 函数?我什么时候使用refreshToken 和accessToken?
【问题讨论】:
标签: node.js facebook express passport.js