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相冲突.
当我尝试在 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有了基本的用户信息!
| 归档时间: |
|
| 查看次数: |
2042 次 |
| 最近记录: |