2010-12-08 245 views
53

很奇怪的錯誤。我使用gide http://developers.facebook.com/docs/authentication/。所以我創建fb請求並傳遞redirect_uri。我在本地主機上使用測試站點。所以,如果我通過facebook錯誤'驗證驗證碼錯誤'

REDIRECT_URI = http://localhost/test_blog/index.php

它工作正常,但如果我通過

REDIRECT_URI = http://localhost/test_blog/index.php?r=site/oauth2

它不想工作。我嘗試使用

redirect_uri =。 urlencode('http://localhost/test_blog/index.php?r=site/oauth2

但不起作用。 我嘗試解釋。我成功獲取代碼,但是當我訪問https://graph.facebook.com/me?access_token時,出現錯誤「驗證驗證碼錯誤」。我查了有史以來,錯誤是在?r = site/oauth2但我需要通過一些參數 有人可以幫助我嗎? 我看過帖子http://forum.developers.facebook.net/viewtopic.php?id=70855,但沒有任何工作對我來說

+0

我看到我們可以使用url重寫像http://localhost/tes...php/site/oauth2但它只是有趣的如何解決問題 – kusanagi 2010-12-08 12:59:42

回答

125

目前(截至2011年3月)關於什麼使得有效的redirect_uri有無證的要求。

首先,這兩個redirect_uri參數都要授權並且access_token必須匹配

顯然,Facebook(或者說OAuth2)正在使用redirect_uri作爲內部密鑰來編碼爲access_token請求返回的代碼。這是有點聰明,因爲它驗證回到您的網站。它解釋了爲什麼不需要redirect_uri參數的access_token請求需要一個。

二,你不能在redirect_uri中使用許多特殊字符。

很多討論憤怒是否可以傳遞參數。他們可以,你是有限的哪些字符是有效的,但沒有人發佈了我知道的列表。傳統的方法,如url/html編碼將失敗,因爲百分比(%)無效。斜槓(/)無效,因此嵌套的重定向URL總是失敗。克服特殊字符限制的唯一方法是將參數的值編碼爲base64。如果您使用ASP.NET,請查找Convert.ToBase64。

最後,這更多的是一個側面說明。有很多程序員傳遞錯誤信息,簡單的解決方案是傳遞type = client_cred。這可能會限制您訪問您在授權中請求的某些權限。這是不可取的。

+1

優秀的解釋,謝謝你 – 2011-05-08 04:33:15

+1

謝謝:)有幫助 – DhruvPathak 2011-05-26 08:13:49

+2

@邁克爾是男人! – 2011-08-24 01:28:54

2

我不知道它是否會有所幫助,但我會建議只編碼URL中的值。不是全部。例如:

redirect_uri='http://localhost/test_blog/index.php?r='.urlencode('site/oauth2'); 
+0

它沒有幫助,我試了 – kusanagi 2010-12-08 15:59:23

+0

這一個爲我工作 - 它必須是引起問題的參數中的'/' - 謝謝 – Richard 2014-11-18 12:39:18

1

我在使用pb,最後修復了在url中添加type = client_cred參數的問題。

+2

我不會推薦這個。 type = client_cred參數用於不同的用例。 – Bryan 2011-08-17 15:33:44

5

從我所看到的問題來看,這裏的問題是redirect_uri必須以'/'結尾,而不是'?'或其他特殊字符。我認爲這就是爲什麼你得到'錯誤驗證驗證碼'。此錯誤僅在使用file_get_contents()時出現,而不在使用facebook php庫時出現。 這是php的解決方案,不知道這個錯誤是否出現在其他SDK中。

+0

刪除?從url爲我解決了這個問題。謝謝。 – Ajibola 2014-02-06 15:25:19

0

我剛剛有同樣的問題。

不可否認,我是一個超級n00b,所以如果這個解決方案在實際操作中沒有任何意義,那麼請原諒。

我只需在頁面上用我的FB Connect按鈕設置一個短熔斷器cookie(1-2分鐘),並在頁面中顯示一個測試變量。當FB返回信息給我的數據解析/處理腳本時,我檢查了這個cookie,我重定向了它,如果找到了,使用header:location指示用戶正確的URL。

當然一些瀏覽器/用戶等可以禁用cookie。這顯然不會在那裏工作(也許使用會話變種,並在fb數據處理程序中銷燬它?)我相信有更好的方法來做到這一點,但目前,這個bandaid的作品。

47

redirect_uri=http://localhost:8000(編碼爲http%3A%2F%2Flocalhost%3A8000)測試時...

解決方式是確保把結尾的斜線/的URI的結尾有同樣的問題一整天。所以redirect_uri=http://localhost:8000/(編碼爲http%3A%2F%2Flocalhost%3A8000%2F)。

再次確保redirect_uri對於這兩個請求都是相同的。

0

我注意到你正在使用我正在使用的Yii,並且半天的時間也有同樣的問題。如前所述,問題出在你的URL中的特殊字符i.e. r=site/oath2

你可以在你的配置使漂亮的網址,以便您的網址將成爲index.php/site/oath2

似乎沒有結尾的斜線工作雖然解決它。

6

Aaron Wheeler給出的部分信息不正確。

這是事實,「REDIRECT_URI」參數必須在兩個請求相同,但這是完全可能的URL編碼規則的URL和使用,作爲價值的「REDIRECT_URL」參數,只要你請小心進一步對任何內嵌網址進行網址編碼。

舉例來說,你希望Facebook的重定向到以下網址:

http://www.mysite.com/Users/oAuthComplete?my_param_1=/Party/pants 

試圖將用戶重定向到

'https://www.facebook.com/dialog/oauth?client_id=12345&redirect_uri=' 
. urlencode('http://www.mysite.com/Users/oAuthComplete?my_param_1=/Party/pants'); 

也將失敗/Party/Pants創建一個無效URL

然而,重定向到

'https://www.facebook.com/dialog/oauth?client_id=12345&redirect_uri=' 
.urlencode('http://www.mysite.com/Users/oAuthComplete?my_param_1=' 
.urlencode('/Party/pants')); 

將按預期工作。

如果您正在使用返回的第二個驗證應用程序請求中的redrect_uri值,請確保再次進行url編碼 - 當填充$ _GET超全局時,該值會自動進行URL解碼。 - 這是絆倒了我。

'https://graph.facebook.com/oauth/access_token?client_id=12345&&client_secret=SECRET&code=1234567' 
.urlencode('http://www.mysite.com/Users/oAuthComplete?my_param_1=' 
.urlencode($_GET['my_param_1'])); 

P.s.在您的實際代碼中,我建議使用sprintf()而不是像我的示例一樣將字符串鏈接在一起,以獲得更好的可讀性。

0

對我來說,答案是這樣的:

$user = $facebook->getUser();  
if (!$user) { 
    $loginUrl = $facebook->getLoginUrl(array(
     'scope' => '', 
     'redirect_uri' => $this->domain, 
    )); 
    print('<script> top.location.href=\'' . $loginUrl . '\'</script>'); 
} 

我已經破解我的頭很長一段時間才找到這個解決方案,似乎我不是唯一一個有這個問題,我希望這對你的作品至!

16

我有這個問題。我知道一個事實,即我的URL是相同的,因爲我使用了一個具有相同$ var的類,但是我一直在獲取400響應,並且在JSON響應中出現了該錯誤。

我做的唯一的事情就是從改變我的REDIRECT_URI:

http://myredirecturi.com 

http://myredirecturi.com/ 

葉,剛添加的尾隨斜線和它的工作。

8

你並不需要編碼,只需將'/'放在redirect_url的末尾,一切都應該很好!