当我尝试使用Omniauth + Google Apps时,为什么heroku会超时?

时间:2011-07-22 22:30:27

标签: ruby-on-rails openid heroku google-docs omniauth

我正在尝试使用Omniauth为Google Apps提供简单的基本身份验证。一切都在本地工作正常(即使在生产模式下),但在Heroku上我得到以下内容:

app[web.1]: Started GET "/auth/admin" for 24.155.228.161 at Fri Jul 22 15:10:26 -0700 2011
heroku[router]: Error H12 (Request timeout) -> GET example.com/auth/admin dyno=web.1 queue= wait= service=30000ms status=503 bytes=
heroku[router]: Error H12 (Request timeout) -> GET example.com/ dyno=web.1 queue= wait= service=30000ms status=503 bytes=0
app[web.1]: Generated checkid_setup request to https://www.google.com/a/example.com/o8/ud?be=o8 with assocication AOQobUegRUNfEpz1JOO2bZe0zXrjkdIvdsjpVyCh3rtbL_s-GSfhQ_zY

我的设置如下;

# initializers/omniauth.rb
require "openid/fetchers"
OpenID.fetcher.ca_file = "#{Rails.root}/cacert.crt"

require 'openid/store/filesystem'

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :google_apps, OpenID::Store::Filesystem.new('./tmp')
  use OmniAuth::Strategies::GoogleApps, OpenID::Store::Filesystem.new('./tmp'), :name => 'admin', :domain => 'bcarc.com' #, :client_options => {:ssl => {:ca_file => './cacert.crt'}} 
end

我已尝试切换到memcached,但我无法让memcached-northscaledalli工作,而且无论如何我都验证了在{{1}中保存了nonce正确的,所以我认为这不是问题所在。

我收到有关CA证书的错误,但是将该证书文件指定给fetcher解决了这个问题,而且我仍然会收到超时。

有什么建议吗?

更新: 我已将其跟踪到OmniAuth的回调处理程序。该请求会发送到Google Apps,但回调控制器有机会执行任何操作之前,回调会超时。

3 个答案:

答案 0 :(得分:4)

好的,所以经过多次拉毛后,看起来这是OmniAuth手绘Google Apps URI的问题。我最终使用普通的google OpenID端点,然后手动验证控制器中的域。对于任何有兴趣的人,我的代码现在看起来像这样:

require "openid/fetchers"
OpenID.fetcher.ca_file = "#{Rails.root}/cacert.crt"

require 'openid/store/filesystem'

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :openid, OpenID::Store::Filesystem.new('./tmp')

  use OmniAuth::Strategies::OpenID, OpenID::Store::Filesystem.new('./tmp'), :name =>       'openid', :identifier => 'https://www.google.com/accounts/o8/id'
end

前两行消除了Heroku抛出的一些SSL警告。我正在使用./tmp进行文件存储,而且工作正常。在我的控制器中,我有一个if / then子句,用于在经过身份验证的电子邮件中检查我的域并重定向到一个页面,告诉用户选择正确的帐户。

这不是一个明智的解决方案,但我无法使用任何特定于应用的OpenID标识符来处理任何问题。

答案 1 :(得分:2)

我遇到了同样的问题,但只有当我尝试针对与heroku应用程序响应的域相同的域进行身份验证时。在谷歌应用程序上对其他域进行身份验证工作正常。

我认为这个问题是因为从谷歌或omniauth gem到domain / openid?= some_number都有某种阻止pingback。因为dyno忙于为/ auth / google_apps提供请求,所以它无法回答其他请求,因此超时。如果我找到避免阻止请求的方法,我会告诉你。

答案 2 :(得分:0)

我在开发过程中遇到了同样的问题。基于@Kerinin的辛勤工作,这是我最终得到的,并且似乎到目前为止工作......

Rails.application.config.middleware.use OmniAuth::Builder do
 use OmniAuth::Strategies::OpenID, name: 'openid', identifier: 'https://www.google.com/accounts/o8/id'
end