Javascript 在使用Facebook Oauth时,如何使用url上的#=u停止瞬间重定向?

Javascript 在使用Facebook Oauth时,如何使用url上的#=u停止瞬间重定向?,javascript,node.js,facebook,passport.js,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.FACEBO

我正在使用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
?废话,需要解决这个问题,这是我正在修改的一些示例代码)

好的,这个问题的解决方案是(jade):

这看起来不错,但这是一个不必要的重定向。所以我内心的完美主义者想要摆脱它。文档似乎说这里需要
redirect\u uri
,但我有
callbackURL
和Passport Facebook lib。即使使用
callbackURL
,仍会重定向到无意义的URL


具体来说,我想知道是否有可能通过Passport而不是页面端javascript来修复url。后者似乎很粗糙

这是Facebook方面的错误,而不是Passport方面的错误。您无法更改哈希服务器端,因此将此代码段添加到JS顶部即可(无需重定向):

作者:

Facebook的OAuth2.0实现有一个bug,其中 #_=\被附加到回调URL。这似乎会影响Firefox和Chrome,但不会影响Safari。这个片段可以通过 客户端JavaScript,@niftylettuce提供了一个 解决方法[有一个链接]。发展商可直接向 Facebook试图让他们对此进行适当的修复 问题


location.replace()比重新分配整个url更快,更改location.hash根本无法导航。您还可以使用history.pushState()更改整个url,而无需导航。抱歉,不清楚。我想在不使用页面端javascript的情况下解决这个问题。Facebook正在追加
\u=\ u
,因为重定向uri不存在。但它似乎在代码中。所以这可能是passport中的一个错误。你是对的。如果您不介意,我附加了一些文字解释。@jcollum没问题,谢谢!应该有助于那些在未来找到答案的人。
script(type="text/javascript").
  if (window.location.href.indexOf('#_=_') > 0) {
      window.location = window.location.href.replace(/#.*/, '');
  }
if (window.location.hash === '_=_') {
  window.location.hash = '';
}