2011-01-27 62 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」。