我使用facebook
登录到使用facebook php sdk
的网站。
我注意到logout
链接没有任何作用。注销后,用户仍然可以浏览网站。这是我在facebook.php
:中的代码
<?php
require 'src/facebook.php';
$facebook = new Facebook(array(
'appId' => '*************',
'secret' => '******************************',
));
$user = $facebook->getUser();
$loginUrl = $facebook->getLoginUrl();
echo "<a href='$loginUrl'>login</a>";
$logoutUrl = $facebook->getLogoutUrl();
echo $loginUrl;
if($user){
session_start() ;
$_SESSION['user_info'] = $user;
$_SESSION['user_pro']= $facebook->api('/me');
print_r($_SESSION);
}
else{
echo 'not logged in ';
}
echo "<a href='example.com/logout.php'>log out </a>"
?>
此code
在登录时运行良好。注销链接应会破坏会话。这是页面的标题:
<?php
print_r($_SESSION) ;
header('example.com') ;
?>
我的logout.php
页面的问题是它根本没有检测到会话。我不知道这是facebook api
问题还是我的php
问题。
如何使用facebookSDK将用户注销?
您可以从您的网站和facebook注销,如下所示,将您的网站url提供给下一个参数并销毁会话
$token = $facebook->getAccessToken();
$url = 'https://www.facebook.com/logout.php?next=' . YOUR_SITE_URL .
'&access_token='.$token;
session_destroy();
header('Location: '.$url);
你还必须将他们从你的网站中注销,并且你必须防止你的网站自动记住你的用户并立即重新登录。
禁用自动登录用户的代码,然后再次尝试注销。销毁会话不会阻止您的网站为记住的用户创建全新的有效会话。
这是我的网站的PHP注销代码,该代码允许用户使用facebook登录和注销。你不必破坏会话来注销用户,从技术上讲,你所要做的就是向你自己的网站发出信号,表明这个特定的会话可能不会被用来让用户进入
logout.php:
<?php
require_once("facebook-php-sdk-6c82b3f/src/facebook.php");
$config = array();
$config['appId'] = '2911111111146';
$config['secret'] = 'a6eaaaaaaaaaaaaaaaaaaaaaaaaaad1a';
$config['fileUpload'] = false;
$facebook = new Facebook($config);
$logouturl = $facebook->getLogoutUrl();
$_SESSION['user_facebook_email'] = "";
$_SESSION['ask_user_to_login'] = true;
header("Location: showquestions.php");
?>
index.php:
<?php
require_once("facebook-php-sdk-6c82b3f/src/facebook.php");
$config = array();
$config['appId'] = '2911111111146';
$config['secret'] = 'a6eaaaaaaaaaaaaaaaaaaaaaaaaaad1a';
$config['fileUpload'] = false;
$facebook = new Facebook($config);
$userId = $facebook->getUser();
if ($_SESSION['ask_user_to_login'] == true || $userId == 0){
$loginUrl = $facebook->getLoginUrl();
$_SESSION['ask_user_to_login'] = false;
echo "<button type='button' onClick='"window.location='$loginUrl''">" .
"<img src='picture.gif' alt='Login with facebook'/>" .
"</button>";
exit;
}
else
{
$userInfo = $facebook->api('/' + $userId);
session_cache_expire (150000); //set the cache expire to 15000 minutes
$_SESSION['user_facebook_email'] = $userInfo['email'];
$_SESSION['facebook'] = $facebook;
header("Location: showquestions.php");
}
$userInfo = $facebook->api('/' + $userId);
echo "Welcome" . $userInfo['email'];
?>
login.php:
<?php
session_start();
if (isset($_SESSION['user_facebook_email']) !== true ||
$_SESSION['user_facebook_email'] == "")
{
header("Location: index.php");
exit;
}
?>
然后,在每个想要阻止在没有登录用户的情况下访问的php文件中,将其放在首位:
<?php
require("log2.php");
?>
使用此代码,用户将自动登录,如果他们调用注销代码,则在他们再次登录之前,网站不会允许他们登录。
从facebook注销用户可能很困难。这对我有效
// Get an instance of the Facebook class
$facebook = $this->facebook_instance_factory();
// Destroy the session so that no Facebook data is held
$facebook->destroySession();
$logout = $facebook->getLogoutUrl();
$facebook->setAccessToken('');
// Redirect the user to the logout url, facebook will redirect him to our page
wp_redirect( $logout );
您需要在将使用会话的所有页面上调用session_start()
。
要使某人退出会话(即清除会话),可以使用session_destroy()
。
最后,header('example.com');
实际上不会做任何事情,您打算执行重定向吗?如果是,则应使用"header("位置:http://example.com/');
编辑:很抱歉我没有正确阅读,第二个代码片段是什么?这是你的logout.php页面吗?
据我所知,使用Facebook API时,当你调用getLogoutUrl()
时,当用户点击链接时,你应该发送给他们,而不是你自己的logout.php
。
答案
$_SESSION['fb_(your_APP_ID)_access_token'] = '' ;
当初始化登录会话时,似乎如果我们将这些session
变量中的任何一个设置为null,就会中断登录功能,并要求用户再次登录