Я знаю, что это старый вопрос, но я понял его только сейчас, пытаясь понять то же самое.По сути, хотя в демонстрационных примерах с примерами webtechnick он помещает «Facebook.Connect» в AppController, но, если вам нужен выборочный элемент выхода из системы, лучшее место для его размещения - это внутри реальных контроллеров, в которых вы хотите использовать его илиположить его в AppController и передать в него noAuth=> true
.В любом случае, какой бы способ вы ни выбрали, вы устанавливаете один контроллер (facebook_controller.php?) Для обработки входов в систему и устанавливаете для его компонента значение noauth, равное false (по умолчанию).Таким образом, у вас есть полный контроль над тем, вошел ли пользователь обратно на сайт, и вы можете РЕАЛЬНО выйти из него (с обычным redirect($this->Auth->logout()
);
Позвольте мне дать вам представление:
app_controller.php
class AppController extends Controller {
var $components = array('Auth', 'Acl', 'Session');
//or if you want access to "$this->Connect" universally:
// array('Auth', 'Facebook.Connect' =>
// array('noauth'=>'true', 'Acl', 'Session');
}
users_controller.php:
class UsersController extends AppController{
var $helpers = array('Facebook.Facebook');
//an example of the users controller, enabling connect, but
// not authorizing the user (because logout() used by Auth is here)
var $components = array('Email', 'Session', 'Facebook.Connect' => array('createUser'=>false, 'noauth'=>true));
//login() doesnt need to be shown and can be left alone
function logout(){
if ($this->Connect->FB->getUser() == 0){
$this->redirect($this->Auth->logout());
}else{
//ditch FB data for safety
$this->Connect->FB->destroysession();
//hope its all gone with this
session_destroy();
//logout and redirect to the screen that you usually do.
$this->redirect($this->Auth->logout());
}
}
}
ваш "facebook_controller.php": класс FacebookaController расширяет AppController {... // я лично нехотел бы, чтобы его часть создала моего пользователя так: var $ components = array ('Facebook.Connect' => array ('createUser' => false));...
function login(){
//just need this stub function for later
$this->autoRender = false;
}
//you also need this for deauths or they will still be able to get into the site after deauth (against policy or whatever)
function deauthorize(){
//get user id from facebook API
$uid = $this->Connect->FB->getUser();
$record = $this->User->findByFacebookId($uid);
$this->User->delete($record['id'], FALSE);
}
}
теперь ваш файл users / login.ctp:
<script>
window.fbAsyncInit = function() {
FB.init({
appId : 'your app id', // App ID
channelUrl : '//'+window.location.hostname+'/facebook/channel', // Channel File
status : true, // check login status
cookie : true, // enable cookies to allow the server to access the session
xfbml : true // parse XFBML
});
// Additional initialization code here
FB.Event.subscribe('auth.statusChange', function(response){
if (response.status == "connected"){
alert('redirecting you to auto facebook login');
//here is out default place for login
window.location.href = "http://"+window.location.hostname + "/facebook/login";
}
});
};
// Load the SDK Asynchronously
(function(d){
var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0];
if (d.getElementById(id)) {return;}
js = d.createElement('script'); js.id = id; js.async = true;
js.src = "//connect.facebook.net/en_US/all.js";
ref.parentNode.insertBefore(js, ref);
}(document));
</script>
<?php e($this->Facebook->login(array('registration-url'=>'http://www.yoursite.com/facebook/signup'))); ?>
И это должно быть во многом так.Я надеюсь, что это помогает кому-то, читающему это, кто все еще нуждается в помощи.