PassportJS上的Facebook策略可以有多个回叫url吗?
我使用PassportJS在我的网站上对Facebook用户进行身份validation。 其中最棘手的部分是,我首先使用简单的Facebook权限login用户,每个用户默认授予Facebooklogin权限,但用户根据他们的行为,以后可以授予Fanpage Admins权限。
我没有问题处理这两个授权,hovewever,当我想redirectFanpage Admin用户到不同的url,我不能因为Passport只允许我为我的Facebook策略设置一个单一的callbackURL,因为所有来自Facebook的callback结束at / auth / facebook / callback。
var passportOptions = { successRedirect: '/admin/', failureRedirect: '/' } var fbAdminPermissions = { scope: ["email, manage_pages"] } var fbNormalPermissions = { scope: ["email"] } app.get('/auth/facebook', passport.authenticate('facebook', fbNormalPermissions)); app.get('/auth/facebookPages', passport.authenticate('facebook', fbAdminPermissions)); app.get('/auth/facebook/callback', passport.authenticate('facebook', passportOptions));
我需要有多个successRedirecturl取决于如果用户授予一般权限或Facebookpipe理员权限。 我想将FBAdminsredirect到另一个url,而不是/ admin root。
我希望如何实现这一点,而不是创造一个新的Facebook战略?
app.get('/ auth / facebook / callback',passport.authenticate('facebook',passportOptions)
实际上应该被发送到一个自定义的callback,你处理redirect到适当的资源。
例:
app.get('/auth/facebook/callback', function(req, res, next) { passport.authenticate('facebook', function (err, user, info){ //do the redirect here as needed })(req, res, next); });
由于Biba的反馈,我可以想出一个转身。 这是解决scheme。 顺便说一句,“请求”模块是我使用的http处理程序,但是如果你愿意的话,你可以使用Express的“https”模块。
var request = require('request'); var passportOptions = { successRedirect: '/admin', adminRedirect: '/admin/fanpages', failureRedirect: '/login' } app.get('/auth/facebook/callback', function(req, res, next) { passport.authenticate('facebook', function(err, user) { if (err) { return res.redirect(passportOptions.failureRedirect); } if (!user) { return res.redirect(passportOptions.failureRedirect); } req.login(user, function(err) { if (err) { return res.redirect(passportOptions.failureRedirect); } else { request.get('https://graph.facebook.com/' + user.facebookid + '/permissions?access_token=' + user.facebookToken, function(error, response, body) { var bodyJSON = JSON.parse(body); if (!error && response.statusCode == 200) { if (bodyJSON.data[0].manage_pages !== undefined) { //admin user permissions granted return res.redirect(passportOptions.adminRedirect); } else { //normal user permissions granted return res.redirect(passportOptions.successRedirect); } } else { return res.redirect(passportOptions.failureRedirect); } }) } }); })(req, res, next); });
- Facebook Messenger bot不按顺序发送消息
- 如何在服务器端(Node.js)以编程方式validationFacebook用户的访问令牌?
- 在Node.js(Express)Facebookcanvas应用程序中获取signed_request
- 节点/ Angular / Passport / Satellizer基于令牌的Facebook身份validation不返回令牌
- Fb开发者问题 – 'URL无法validation。 响应不符合预期的挑战'
- 如何从node-webkit获取无托pipe页面的桌面应用程序的访问令牌?
- 无法在iOS Facebook SDK中将access_tokenvalidation为PassportJS
- 如何在React Native中启用Android监视器来检查日志?
- 你可以使用Facebook的stream注释未使用ES6类关键字定义的类吗?