使用Facebook Oauth时,如何使用URL上的#_ = _停止瞬时重定向?

时间:2014-05-26 18:16:38

标签: javascript node.js facebook passport.js

我使用Passport和Angular通过Facebook登录网站。代码如下:

  facebookStrategy: function() {
    if (!process.env.FACEBOOK_APP_ID) {
      throw new Error("A Facebook App ID is required if you want to enable login via Facebook.");
    }
    if (!process.env.FACEBOOK_APP_SECRET) {
      throw new Error("A Facebook App Secret is required if you want to enable login via Facebook.");
    }
    return new FacebookStrategy({
      clientID: process.env.FACEBOOK_APP_ID,
      clientSecret: process.env.FACEBOOK_APP_SECRET,
      callbackURL: process.env.FACEBOOK_CALLBACK_URL || ("http://localhost:" + process.env.PORT + "/auth/facebook/callback")
    }, function(accessToken, refreshToken, profile, done) {
      var user;
      user = module.exports.findOrCreateOauthUser(profile.provider, profile.id);
      done(null, user);
    });
  }

http://localhost?废话,需要解决这个问题,这是我正在调整的一些示例代码)

好的,所以解决这个问题的方法是(玉):

script(type="text/javascript").
  if (window.location.href.indexOf('#_=_') > 0) {
      window.location = window.location.href.replace(/#.*/, '');
  }

这看起来不错,但这是不必要的重定向。所以我的完美主义者想要摆脱它。文档似乎在这里需要redirect_uri,但我有callbackURL和Passport Facebook lib seems to think they're the same。即使使用callbackURL,仍然会重定向到无意义的URL。

具体来说,我想知道是否可以通过Passport修复此问题,而不是修复网址的页面javascript。后者看起来很丑陋。

1 个答案:

答案 0 :(得分:1)

这是Facebook方面的一个错误,而不是Passport的错误。你不能改变哈希服务器端,所以在你的JS顶部添加这个代码段就可以了(不需要重定向):

if (window.location.hash === '_=_') {
  window.location.hash = '';
}

根据Passport-Facebook的作者:

  Facebook的OAuth 2.0实现有一个错误,其中包含片段   #_ = _附加到回调URL。这似乎会影响Firefox和Chrome,但不会影响Safari。这个片段可以通过删除   客户端JavaScript和@niftylettuce提供了建议   解决方法[有一个链接]。鼓励开发人员将他们的投诉指向   Facebook努力让他们为此实施适当的解决方案   问题。