2011-02-15 59 views
42

我使用java和我的演示應用程序的目的很簡單:更新用戶狀態。 我遵循服務器端流程的第http://developers.facebook.com/docs/authentication頁。我得到了auth對話框,facebook導致了回調網址,我在我的回調頁面中獲得了代碼。然後,當我嘗試生成訪問令牌時,我失敗了。無法從Facebook獲取訪問令牌。有一個OAuthException說:「錯誤驗證驗證碼」

在引導頁面,它說的以下網址可以用來生成一個訪問令牌:

https://graph.facebook.com/oauth/access_token? 
    client_id=YOUR_APP_ID&redirect_uri=YOUR_URL& 
    client_secret=YOUR_APP_SECRET&code=THE_CODE_FROM_ABOVE 

但在我的環境會發生什麼,我得到了以下錯誤消息:

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

我很確定每個參數都是正確的,因爲如果我更改client_id值或client_secret參數,我會得到不同的錯誤消息。代碼參數是我從facebook回調中獲得的。所以這應該是正確的,對嗎?真的不知道有什麼問題....

對此有何想法?我卡在這裏...

+29

由我自己......關鍵問題是所有關於「URL」解決了這個。代碼生成網址中的回調「redirect_uri」也應該與令牌生成網址中的「redirect_uri」一樣... – DeepNightTwo 2011-02-18 14:28:12

+1

絕對無價。對此感激不盡。 – dimitarvp 2011-12-08 10:25:45

+0

這很愚蠢,應該在文檔中提到。非常感謝信息 – 2012-03-31 12:30:11

回答

61

我最近處理了這個問題:所有匹配的,但它失敗的OAuthException。這使得它的工作的事情是從改變重定向URI(在流兩個請求):

http://foo.example.com

http://foo.example.com/

即,加最後的斜線。然後它工作。愚蠢而愚蠢的,但你去了。

2

是的,最後的斜線也適用於我,謝謝!

進行調試,我發現它有助於使用完全相同的代碼FB提供了開發者頁面上:

http://developers.facebook.com/docs/authentication/

一旦你得到的工作,你可以修改它以適合你自己的代碼。

我不確定,但您也可以檢查以確保您的「網站網址」和「網站域」設置在應用編輯屏幕上是正確的,因爲根據文檔,redirect_uri必須相同域。 (這與畫布/標籤頁網址不同)。

3

我們對此也有一些樂趣。

在我們的案例中,URL中的斜線已經存在,所以我嘗試了我們在FB Debug Tool中使用的令牌,並且驗證了它,所以它看起來像FB甚至沒有在請求中看到令牌。

經過一番調查後,我發現頭部瘦肉 - 我們用HTTP Headers做的GET只與Querystring沒有關係,因此FB litterally根本沒有看到令牌。

道德似乎是,如果你能得到的令牌在FB調試工具驗證,還有在你的要求可能/事/不對勁 -

這可能是一個缺少「/」或其他與應用程序定義的URL不匹配(Domain mismatch是一個不同的錯誤)。我還沒有嘗試爲HTTPS定義App/Web Url並使用HTTP執行請求,但我懷疑它也會以某種方式打嗝。

或者在我們的例子中,請求方法可能不正確 - GET和Headers或POST兩者都拋出2500,你必須用Querystring做GET。

希望有幫助!

6

我有同樣的問題,並嘗試了上述建議。他們幫助,但在我的情況下,問題是我的redir網址有一個查詢參數,Facebook並不酷。因此,故事的道理在於,您爲交換令牌而發送的redir url必須與原始redir url相同,並且不能具有查詢參數。

3

我有同樣的問題。這是一個網址差異,但與其他網站不同,我的是HTTP和HTTPS之間的區別。

我們有BigIP處理HTTPS請求並轉發到HTTP Apache服務器。當調用BaseFacebook的getCurrentUrl()函數時,它檢測到HTTP,而不是原始的HTTPS。我已修改該功能,如下所示:

protected function getCurrentUrl() { 
    if ((isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on' || $_SERVER['HTTPS'] == 1)) || 
     (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') || 
     (isset($_SERVER['HTTP_PSEUDOSSL']) && $_SERVER['HTTP_PSEUDOSSL'] == 'true')) { 
     $protocol = 'https://'; 
    } 
    else { 
     $protocol = 'http://'; 
    } 
... 

此版本支持HTTP_PSEUDOSSL鍵。我希望這可以幫助別人。

0

我也有一個url問題,但解決方案是不同的。我通過了signedRequestJavaScript SDK返回到服務器,並使用code值來請求訪問令牌。之後,我改變了我自己的服務器端代碼中使用

// the JS SDK puts a code in with the redirect_uri of '' 
if (array_key_exists('code', $signed_request)) { 
    $code = $signed_request['code']; 
    $access_token = $this->getAccessTokenFromCode($code, ''); 
    if ($access_token) { 
     // etc 
    } 
} 

:但是,根據在3.1.1版本中Facebook PHP SDK的一些意見時,JavaScript SDK關聯的code與空字符串的redirect_uri,即""""redirect_uri,則對訪問令牌的請求起作用。

0

在我的情況下,我的代碼不適用於IE。 問題是在下面的行

$user_id = $facebook->getUser(); 
if ($user_id) 

因爲莫名其妙的getUser函數總是返回0,這樣的條件是總是如此。他從無效標記中產生了該錯誤。 嗯,我固定它通過只說這句話的:

if ($user_id>0) 

傻東西...

相關問題