ruby - 无法使用 facebook 进行身份验证 : undefined method 'web_server' for OAuth2?

标签 ruby ruby-on-rails-3 facebook oauth

试图让用户登录/注册 Twitter 和 Facebook。 Twitter 没有问题,但 Facebook 的策略不同。

undefined method `web_server' for #<OAuth2::Client:0x00000005211d58>

跟踪显示

oa-oauth (0.0.1) lib/omniauth/strategies/oauth2.rb:18:in `request_phase'
oa-oauth (0.0.1) lib/omniauth/strategies/facebook.rb:28:in `request_phase'
oa-core (0.0.5) lib/omniauth/strategy.rb:25:in `call!'
oa-core (0.0.5) lib/omniauth/strategy.rb:19:in `call'
oa-core (0.0.5) lib/omniauth/builder.rb:22:in `call'
warden (1.0.5) lib/warden/manager.rb:35:in `block in call'
warden (1.0.5) lib/warden/manager.rb:34:in `catch'
warden (1.0.5) lib/warden/manager.rb:34:in `call'

有没有人遇到过这种情况?

附言。我正在使用以下 gem :

gem 'oa-oauth', :require => 'omniauth/oauth'
gem 'oauth2'

我没有使用完整的 omniauth gem,因为它的可寻址依赖项与其他 gem 有冲突。

最佳答案

尝试在我的 Rails 应用程序上使用 facebook_oauth (https://github.com/moomerman/facebook_oauth) 时,我遇到了同样的问题。在花了一个小时左右尝试更改其代码后,我意识到直接使用 oauth2 可能更容易。我解决了这个问题,现在不需要那个中间库了。方法如下:

Gemfile 中添加

gem 'oauth2'

然后运行

bundle 更新

然后,在您的 login_via_facebook 方法中,您可以手动构建对话 uri 或使用 oauth 客户端,这些是:

oauth_client = OAuth2::Client.new(APPLICATION_ID, APPLICATION_SECRET, {
    :authorize_url => 'https://www.facebook.com/dialog/oauth'
})

redirect_to oauth_client.authorize_url({
    :client_id => APPLICATION_ID,
    :redirect_uri => YOUR_REDIRECT_URL
})

如果您需要请求额外的权限,请在 authorize_url 调用中指定 scope 参数:

redirect_to oauth_client.authorize_url({
    :client_id => APPLICATION_ID,
    :redirect_uri => YOUR_REDIRECT_URL,
    :scope => 'offline_access,email'
})

然后,在处理 YOUR_REDIRECT_URL 的方法中(我调用我的 login_via_facebook_callback),执行如下操作:

oauth_client = OAuth2::Client.new(APPLICATION_ID, APPLICATION_SECRET, {
    :site => 'https://graph.facebook.com',
    :token_url => '/oauth/access_token'
})

begin

  access_token = oauth_client.get_token({
      :client_id => APPLICATION_ID,
      :client_secret => APPLICATION_SECRET,
      :redirect_uri => YOUR_REDIRECT_URL,
      :code => params[:code],
      :parse => :query
  })

  access_token.options[:mode] = :query
  access_token.options[:param_name] = :access_token
  facebook_user_info = access_token.get('/me', {:parse => :json}).parsed

rescue Error => e

  # You will need this error during development to make progress :)
  #logger.error(e)

end

现在 facebook_user_info 有了基本的用户信息!

关于ruby - 无法使用 facebook 进行身份验证 : undefined method 'web_server' for OAuth2?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6967737/

相关文章:

ruby - 在 Ruby 中是否有语法 : class << self . .. end 的任何相关应用程序

ruby-on-rails - 按换行符 AND 逗号 AND 分号分割

ios - 是否可以通过 iOS SDK 在 Facebook 请求对话框中显示所有好友?

facebook - 查询 'like' 我的 Facebook 页面的用户

facebook - FQL photo 和 photo_src 表 src 使用 http 但不使用 https

Ruby 从字符串中删除第一个单词

ruby - 将 jQuery 翻译成 Watir

ruby-on-rails - Ruby on Rails : After change in view, 网站未更新

ruby-on-rails - 列名称中包含 #rails 和损坏的 activemodel

ruby-on-rails - 在 rails 控制台中预览 activerecord 查询?