OAuth 2 Gem的问题

时间:2011-01-27 08:52:01

标签: ruby-on-rails ruby facebook oauth

我有一个使用https://github.com/intridea/oauth2的rails项目。在我的rails应用程序中,我有以下代码:

ApplicationController.rb

def facebook_client
  OAuth2::Client.new(FacebookOauthCredentials::APP_ID, FacebookOauthCredentials::APP_SECRET, :site => 'https://graph.facebook.com')
end

FacebookController.rb

def facebook_session_create(poster, featured_item)
  redirect_to facebook_client.web_server.authorize_url(:scope => 'publish_stream', :redirect_uri => "http://localhost:3000/facebook/facebook_callback")
end

def facebook_callback

  if(params[:code])
    begin
      access_token = facebook_client.web_server.get_access_token(params[:code], :redirect_uri => "http://localhost:3000/facebook/facebook_callback")

      access_token.post('/me/feed', "testing #{rand(1000)}")
    rescue OAuth2::HTTPError => e
      render :text => e.response.body
    end
  end
end

每次运行此代码时,我都会收到此回复:

{"error":{"type":"OAuthException","message":"Error validating verification code."}}

但是,我使用OAuth2 gem自述文件中提供的sinatra应用程序,它运行正常。

def client
  OAuth2::Client.new(FacebookOauthCredentials::APP_ID, FacebookOauthCredentials::APP_SECRET, :site => 'https://graph.facebook.com')
end

get '/auth/facebook' do
   redirect client.web_server.authorize_url(
    :redirect_uri => redirect_uri,
    :scope => 'publish_stream'
  )
end

get '/auth/facebook/callback' do
  access_token = client.web_server.get_access_token(params[:code], :redirect_uri =>   redirect_uri)

  begin
    user = JSON.parse(access_token.post('/me/feed', :message => "testing # {rand(10000)}"))
  rescue Exception => e
    return e.response.body
  end

  user.inspect
end

def redirect_uri
  uri = URI.parse(request.url)
  uri.path = '/auth/facebook/callback'
  uri.query = nil
  uri.to_s
end

我尝试使用irb重现这些步骤,但我遇到了一个http 400错误。我不确定它是否与rails应用程序的原因相同,或者是因为我正在进行控制台和Web浏览器操作的混合。任何建议都将不胜感激。

2 个答案:

答案 0 :(得分:2)

我在此页Facebook graph API - OAuth Token

找到了问题的答案
  

我遇到了完全相同的问题但是   事实证明问题不是   redirect_uri的编码   参数,或者我有一个尾随   这是简单的斜线或问号   我通过了两个不同的   重定向网址(还没读过   当时的规范)。

     

redirect_uri仅用作a   重定向一次(第一次)到   重定向回依赖方   使用“代码”令牌。第二次,   redirect_uri传回给   auth服务器,但这次不是   按预期使用(重定向)   而是由身份验证使用   服务器验证代码。服务器   用access_token回复。

     

你会注意到facebook的文档   (这很糟糕)说取   “将它换成一个访问令牌   取......   “

     

总之,我没有编码或   对Uri做一些特别的事,只是   两次传递相同的redirect_uri,   并获取第二页以获取   access_token里面。

我没有正确复制我的原始代码,并且我传递的重定向uri得到的代码与我传递给获取访问令牌的uri不同。 Facebook的API文档非常糟糕:(

答案 1 :(得分:0)

我遇到了这个问题/错误,但最终找到了一个不同的解决方案(通过比较我正在运行的Dev应用程序设置)和我的prod应用程序设置(产生此错误)。

我在Facebook Developer应用中访问了我的应用的高级设置页面: https://developers.facebook.com/apps/YourAppID/advanced

然后我找到了“加密访问令牌:”设置并将其设置为“已启用”。