Devise / Omniauth失败:如何调试?

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

Processing by Users::OmniauthCallbacksController#failure as HTML 

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

而且我很确定一切都配置正确,因为这在几周前工作正常。 我认为我没有改变任何东西。 Facebook登录仍然正常。

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

UPDATE

我向控制器添加了“故障”方法

 def failure render :text => params.inspect end 

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

 {} 

url是这样的:

 /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并没有抓住它(显然这就是为什么它调用’failure’方法而不是我的回调)。 我不知道它是否可以通过’params’数组访问,或者是什么。

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

有什么想法吗?

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

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

(如果你没有使用Devise,只使用Omniauth,那么将代码添加到config/initializers/omniauth.rb

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

我知道这是一个老问题,但我有同样的问题,我在网上发现的任何东西都没有帮助。 事实certificate这个问题是由我使用Puma的方式引起的(从Thin带来的做法)。 我在同一台机器上启动了多个Puma进程(Apache反向代理),看起来Github的回调是与原始身份validation请求不同的Puma进程。 我将Puma进程降为1并且没有再次出现这种情况 (切换到使用Puma worker: puma -w 5 ,后者又使用由Puma管理的进程而不是Apache循环)。 这也是我从未在开发中遇到问题的原因,因为我没有在该环境中运行一组进程。

我意识到这是一个古老的问题,并且最初要求它解决它或者转移到其他解决方案的人,但是,我遇到了同样的问题,我对解决方案的追求使我在这里。

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

事实certificate这是微不足道的。 这就是我所拥有的:

 # 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就像更改前的情况一样。

如此愚蠢的错误和如此少的信息…

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

我不确定这个特定情况下的问题是什么,但如果你想深入研究代码,那么安装pry-debug gem。 它为您提供了带有step和next调试命令的pry接口。 在代码中添加pry.binding ,它将停止在服务器中执行并pry.binding接口。 例如:

 def failure binding.pry render :text => params.inspect end