加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 无法使用facebook进行身份验证:OAuth2的未定义方法’we

发布时间:2020-12-17 03:13:14 所属栏目:百科 来源:网络整理
导读:试图让用户使用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
试图让用户使用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相冲突.

解决方法

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

在Gemfile中添加

gem 'oauth2'

然后跑

捆绑更新

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读