Facebook PHP SDK V4:两个登录按钮

时间:2015-04-17 17:19:28

标签: javascript php facebook sdk

我想在我的页面上有两个登录按钮。我对SDK的编码不太熟悉,这可能吗?

一个按钮工作正常,但第二个按钮没有。它只是将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 个答案:

答案 0 :(得分:1)

Facebook在登录过程中使用state参数来防止CSRF攻击。该参数是一个随机值,存储在会话中,并在下一步检查匹配。

现在,getLoginUrl方法每次调用时都为state生成一个 new 随机值。因此,通过两次调用此方法,您将生成两个不同的随机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>'; ?>
相关问题