Ruby on rails Omniauth facebook两次回拨失败

Ruby on rails Omniauth facebook两次回拨失败,ruby-on-rails,ruby,facebook,omniauth,Ruby On Rails,Ruby,Facebook,Omniauth,这个问题困扰了我好几天,我想我终于缩小了范围。我正在使用Facebook JS SDK进行客户端身份验证: FB.login(function(response) { if (response.authResponse) { var url = "/auth/facebook/callback?redirect="; url += '&' + $.param({ signed_request: response.authResponse.signedRequest }

这个问题困扰了我好几天,我想我终于缩小了范围。我正在使用Facebook JS SDK进行客户端身份验证:

FB.login(function(response) {
  if (response.authResponse) {
    var url = "/auth/facebook/callback?redirect=";
    url += '&' + $.param({ signed_request: response.authResponse.signedRequest });
    window.location = url;
  }
}, { scope:'email,publish_stream,publish_actions' })
请注意,我正在手动传递signedRequest。由于某些原因,当我不这样做时,我会收到一个错误,该错误抱怨必须有一个“code”参数或一个已签名的请求()。这是omniauth FacebookGem 1.4.0版。如果我使用最新版本的1.4.1,我会遇到其他人似乎都会遇到的无效\u凭据问题

当我尝试登录时,发生了一些奇怪的事情。我打开Chrome调试器,切换到网络选项卡。我看到两个网络请求,都可以访问

https://www.MYHOST.com/auth/facebook/callback?redirect=&signed_request=BIGSTRINGHERE
然而,有趣的是,第一个请求的状态为301,第二个请求的状态为302,下一个网络请求是/auth/failure回调。更令人费解的是,这并不是在本地复制,而是在生产中复制。在本地,它工作并且只执行一个http状态为302的请求

另外值得注意的是,在点击失败回调后,它会返回到我的网站主页,然后触发自动登录功能,因为它检测到该用户是FB用户,并且在该网站上有一个帐户。这段代码命中相同的回调url并成功

所以我的问题是,为什么会有第二个回调请求,我如何摆脱它,以使登录正常工作?额外的问题是,为什么我必须手动传递signedRequest,而教程似乎不必这样做(例如RailsCast#360)

需要澄清和提供详细信息的几个注释:

我正在使用omniauth facebook 1.4.0、omniauth 1.1.4和omniauth oauth 1.0.3

我不是在使用这个装置。我似乎也不会多次初始化facebook omniauth

此问题仅在本地发生,而不是在使用相同Facebook应用ID和secret的生产中发生。登录url设置为生产域,我使用一些本地配置使生产域指向本地

appID和secret是正确的(autologin工作,并且在本地工作)


Facebook应用程序未处于沙箱模式。

结果表明问题在于重定向到的回调是https。由于该页面在https中不可用,因此它重定向到http,导致数据丢失或数据错误。我没有注意到第二个请求是http而不是https。为该回调操作启用ssl修复了该问题