2011-10-13 45 views
2

我在我的網站上使用Facebook連接,除了一個小(但煩人的)細節外,它工作正常。每當用戶登錄時,他們都會返回到原來的url,除了在url的末尾添加了一個額外的部分。例如,如果頁面www.domain.com,則通過Facebook登錄後,新的URL會是這樣的:facebook連接後登錄網址額外的值

www.domain.com/?state=407abe669787e4a97dc80c93d7ba5eae&code=AQDu0Vjf1hvo7N-TPmdsBygQCIxs7LfEfNMlf1aKNiyOeuAtDbIo-zTzWqWF7yv_Jsp4YOfkjQHqx17zsiCPYKxLyeL3BMdNr0HFnEu7Q50Hc2Ca92VfiDl9VWQJUDRYwjPDkpyZPJHOIkInaRA9xTivtuUtb5VCUGNvHSU7hRgb3muK-EKJ1p5iEnRjN1y7_Y8#_=_ 

我使用的是最新的Facebook的PHP SDK(3.1.1版截至目前)和我得到的登錄網址就像在這裏顯示的例子:https://developers.facebook.com/docs/reference/php/facebook-getLoginUrl/通過調用

$facebook->getLoginUrl(array('scope' => 'email', 'display' => 'touch')); 

,它創建了該URL看起來是正確的,是這樣的:

https://www.facebook.com/dialog/oauth?client_id=124847107591285&redirect_uri=http%3A%2F%2Fdomain.com&state=407abe669787e4a97dc80c93d7ba5eae&scope=email&display=touch 

我喜歡它,以便用戶返回到登錄後的url完全像它一樣,沒有額外的狀態和代碼值。我還沒有看到文檔中提到的任何內容,這真的讓我感到困擾。

我想知道是否有其他人遇到過這個問題,如果有的話,是否有解決方案。

回答

1

也許你沒有看正確的文檔頁面,但它說在https://developers.facebook.com/docs/authentication/很清楚的是這兩個參數的目的:

如果用戶按下允許,您的應用程序授權。基於OAuth的認證對話框 會重定向(通過HTTP 302),用戶的瀏覽器的URL您在REDIRECT_URI參數傳遞 與授權碼:

http://YOUR_URL?code=A_CODE_GENERATED_BY_SERVER

有了這個代碼在手,就可以繼續下一步,應用程序 認證,以獲得您需要進行API調用的訪問令牌。

至於狀態參數,這個對防止CSRF攻擊非常重要。

跨站請求僞造是攻擊,其中一個值得信賴的 (身份驗證和授權)用戶不知不覺 網站執行的操作。爲了防止這種攻擊,您應該在 狀態參數中傳遞一個標識符,然後在 響應中驗證參數匹配的狀態。我們強烈建議任何實施Facebook 用戶登錄的應用使用此機制實施CSRF保護。

總而言之,這些參數非常重要,如果您想要(也應該)您可以使用這些參數。

如果因爲任何原因你不希望你的用戶看到那個URL,你可以檢查它們是否在GET超全局中設置,如果它們是,在沒有這些參數的情況下將用戶重定向到你想要的頁面當下。

+0

嗯好吧我不知道我是如何錯過的。我假設自PHP SDK頁面開始說「通過手動管理訪問令牌的需要,PHP SDK極大地簡化了認證過程並授權用戶爲您的應用程序」(https://developers.facebook.com/docs/reference/php /)我不認爲我必須處理auth令牌,所以我不確定它爲什麼在SDK中的對象已經有權訪問它的時候給它發送給我。 在包含在SDK中的示例中,它也會在登錄後返回URL中的狀態和代碼。我想我會做一個重定向並清除$ _GET。 – somomomo