无法使用facebook进行身份验证:OAuth2的未定义方法'web_server'?

dig*_*tie 5 ruby facebook oauth ruby-on-rails-3

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

undefined method `web_server' for #<OAuth2::Client:0x00000005211d58>
Run Code Online (Sandbox Code Playgroud)

跟踪显示

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'
Run Code Online (Sandbox Code Playgroud)

还有其他人经历过这个吗?

PS.我正在使用以下宝石:

gem 'oa-oauth', :require => 'omniauth/oauth'
gem 'oauth2'
Run Code Online (Sandbox Code Playgroud)

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

jba*_*sko 4

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

Gemfile添加

gem 'oauth2'
Run Code Online (Sandbox Code Playgroud)

然后运行

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
})
Run Code Online (Sandbox Code Playgroud)

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

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

然后,在处理 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
Run Code Online (Sandbox Code Playgroud)

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