Почему герою не хватает времени, когда я пытаюсь использовать Omniauth + Google Apps? - PullRequest
4 голосов
/ 23 июля 2011

Я пытаюсь использовать Omniauth для обеспечения простой базовой аутентификации на основе Служб Google.Все отлично работает локально (даже в производственном режиме), но на 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-northscale или dalli, и в любом случае я убедился, что одноразовые номера сохраняются в ./tmp правильно, поэтому я не думаю, что это проблема.

Я получил ошибку о сертификатах CA, но указание файла сертификатов для средства извлечения решило это, и я все еще получаю тайм-аут.

Есть предложения?

ОБНОВЛЕНИЕ: я отследил это до обработчика обратного вызова OmniAuth.Запрос отправляется в Службы Google, но время обратного вызова истекает до того, как контроллер обратного вызова сможет что-либо сделать.

Ответы [ 3 ]

4 голосов
/ 25 июля 2011

ОК, так что после долгих попыток выглядело, как будто это проблема с OmniAuth handline URI Служб Google.В итоге я использовал обычную конечную точку 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

Первые две строки исключают некоторые предупреждения SSL, которые выдает Heroku.Я использую ./tmp для хранения файлов, и это прекрасно работает.В моем контроллере у меня есть условие if / then, которое проверяет мой домен в аутентифицированном электронном письме и перенаправляет на страницу, указывающую пользователю выбрать правильный аккаунт.

Это не идеальное решение, но я былневозможно заставить что-либо работать, используя идентификаторы OpenID для конкретного приложения.

2 голосов
/ 23 декабря 2011

У меня та же проблема, но только когда я пытаюсь аутентифицироваться на том же домене, что и домен, на который отвечает приложение heroku. Аутентификация на других доменах в приложениях Google работает нормально.

Я полагаю, что проблема в том, что существует какой-то блокирующий пингбэк от google или гема omniauth до домена / openid? = Some_number. Поскольку dyno занят обработкой запроса для / auth / google_apps, он не может ответить на другой запрос и, следовательно, истекло время ожидания. Я дам вам знать, если найду способ избежать этого запроса на блокировку.

0 голосов
/ 13 июня 2014

У меня была такая же проблема в разработке. Основываясь на тяжелой работе @ Kerinin, это то, что я закончил, и, кажется, работает до сих пор ...

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