2012-07-05 73 views
1

我正在使用Facebook PHP SDK以允許用戶使用Facebook登錄到我的網站。
在下面我的測試(假設URL是http://mysite.com/test/fbtest.php),FB PHP SDK和mod_rewrite:getUser返回0

<?php 
    require_once("facebook.php"); 
    $fb = new Facebook(array('appId' => 'APP_ID', 'secret' => 'APP_SECRET')); 
    $fbuser = false; 
    $fbuserid = $fb->getUser(); 
    $fblogin = $fb->getLoginUrl(array(
     'redirect_uri' => "http://{$_SERVER['HTTP_HOST']}/test/fbtest.php")); 

if($fbuserid) 
{ 
    try 
    { 
     $fbuser = $fb->api("/me"); 
     print_r($fbuser); 
     echo "<br/>\n"; 
    } 
    catch (FacebookApiException $e) 
    { 
     $fbuser = false; 
     $fbuserid = 0; 
    } 
} 
if(!$fbuser) 
    echo "<a href=\"$fblogin\">FB Login</a>\n"; 
?> 

這似乎按預期方式工作。然而,當我添加以下重寫規則,

RewriteRule ^/FBtest/(.*)$ http://%{HTTP_HOST}/test/fbtest.php$1 

然後更改登錄重定向到下面,

$fblogin = $fb->getLoginUrl(array(
     'redirect_uri' => "http://{$_SERVER['HTTP_HOST']}/FBtest/")); 

然後$fb->getUser()總是返回0。我覺得我失去了一些東西重要。

回答

1

終於想出了這個問題。這是我所需要的重寫規則:

RewriteRule ^/FBtest/$ http://%{HTTP_HOST}/test/fbtest.php [QSA,NE] 

事實證明,我需要兩個QSA和NE標誌添加到該規則。

很像CBroe的答案,需要對加入REDIRECT_URI狀態/代碼參數(重寫規則內使用(.*),而不是不捕捉這些附加參數)的QSA標誌。

我還需要添加NE標誌,因爲Facebook身份驗證添加到redirect_uri的狀態/代碼正在被轉義。

0

您將無法使用您在應用程序設置中設置的域以外的任何其他域。

「請確保您使用的是根域,而不是sample.com/test/作爲您的url設置。」

+1

HTTP_HOST很可能是_same_域。 – CBroe 2012-07-06 08:33:41

+0

我相信Facebook通常會重定向到錯誤頁面,如果您嘗試從未指定的域進行身份驗證。 – finLprtoTyp 2012-07-06 13:02:28

1

在服務器端流程中,您的redirect_uri get的所有值都將作爲查詢字符串中的GET參數進行調用。

'redirect_uri' => "http://{$_SERVER['HTTP_HOST']}/FBtest/"

本REDIRECT_URI

所以,像

http://example.com/FBtest/?state=foo&code=bar 

將您的服務器上調用。

RewriteRule ^/FBtest/(.*)$ http://%{HTTP_HOST}/test/fbtest.php$1

的RewriteRules不檢查查詢字符串,他們只能看着URL的路徑組件。在你的情況下,這是/FBtest/,沒有任何背後 - 所以內部重定向到/test/fbtest.php,並且查詢字符串參數丟失,因爲你沒有說你想傳遞它們。

添加標誌[QSA] - 對「查詢字符串追加」 - 你的重寫規則(並刪除不必要的(.*)) - 那麼事情應該按預期工作,因爲你的fbtest.php將獲得所需的身份驗證過程中的查詢字符串參數。

+1

謝謝你的迴應。我不知道'[QSA]'標誌,我認爲'(。*)'會捕獲添加到redirect_uri的任何GET參數,並根據需要添加它們。不幸的是,我做了這些改變,我的問題仍然存在。 – finLprtoTyp 2012-07-06 12:53:31

+0

好吧,然後從腳本($ _GET,$ _POST,$ _COOKIE ...)的var_dump生成一些調試輸出 - 並比較兩種調用腳本的方式。任何重大差異......? – CBroe 2012-07-06 14:53:31

+0

我確實看到了一些東西。在重定向測試中,$ _SESSION是空的。在成功的測試中,它包含代碼,access_token和user_id參數。 $ _GET和PHPSESSID在兩個測試中都正確傳遞。 – finLprtoTyp 2012-07-06 19:35:00