2

我们一直在努力解决一些用户在尝试通过 oauth 使用其foursquare 帐户登录Vizify 时遇到的一个奇怪问题。如果用户的foursquare 帐户连接到他们的facebook 帐户并且他们登录到facebook,则oauth 过程会导致404 错误。如果他们未登录 facebook 或未连接他们的帐户,则该过程按预期工作。

过程如下:

1)我们点击了oauth url: https ://foursquare.com/oauth2/authenticate?client_id=OUR_ID&response_type=code&redirect_uri=OUR_REDIRECT_URI

2) 浏览器被重定向到:https ://foursquare.com/facebook-login?continue=/oauth2/authenticate?client_id=OUR_CLIENT_ID&response_type=code&redirect_uri=OUR_REDIRECT_URL

3) 浏览器被重定向到:https ://www.facebook.com/connect/ping?client_id=CLIENT_ID&domain=foursquare.com&origin=1&redirect_uri=https%3A%2F%2Fs-static.ak.facebook.com%2Fconnect%2Fxd_arbiter .php%3Fversion%3D27%23cb%3Df373b9bef%26domain%3Dfoursquare.com%26origin%3Dhttps%253A%252F%252Ffoursquare.com%252Ff3ba6cde18%26relation%3Dparent&response_type=token%2Csigned_request%2Ccode&sdk=joey

4)浏览器被重定向回:https ://foursquare.com/oauth2/authenticate?client_id=OUR_CLIENT_ID

请注意,步骤 4 中缺少 response_type 和 redirect_uri 参数。这个请求是导致 404 响应的原因。

该问题也可以通过其他应用程序重现。例如,我也通过 foodpotting 确认:

  • 清除缓存和 cookie
  • 登录脸书
  • 注册 foodpotting.com
  • 在您的 foodpotting 帐户设置下,单击以连接 Foursquare 应用程序
  • 巴姆 - 404

需要清除缓存/cookie,因为这里的foursquare错误发生在他们尝试通过Facebook自动登录时,并且在他们第一次尝试之前,他们设置了一个cookie“disableFacebookAutoLogin”,阻止他们尝试自动登录第二次。即使在退出后,此 cookie 似乎仍然存在。

4

1 回答 1

2

查看来自foursquare.com/oauth2/authenticate 的未缩小的javascript,我们已经找到了该错误。问题代码来自以下函数:

fourSq.auth.Autologin = {
  maybeFacebookAutologin: function () {
    window.fourSq.config.enableFacebookAutologin && (!$.cookie("disableFacebookAutologin") && !fourSq.api.models.companion.user.UserUtil.isLoggedIn()) && fourSq.facebook.getFacebookApi(function (a) {
      a.getLoginStatus(function (b) {
        if (b === fourSq.facebook.FacebookApi.State.CONNECTED) {
          var c = (b = location.href.match(/[\?&]continue=([^&]+)/) || location.href.match(/https?:\/\/[^\/]+(.+)/)) ? b[1] : "/";
          a.loginWithPermissions(void 0, function () {
            var a = fourSq.stats.Action.build(fourSq.stats.action.Action.AUTOLOGIN);
            fourSq.stats.logActionWithDelay(a, function () {
              $.cookie("disableFacebookAutologin", "1", {
                  expires: 1,
                  path: "/"
              });
              fourSq.util.redirect("/facebook-login?continue\x3d" + c)
            })
          })
        }
      })
    })
  }
};

问题线是

fourSq.util.redirect("/facebook-login?continue\x3d" + c) 这不会逃脱 c

这导致了这样的情况(为了说明而简化了 URL):

http://foursquare.com/facebook-login?continue=/cool/beans?foo=bar&baz=bam.

看到问题了吗?继续 URL 中的所有查询参数(第一个除外)都被解释为 /facebook-login 的查询参数!

正确的代码应该是:

fourSq.util.redirect("/facebook-login?continue\x3d" + encodeURIComponent(c))

这将生成正确的输出:

http://foursquare.com/facebook-login?continue=%2Fcool%2Fbeans%3Ffoo%3Dbar%26baz%3Dbam

于 2013-09-05T20:12:36.363 回答