我在我的应用程序中使用带有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, {});
});
步骤如下:
在我的应用用户点击“登录/注册Facebook”,向auth/facebook/cp
路线发出请求。
路由呼叫setUpFBStrategy
。我追加当前页面用户正在查看callbackUrl。
PassportJS将重定向发送回用户浏览器,用户浏览器重定向到Facebook进行身份验证。
当facebook完成对用户的身份验证后,它会将重定向发送到用户浏览器,以便浏览器重定向到使用步骤2中指定的URL的callbackURL。它还会将“?code=
”查询字符串附加到回调URL。这个查询字符串版本是Facebook返回的版本,所以我的案例是公共信息和电子邮件吗?
现在我的服务器“auth/facebook/callback
”已执行并验证是否已执行回调。取决于我在内部调用done(null,profile)
等,验证回调服务器返回重定向到浏览器,浏览器重定向到'successRedirect
或failureRedirect
successRedirect
'或'{ {1}}'路线。
到目前为止所有似乎都有效,但我的理解是正确的吗?是failureRedirect
'查询字符串散列版本的细节facebook返回?为什么我的代码中甚至需要code
和serializeUser
函数?我何时会使用deserializeUser
和refreshToken
?
答案 0 :(得分:0)
是的,您的代码似乎没问题。
passport.serializeUser和passport.deserializeUser以及护照提供的功能
当你打电话时,会在登录时调用一次passport.serializeUserreq.logIn(someValue,function(){})
这里someValue是您要在护照会话中存储的值
并在每次请求时,当您调用req.isAuthenticated()
函数检查护照会话是否存在时,将调用passport.deserializeUser返回true或false。
并且在用户浏览结束时退出登记时,您调用req.session.destroy来销毁该特定用户会话。