我想在我的页面上有两个登录按钮。我不太熟悉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>'; ?>
最佳答案
Facebook 在登录过程中使用 state
参数来防止 CSRF 攻击。该参数是存储到 session 中的随机值,并在下一步中检查是否匹配。
现在,getLoginUrl
方法每次调用时都会为 state
生成一个新随机值。因此,通过调用此方法两次,您将生成两个不同随机state
值,因此第二个值会覆盖存储在 session 中的第一个值,因此最终只有一个其中一个将匹配,而另一个则不会,因此会导致错误。
因此,不要调用 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>'; ?>
关于javascript - Facebook PHP SDK V4 : two login buttons,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29705641/