【发布时间】: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