2011-08-06 39 views
5

试图让用户登录/注册Twitter和Facebook。 Twitter的作品没有问题,但Facebook的策略不同。无法使用Facebook进行身份验证:OAuth2的未定义方法“web_server”?

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宝石作为其可寻址的依赖与其他宝石冲突。

+0

什么版本的oauth2您使用的是?据我所知,由于oauth2规格的变化速度很快,所以更新速度非常快。当我使用试图使用oauth2版本0.5.0 –

+0

的魔法宝石时,我遇到同样的问题我目前使用Oauth2 0.4.1 – digitalWestie

回答

4

我试图用facebook_oauth(https://github.com/moomerman/facebook_oauth)在我的Rails应用程序时遇到了同样的问题。花了一个小时左右的时间试图改变它的代码后,我意识到只是直接使用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 PARAM:

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有基本的用户信息!

1

我也有类似的问题,您应该要做两件事情:

  1. 我也有过冲突的宝石的问题/依赖性问题,在我的Gemfile添加此解决他们:

宝石'omniauth',:GIT中=> 'GIT中://github.com/intridea/omniauth.git'

  1. 尝试使用其作品非常好了在任何时间开始了Twitter/Facebook应用Rails应用程序模板,在你的终端运行此命令:

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

相关问题