【问题标题】:Can't use facebook to authenticate: undefined method 'web_server' for OAuth2?无法使用 facebook 进行身份验证:OAuth2 的未定义方法“web_server”?
【发布时间】:2011-09-21 17:28:26
【问题描述】:

试图让用户使用 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'

其他人经历过这种情况吗?

ps。我正在使用以下宝石:

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

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

【问题讨论】:

  • 您使用的是什么版本的 oauth2?据我所知,由于 oauth2 规范的变化速度如此之快,它的更新速度非常快。当我使用试图使用 oauth2 版本 0.5.0 的魔法 gem 时,我遇到了和你一样的问题
  • 我目前正在使用 Oauth2 0.4.1

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


【解决方案1】:

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

Gemfile添加

gem 'oauth2'

然后运行

bundle update

然后,在您的 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 有了基本的用户信息!

【讨论】:

    【解决方案2】:

    我遇到了类似的问题,你应该尝试两件事:

    1. 我还遇到了冲突的 gem 问题/依赖项问题,并通过在我的 gemfile 中添加以下内容来解决它们:

    gem 'omniauth', :git => 'git://github.com/intridea/omniauth.git'

    1. 尝试使用一个非常适合立即启动 Twitter/Facebook 应用程序的 Rails 应用程序模板,在终端中运行以下命令:

    rails new APP_NAME -m https://github.com/RailsApps/rails3-application-templates/raw/master/rails3-mongoid-omniauth-template.rb -T

    您可以在此处阅读更多信息: https://github.com/RailsApps/rails3-mongoid-omniauth/wiki/Tutorial

    【讨论】:

      【解决方案3】:

      在这里我遇到了一个示例应用程序,它演示了omniauth 和authlogic 的使用 https://github.com/madhums/omniauth-authlogic-demo 希望对你有帮助

      【讨论】:

        猜你喜欢
        • 2022-11-03
        • 1970-01-01
        • 1970-01-01
        • 2021-08-03
        • 2012-04-01
        • 1970-01-01
        • 2015-03-11
        • 1970-01-01
        • 2015-09-08
        相关资源
        最近更新 更多