2

我在这里关注代码: http ://railscasts.com/episodes/241-simple-omniauth?autoplay=true

我正在使用 ruby​​ 1.9.2p180(2011-02-18 修订版 30909)[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

当我在 localhost 上运行它并授予应用程序访问权限时,它会访问我的开发服务器并杀死它。这是堆栈跟踪(始终可重现):

-- 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

4

2 回答 2

4

经过几个令人沮丧的小时后,我在这里找到了解决方案: http ://redmine.ruby-lang.org/issues/4875

基本上,Postgres gem 最终使用了不同版本的 OpenSSL。我仍然不完全清楚所有这些在幕后如何工作的细节,但摆脱困境的方法是:

  1. 卸载 openssl 和 postgresql
  2. 卸载 pg gem (gem 卸载 pg)
  3. 使用自制软件安装 openssl 和 postgresql
  4. 从源代码分叉并安装 pg gem (我下载了它并运行了“rake install”)

即使使用 MySQL gem 从四处阅读也可能发生这种情况。

最后,我和许多其他开发人员一样使用 Mac OSX (Snow Leopard)。

于 2011-07-14T04:38:38.167 回答
1

我对此的解决方案比其他一些帖子要简单一些。
我不必卸载并重新安装opensslpostgresql.
我通过 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.

于 2012-02-01T04:07:25.463 回答