2011-01-27 67 views
4

问题我有使用https://github.com/intridea/oauth2 Rails项目。在我的Rails应用程序,我有以下代码:使用OAuth 2宝石

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宝石的自述文件中提供的西纳特拉的应用程序,它工作正常。

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浏览器操作的混合操作。任何建议将不胜感激。

+0

你有没有很好的配置你的Facebook应用程序的有效回调网址,你使用这个回调url? – shingara 2011-01-27 09:10:30

回答

2

我找到了答案,我的问题在本页面Facebook graph API - OAuth Token

我遇到了完全一样的问题,但 原来的问题不是REDIRECT_URI 参数的 编码,或者说我有尾随 斜线或问号它只是 我在两个不同的 重定向的URL传递(没有看过当时的 规范)。

的REDIRECT_URI仅用作一个 重定向一次(第一次)到 重定向回依赖方 与“代码”令牌。第二次, redirect_uri被传递回 auth服务器,但这次不是 ,因为您希望(重定向)使用 而不是 服务器用于验证代码。服务器 使用access_token进行响应。

你会发现Facebook的文档 (这是可怕的)说取 “由 换取一个访问令牌获取.... ”

总之,我没有编码或 在同一REDIRECT_URI做什么特别的URI,只是 通两次, 并获取第2页获得 内ACCESS_TOKEN。

我没有正确复制我的原始代码,并且我传递的重定向uri得到的代码与我通过获取访问令牌的uri不同。 Facebook的API文档是可怕:(

0

我有这个问题/错误,但终于找到了不同的解决方案(通过比较这是我的工作开发的应用程序设置)到我的督促程序的设置(这是产生这个错误)。

我去高级设置页面为我在Facebook开发应用程序: https://developers.facebook.com/apps/YourAppID/advanced

然后我发现了“加密的访问令牌:”设置,将其设为“Enabled”。