Omniauth: обратный вызов Facebook убивает сервер разработки

Я следую приведенному здесь коду: http://railscasts.com/episodes/241-simple-omniauth?autoplay=true

У меня ruby ​​1.9.2p180 (версия 30909 18 февраля 2011 г.) [x86_64-darwin10.7.0] и Rails 3.0.7.

По сути, у меня есть собственная модель пользователя (без Devise/AuthLogic). Я создал SessionsController для обработки обратного вызова Facebook:

match "/auth/facebook/callback" => "sessions#create"

def create
  auth = request.env["omniauth.auth"]
  user = User.find_by_email(auth["user_info"]["email"]) || User.create_with_omniauth(auth)
  session[:user_id] = user.id
  redirect_to root_url
end

Наконец, моя модель пользователя:

class User < ActiveRecord::Base

  has_one :facebook

  validates :email, :presence => true, :uniqueness => true
  validates :facebook, :presence => true

  def self.create_with_omniauth(auth)
    create! do |user|
    user.email = auth["user_info"]["email"]
    user.facebook = Facebook.create!(:uid => auth["uid"])
  end

end

class Facebook < ActiveRecord::Base

  belongs_to :user

  validates :uid, :presence => true, :uniqueness => true
end

Когда я запускаю это на локальном хосте и предоставляю доступ к приложению, оно поражает мой сервер разработки и убивает его. Это трассировка стека (последовательно воспроизводимая):

-- control frame ----------
c:0060 p:---- s:0340 b:0340 l:000339 d:000339 CFUNC  :connect
c:0059 p:0011 s:0337 b:0337 l:000150 d:000336 BLOCK  /Users/andy/.rvm/rubies/ruby-1.9.2    -p180/lib/ruby/1.9.1/net/http.rb:678
c:0058 p:0031 s:0335 b:0335 l:000334 d:000334 METHOD /Users/andy/.rvm/rubies/ruby-1.9.2-    p180/lib/ruby/1.9.1/timeout.rb:44
c:0057 p:0026 s:0323 b:0323 l:000322 d:000322 METHOD /Users/andy/.rvm/rubies/ruby-1.9.2-    p180/lib/ruby/1.9.1/timeout.rb:87
c:0056 p:0444 s:0317 b:0317 l:000150 d:000150 METHOD /Users/andy/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/1.9.1/net/http.rb:678
c:0055 p:0011 s:0309 b:0309 l:000308 d:000308 METHOD /Users/andy/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/1.9.1/net/http.rb:637
c:0054 p:0048 s:0306 b:0306 l:000305 d:000305 METHOD /Users/andy/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/1.9.1/net/http.rb:626
c:0053 p:0025 s:0303 b:0303 l:000302 d:000302 METHOD /Users/andy/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/1.9.1/net/http.rb:1168
c:0052 p:0499 s:0296 b:0296 l:000295 d:000295 METHOD /Users/andy/.rvm/gems/ruby-1.9.2-p180@rails3tutorial/gems/faraday-0.5.7/lib/faraday/adapter/net_http.rb:45
c:0051 p:0041 s:0283 b:0283 l:000282 d:000282 METHOD /Users/andy/.rvm/gems/ruby-1.9.2-p180@rails3tutorial/gems/faraday-0.5.7/lib/faraday/request.rb:85
c:0050 p:0044 s:0276 b:0276 l:000275 d:000275 METHOD /Users/andy/.rvm/gems/ruby-1.9.2-p180@rails3tutorial/gems/faraday-0.5.7/lib/faraday/request.rb:27
c:0049 p:0065 s:0270 b:0270 l:000269 d:000269 METHOD /Users/andy/.rvm/gems/ruby-1.9.2-p180@rails3tutorial/gems/faraday-0.5.7/lib/faraday/connection.rb:177
c:0048 p:0069 s:0263 b:0263 l:000262 d:000262 METHOD /Users/andy/.rvm/gems/ruby-1.9.2-p180@rails3tutorial/gems/oauth2-0.1.1/lib/oauth2/client.rb:63
c:0047 p:0039 s:0254 b:0254 l:000253 d:000253 METHOD /Users/andy/.rvm/gems/ruby-1.9.2-p180@rails3tutorial/gems/oauth2-0.1.1/lib/oauth2/strategy/web_server.rb:15
c:0046 p:0070 s:0244 b:0244 l:000243 d:000243 METHOD /Users/andy/.rvm/gems/ruby-1.9.2-p180@rails3tutorial/gems/oa-oauth-0.2.0/lib/omniauth/strategies/oauth2.rb:87
c:0045 p:0042 s:0240 b:0240 l:000239 d:000239 METHOD /Users/andy/.rvm/gems/ruby-1.9.2-p180@rails3tutorial/gems/oa-oauth-0.2.0/lib/omniauth/strategies/facebook.rb:31
c:0044 p:0146 s:0237 b:0237 l:000236 d:000236 METHOD /Users/andy/.rvm/gems/ruby-1.9.2-p180@rails3tutorial/gems/oa-oauth-0.2.0/lib/omniauth/strategies/oauth2.rb:66
c:0043 p:0411 s:0233 b:0233 l:000232 d:000232 METHOD /Users/andy/.rvm/gems/ruby-1.9.2-p180@rails3tutorial/gems/oa-core-0.2.0/lib/omniauth/strategy.rb:49
c:0042 p:0019 s:0228 b:0228 l:000227 d:000227 METHOD /Users/andy/.rvm/gems/ruby-1.9.2-p180@rails3tutorial/gems/oa-core-0.2.0/lib/omniauth/strategy.rb:22
c:0041 p:0044 s:0224 b:0224 l:000223 d:000223 METHOD /Users/andy/.rvm/gems/ruby-1.9.2-    p180@rails3tutorial/gems/oa-core-0.2.0/lib/omniauth/builder.rb:30
c:0040 p:0014 s:0220 b:0220 l:000211 d:000219 BLOCK  /Users/andy/.rvm/gems/ruby-1.9.2-p180@rails3tutorial/gems/warden-1.0.4/lib/warden/manager.rb:35
c:0039 p:---- s:0218 b:0218 l:000217 d:000217 FINISH
c:0038 p:---- s:0216 b:0216 l:000215 d:000215 CFUNC  :catch
[.......snipped]


