【问题标题】:Omniauth-facebook is hitting callback twice and failingOmniauth-facebook 两次回调并失败
【发布时间】:2013-06-19 05:06:18
【问题描述】:

这个问题困扰了我几天,我想我终于缩小了范围。我正在使用 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。出于某种原因,当我不这样做时,我收到一个错误,抱怨必须有一个“代码”参数或签名请求 (OmniAuth Strategies Facebook NoAuthorizationCodeError (must pass either a `code` parameter or a signed request (via `signed_request` parameter):)。这是omniauth-facebook gem 1.4.0 版。如果我使用最新的 1.4.1,我会遇到其他人似乎都遇到的 invalid_credentials 问题。

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

https://www.MYHOST.com/auth/facebook/callback?redirect=&signed_request=BIGSTRINGHERE

然而,有趣的是,第一个请求的状态为 301,第二个请求的状态为 302,下一个网络请求是到 /auth/failure 回调。更令人费解的是,这不会在本地复制,只能在生产中复制。在本地,它可以工作并且只执行一个请求,其 http 状态为 302。

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

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

一些说明以澄清和提供详细信息:

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

我没有使用设计。我似乎也没有多次初始化 facebook omniauth。

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

appID 和 secret 正确(自动登录有效,本地有效)。

Facebook 应用未处于沙盒模式。

【问题讨论】:

    标签: ruby-on-rails ruby facebook omniauth


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-14
      • 2017-08-27
      • 1970-01-01
      • 2023-03-31
      • 2011-04-27
      相关资源
      最近更新 更多