2015-04-17 133 views
0

我想在我的頁面上有兩個登錄按鈕。我對SDK的編碼不太熟悉,這可能嗎?Facebook PHP SDK V4:兩個登錄按鈕

一個按鈕正常工作,但第二個按鈕沒有。它只是將url更改爲index.php?code = wKdOAOLK ...而不登錄。

任何解決方法?

代碼:

// added in v4.0.0 
require './facebook-sdk/autoload.php'; 

use Facebook\FacebookSession; 
use Facebook\FacebookRedirectLoginHelper; 
use Facebook\FacebookRequest; 
use Facebook\FacebookResponse; 
use Facebook\FacebookSDKException; 
use Facebook\FacebookRequestException; 
use Facebook\FacebookAuthorizationException; 
use Facebook\GraphObject; 
use Facebook\Entities\AccessToken; 
use Facebook\HttpClients\FacebookCurlHttpClient; 
use Facebook\HttpClients\FacebookHttpable; 
use Facebook\GraphUser; 

// start session 

// init app with app id and secret 
FacebookSession::setDefaultApplication('x','x'); 

// login helper with redirect_uri 

$helper = new FacebookRedirectLoginHelper('http://localhost/'); 

try { 
$session = $helper->getSessionFromRedirect(); 
} catch(FacebookRequestException $ex) { 
// When Facebook returns an error 
} catch(Exception $ex) { 
// When validation fails or other local issues 
} 



// see if we have a session 
if (isset($session)) { 
... 
} 

按鈕,這兩個相同的代碼:

<?php echo '<a href="' . $helper->getLoginUrl() . '"><img src="facebook.png"></a>'; ?> 

<?php echo '<a href="' . $helper->getLoginUrl() . '"><img src="facebook.png"></a>'; ?> 

回答

1

的Facebook使用其登錄過程中state參數,以防止CSRF攻擊。該參數是存儲到會話中的隨機值,並在下一步中檢查匹配。

現在,getLoginUrl方法爲每次調用state時生成一個新的隨機值。所以通過調用這個方法兩次,你生成兩個不同的隨機state值,因此第二個覆蓋存儲到會話中的第一個,所以最終只有其中一個匹配,另一個不會並會因此導致錯誤。

所以,不要撥打getLoginUrl兩次 - 相反,調用它一次,存儲返回的URL,並且只有輸出它兩次。

$facebookLoginURL = $helper->getLoginUrl(); 

<?php echo '<a href="' . $facebookLoginURL . '"><img src="facebook.png"></a>'; ?> 

<?php echo '<a href="' . $facebookLoginURL . '"><img src="facebook.png"></a>'; ?> 
+0

好的,這是有道理的。謝謝! –