13

尝试“使用 Google 登录”后,我在日志中看到此错误:

Processing by Users::OmniauthCallbacksController#failure as HTML

我可以看到来自谷歌的所有数据都通过 URL(在日志中)发送,包括用户电子邮件和姓名。那么会出现什么问题呢?我的回调甚至没有被执行。我只会被重定向到我网站的登录页面。

而且我很确定一切都配置正确,因为这在几周前运行良好。我不认为我改变了什么。Facebook 登录仍然可以正常工作。

关于如何调试此故障的任何想法?除了那些充满参数和值的长 URL 之外,日志中没有其他内容。只有 INFO 消息。上面发布的那篇文章是唯一提到失败的一篇文章。

更新

我向控制器添加了一个“失败”方法

def failure
  render :text => params.inspect
end

哪个停止了重定向,并打印了这个:

{}

网址是这样的:

/users/auth/google/callback?_method=post&openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0&openid.mode=id_res&openid.op_endpoint=https%3A%2F%2Fwww.google.com%2Faccounts%2Fo8%2Fud&openid.response_nonce=2012-04-16T12%3A25%3A49Z_v1fNngSQJaHBQ&openid.return_to=http%3A%2F%2Fdev.myapp.me%3A3000%2Fusers%2Fauth%2Fgoogle%2Fcallback%3F_method%3Dpost&openid.assoc_handle=AMlYA9Urw_lYamPphTSdQ9a6DU0Ez0y5RaDDM78qPL7Xgm77nMpJiB85&openid.signed=op_endpoint%2Cclaimed_id%2Cidentity%2Creturn_to%2Cresponse_nonce%2Cassoc_handle%2Cns.ext1%2Cext1.mode%2Cext1.type.ext5%2Cext1.value.ext5%2Cext1.type.ext8%2Cext1.value.ext8%2Cext1.type.ext2%2Cext1.value.ext2&openid.sig=2FPjo7U1e%2Fde248XpUgjQLduNAM%3D&openid.identity=https%3A%2F%2Fwww.google.com%2Faccounts%2Fo8%2Fid%3Fid%3DAItOawk1F5U6x_-kJnydjoww5haU41tquh1Zl2c&openid.claimed_id=https%3A%2F%2Fwww.google.com%2Faccounts%2Fo8%2Fid%3Fid%3DAItOawk1F5U6x_-kJnydjoww5haU41tquh1Zl2c&openid.ns.ext1=http%3A%2F%2Fopenid.net%2Fsrv%2Fax%2F1.0&openid.ext1.mode=fetch_response&openid.ext1.type.ext5=http%3A%2F%2Faxschema.org%2FnamePerson%2Ffirst&openid.ext1.value.ext5=Some_User&openid.ext1.type.ext8=http%3A%2F%2Faxschema.org%2Fcontact%2Femail&openid.ext1.value.ext8=some_email%40gmail.com&openid.ext1.type.ext2=http%3A%2F%2Faxschema.org%2FnamePerson%2Flast&openid.ext1.value.ext2=Some_User

所以问题是我需要的所有数据都在 URL 中,但是 devise/omniauth 没有抓住它(显然这就是它调用“失败”方法而不是我的回调的原因)。我不知道它是否应该可以通过 'params' 数组访问,或者什么。

我也对这?_method=post部分很感兴趣,因为对我网站的所有请求都是 GET 请求。也许这只是意味着omniauth对google的请求是POST。

有什么想法吗?

4

4 回答 4

13

要回答有关如何调试 Omniauth 的原始问题,以下是如何为 Omniauth 启用日志记录。config/initializers/devise.rb在定义 Omniauth 策略之后添加这一行:

OmniAuth.config.logger = Rails.logger if Rails.env.development?

(如果您不使用设计,只使用 Omniauth,然后将代码添加到config/initializers/omniauth.rb

您将在日志文件中从 Omniauth 获得更多信息 - 包括来自回调阶段的完整响应。

于 2016-06-22T08:16:01.087 回答
2

我意识到这是一个老问题,最初提出这个问题的人要么解决了它,要么转向了其他解决方案,但是,我遇到了同样的问题,我对解决方案的追求把我带到了这里。

我设法解决了它,所以这里是为下一个寻找它的人准备的。

结果是微不足道的。这就是我所拥有的:

# config/initializers/omniauth.rb
Rails.application.config.middleware.use OmniAuth::Builder do
  provider :github, ENV['github_key'], ENV['github_secret']
end

# config/initializers/devise.rb
Devise.setup do |config|
  # ... devise config not related to omniauth ...
  config.omniauth :github, ENV['github_key'], ENV['github_secret']
end

因此,我在两个地方配置了omniauth 提供程序,并且发生了冲突。

在我从 omniauth.rb 中删除配置后,来自 github 的重定向请求/auth/github/callback开始被处理,Users::OmniauthCallbacksController#github而不是#failure更改之前的情况。

如此愚蠢的错误和如此少的信息可以使用......

于 2015-11-27T12:40:18.420 回答
2

我知道这是一个老问题,但我有同样的问题,我在网上找到的没有任何帮助。原来这个问题是由我使用 Puma 的方式引起的(从 Thin 带来的实践)。我在同一台机器上启动了多个 Puma 进程(Apache 反向代理),看起来来自 Github 的回调将转到与原始身份验证请求不同的 Puma 进程。 我将 Puma 进程减少到一个并且不再有条件(切换到使用 Puma workers: puma -w 5,这反过来使用由 Puma 管理的进程而不是 Apache 循环)。这也是为什么我在开发中从未偶然发现这个问题的原因,因为我没有在那个环境中运行进程集群。

于 2015-09-02T10:05:20.840 回答
0

你最近升级了你的宝石吗?如果是这样,将omniauth 和devise 版本与以前的gem 版本进行比较可能会很有用。它也可能是改变了的omniauth/devise 依赖。

我不确定在这种特定情况下问题出在哪里,但是如果您想深入研究代码,请安装 pry-debug gem。它为您提供了带有 step 和 next 调试命令的 pry 界面。添加pry.binding您的代码,它将停止在服务器中执行并打开 pry 界面。例如:

def failure
  binding.pry
  render :text => params.inspect
end
于 2012-07-03T04:08:55.337 回答