0

这个问题困扰了我几天,我想我终于缩小了范围。我正在使用 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' })

请注意,我手动传递了签名请求。出于某种原因,当我不这样做时,我收到一个错误,抱怨必须有一个“代码”参数或一个签名请求(OmniAuth Strategies Facebook NoAuthorizationCodeError(必须传递一个“代码”参数或一个签名请求(通过“签名请求” `参数):)。这是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 应用程序未处于沙盒模式。

4

1 回答 1

2

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

于 2013-06-18T21:06:18.613 回答