Abort trap

Моя настройка OmniAuth:

Rails.application.config.middleware.use OmniAuth::Builder do
    provider :facebook, 'MY_APP_ID', 'MY_SECRET',
        { :scope => 'email, offline_access',
          :client_options => { :ssl => { :ca_file => '/usr/lib/ssl/certs/ca-certificates.crt' } } }
end

Пробовал как с ssl клиентом, так и без, результат тот же.

Что бы это ни стоило, другие тоже столкнулись с этим, но я нигде не могу найти решение. См., например: https://github.com/plataformatec/devise/issues/1069.


person Andy Agrawal    schedule 13.07.2011    source источник


Ответы (2)


После нескольких разочаровывающих часов я нашел решение здесь: http://redmine.ruby-lang.org/issues/4875

По сути, гем Postgres в конечном итоге использовал другую версию OpenSSL. Детали того, как все это работает под капотом, мне до сих пор не совсем ясны, но способ отлипнуть:

  1. Удалить openssl и postgresql
  2. Удалить гем pg (удалить гем pg)
  3. Установите openssl и postgresql, используя доморощенный
  4. Разветвите и установите pg gem из исходного кода (я скачал его и запустил rake install)

Это может случиться даже с драгоценным камнем MySQL от чтения.

Наконец, я работаю на Mac OSX (Snow Leopard), как и многие другие разработчики.

person Andy Agrawal    schedule 14.07.2011
comment
спасибо спасибо спасибо спасибо спасибо спасибо спасибо спасибо спасибо спасибо спасибо спасибо спасибо спасибо спасибо спасибо спасибо спасибо спасибо спасибо спасибо спасибо спасибо!!!!! - person Josh Brody; 17.03.2014

Мое решение этой проблемы было немного проще, чем в некоторых других сообщениях.
Мне не пришлось удалять и переустанавливать openssl или postgresql.
Я установил эти два элемента через macports, и они отлично работают там, где они есть. . Проблема заключается в том, что процесс сборки ruby ​​немного рассинхронизирован, когда дело доходит до поиска openssl. Расширение openssl было связано с macports openssl version (1.0.0), а расширения дайджеста (например, md5, sha1 и др.) были связаны с system openssl version (0.9.8). Я повторно загрузил ruby-1.9.3-p0 и перекомпилировал со следующей опцией:

./configure --prefix=$HOME/.rbenv/versions/1.9.3-p0 --with-opt-dir=/opt/local

Аргумент --prefix, конечно же, должен указывать на место, где вы обычно устанавливаете ruby. Это заставило все правильно линковаться и с теми же версиями openssl.

Просто установить поверх существующей установки не получится, тогда полностью сдуйте ее и переустановите. Затем вернитесь в свое приложение и bundle install.

person Michael Grubb    schedule 01.02.2012