我想在我的页面上有两个登录按钮。我对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>'; ?>
答案 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>'; ?>