Спокойный account fb connect php. Это правильный способ сделать FB Connect? 'Войти через Facebook'
Я считаю, что вам нужно вернуть false, чтобы предотвратить нормальное поведение ссылки. Что касается перенаправления, я делаю это на своем сайте:
LogoutЯ не совсем уверен, почему ваш logoutAndRedirect не работает, но этот пост может пролить свет: http://forum.developers.facebook.com/viewtopic.php?id=38549 .
Моя строка инициализации:
function initFB (){ FB_RequireFeatures ([ "XFBML" ], function (){ FB . init ("xxxx" , "xd_receiver.htm" );});}Моя выход из системы:
Log OutУ меня есть действующий сеанс в моем webapp и действительный сеанс Facebook, потому что мой пользователь показывает pic-шоу.
Единственный способ, с помощью которого я могу заставить Facebook правильно выйти из этой функции или.logout (), - это бросить
return false ;в смесь, так:
Log OutЭто, однако, все равно не перенаправляет нигде. Приложение просто сидит там после выхода из Facebook, поэтому сеанс сайта все еще живет и сломан.
Это чертовски расстраивает, поэтому, если кто-нибудь может изложить, почему это не будет перенаправлено, я все уши.
Находила функция, которую кто-то написал, чтобы запустить выход в Facebook и перенаправить правильно. Это прекрасно работает.
Javascript code : function fBlogout (){ try { FB . Connect . ifUserConnected (function (){ FB . Connect . logoutAndRedirect (); }, "http://fullurl.com/account/logout" ); } catch (e ){ location . href = "http://fullurl.com/account/logout" ; } } HTML Link : < a href = "#" onclick = "FBlogout(); return false;" > Log Out PHP code for logout : $facebook -> expire_session (); $facebook -> logout (MAIN_SITE_URL );Это должно работать почти во всех браузерах:
Var xhr=new XMLHttpRequest(); xhr.onload=function(){ console.log(xhr.responseText); } xhr.open("GET","https://12Me21.github.io/test.txt"); xhr.send();
Кроме того, есть новый API Fetch:
Fetch("https://12Me21.github.io/test.txt") .then(response => response.text()) .then(text => console.log(text))
Итак, начал я разрабатывать один проект по фану. Основная идея проекта проста: площадка, где все могут ставить на всё что угодно, заключать пари, сделки и БЕЗ каких либо ограничений. Развлекательный проект по сути своей.
Ну и конечно стал вопрос Удобной авторизации пользователей с наименьшим «трением». Подумав немного, я выбрал авторизацию через Facebook, но думаю, на этом я не остановлюсь и вы прочтете ещё несколько статей, с авторизацией через Google Acc, VK и Tweet.
Итак к делу! В интернете я нашел несколько тем, которые описывают вопрос авторизации, некоторая информация мне помогла, но я не нашел ни одной, которая бы решила поставленную мной задачу, поэтому, завершив задачу я и решил написать эту статью.
СДЕЛАНО:
Регистрация пользователя в БД и его авторизация на сайте одним нажатием Кастомной кнопки (любая картинка на ваш вкус)
б. Регистрируем приложение, прописываем адрес вашего сайта, страницы принятия данных для ответа, и многое другое. Интерфейс очень дружелюбный, фэйсбук нас любит. Поэтому рассписывать всё и вся я не буду. Оттуда нам нужно будет ID приложения и адрес сайта. 2. ФРОНТ ЭНД: Привожу полный рабочий пример со своего сайта. По клику на ссылку вызывается функция: «fb_login()», функция сначала проверяет «а залогинен ли пользователь в фэйсбуке?» если ДА, берет его ID и отправляет аяксом в БэкЭнд, если НЕТ, то вызывает форму для входа в Фэйсбук аккаунт.
Fb_login() - инициирует общение с ФБ
handle_fb_data() - занимается получением и пересылкой полученных из ФБ данных пользователя в БэкЭнд
function handle_fb_data(response){
FB.api("/me", function(response) {
console.log("Successful login for: " + response.name);
console.log("Прилитело из ФБ: "+JSON.stringify(response));
// alert("Прилитело из ФБ: "+JSON.stringify(response));
$.ajax({
type: "post",
url: "/do/reg/fb",
data: response,
success: function(msg) {
console.log(msg);
if ((msg=="зарегались")||(msg=="залогинились")){window.location.reload();}
},
error: function(){}
})
});
}
function fb_login(){
FB.getLoginStatus(function(response) {
if (response.authResponse) {
console.log("Welcome! Fetching your information.... ");
handle_fb_data(response);
} else {
console.log("Юзер был не залогинен в самом ФБ, запускаем окно логинизирования");
FB.login(function(response){
if (response.authResponse) {
console.log("Welcome! Fetching your information.... ");
handle_fb_data(response);
} else {
console.log("Походу пользователь передумал логиниться через ФБ");
}
});
}
}, {
scope: "email,id"
});
}
window.fbAsyncInit = function() {
FB.init({
appId: "{ТУТ ВСТАВЬТЕ ID ПРИЛОЖЕНИЯ}",
cookie: true, // enable cookies to allow the server to access
// the session
xfbml: true, // parse social plugins on this page
version: "v2.8" // use graph api version 2.8
});
};
// Load the SDK asynchronously
(function(d, s, id) {
var js, fjs = d.getElementsByTagName(s);
if (d.getElementById(id)) return;
js = d.createElement(s); js.id = id;
js.src = "//connect.facebook.net/en_US/sdk.js";
fjs.parentNode.insertBefore(js, fjs);
}(document, "script", "facebook-jssdk"));
Ну собственно по фронтэнду всё, теперь рассмотрим БэкЭнд.
В PHP коде используются функции обращения в БД от фрэймворка Codeigniter. Ну в общем весь процесс я описал, надеюсь, что весьма понятно и доступно.Примечания:1. Потом и кровью сам додумал, что лучше будет сначала проверять статус, а потом вызывать форму логина (на фронтэнде), чего не было не в одном из описаний в явном виде.
2.
После того как данные занесены в сессию, страница все ещё не обновлена, поэтому я её обновляю вот этой строкой, в те моменты, когда БэкЭнд подтверждает что сдела всё, что надо:
if ((msg=="зарегались")||(msg=="залогинились")){window.location.reload();}
Спасибо за внимание!
Абсолютно использовать SDK. Преимущество в том, что это библиотека, которая протестирована и используется в дикой природе. Никогда не перестраивайте колесо, когда вам этого не нужно (вы обнаружите, что вы сделаете больше);).
То, что я в конечном итоге делает в CI был добавить Facebook PHP SDK в мой каталог библиотеки и изменить __construct функцию Facebook класса быть:
Public function __construct() { $ci =& get_instance(); $this->setAppId($ci->config->item("fb_appId")); $this->setApiSecret($ci->config->item("fb_secret")); $this->setCookieSupport($ci->config->item("fb_cookie")); $this->setBaseDomain($ci->config->item("fb_domain")); $this->setFileUploadSupport($ci->config->item("fb_upload")); }
Как только это было сделано, я смог получить доступ к FB API из любого места в своем приложении через $this->facebook .
Сказав все это, все это было до 2.0, поэтому я не совсем уверен в том, какие изменения будут в случае необходимости (я использую Yii сейчас, и именно поэтому я не знаю, обязательный:)).
Надеюсь, что это поможет.
В соответствии с просьбой, я в конечном итоге добавив UserModel класс (расширение Model). У меня есть поддержка для нескольких пользователей, поэтому я не буду публиковать все это. Но это суть его:
Class UserModel extends Model { private $m_user; public function UserModel() { parent::Model(); $this->m_user = null; $session = $this->facebook->getSession(); if($session) { if($this->facebook->api("/me") != null) { $this->m_user = $this->facebook->api("/me"); } } } public function getUser() { return $this->m_user; } public function isLoggedIn() { return $this->getUser() != null; } // returns either the login or logout url for the given provider, relative to the // state that the current user object is in public function getActionUrl() { if($this->isLoggedIn()) { return $this->facebook->getLogouturl(); } else { return $this->facebook->getLoginUrl(array("next"=>currentUrl(), "cancel"=>currentUrl(), "req_perms"=>null, "display"=>"popup")); } } }
Второе редактирование:
К сожалению, это было в то время как я написал это, поэтому мне пришлось вернуться и выяснить, как это реализовано: P После быстрого grep я обнаружил, что я не использую getActionUrl в любом месте. Я добавил несколько сценариев для прослушивания событий входа/выхода в FB:
Google.setOnLoadCallback(on_load); google.load("jquery", "1.4.4"); window.fbAsyncInit = function() { FB.init({appId: "", status: true, cookie: true, xfbml: true}); FB.Event.subscribe("auth.login", on_fb_login); FB.Event.subscribe("auth.logout", on_fb_logout); }; function on_load() { // force all anchors with the rel tag "ext" to open in an external window // (replaces target= functionality) $("a").click(function(){ window.open(this.href); return false; }); } function on_fb_login() { location.reload(); } function on_fb_logout() { location.reload(); }
Абсолютно используйте SDK. Преимущество в том, что это библиотека, которая тестировалась и использовалась в дикой природе. Никогда не перестраивайте колесо, когда вам этого не нужно (вы обнаружите, что вы сделаете больше;)).
То, что я закончил в CI, заключалось в том, чтобы добавить PHP PHP SDK в каталог моих библиотек и изменить функцию __construct класса Facebook:
Public function __construct() { $ci =& get_instance(); $this->setAppId($ci->config->item("fb_appId")); $this->setApiSecret($ci->config->item("fb_secret")); $this->setCookieSupport($ci->config->item("fb_cookie")); $this->setBaseDomain($ci->config->item("fb_domain")); $this->setFileUploadSupport($ci->config->item("fb_upload")); }
Как только это было сделано, я смог получить доступ к FB API из любого места в своем приложении через $this->facebook .
Сказав все это, все это было до 2.0, поэтому я не совсем уверен, какие изменения будут в случае необходимости (я использую Yii сейчас, и именно поэтому я не знаю, нужны ли изменения:.))
Надеюсь, что это поможет.
Class UserModel extends Model { private $m_user; public function UserModel() { parent::Model(); $this->m_user = null; $session = $this->facebook->getSession(); if($session) { if($this->facebook->api("/me") != null) { $this->m_user = $this->facebook->api("/me"); } } } public function getUser() { return $this->m_user; } public function isLoggedIn() { return $this->getUser() != null; } // returns either the login or logout url for the given provider, relative to the // state that the current user object is in public function getActionUrl() { if($this->isLoggedIn()) { return $this->facebook->getLogouturl(); } else { return $this->facebook->getLoginUrl(array("next"=>currentUrl(), "cancel"=>currentUrl(), "req_perms"=>null, "display"=>"popup")); } } }
Второе редактирование:
Простите, прошло некоторое время с тех пор, как я это написал, поэтому мне пришлось вернуться и выяснить, как это реализовано: P После быстрого grep я обнаружил, что я вообще не использую getActionUrl . Я добавил несколько клиентов script для прослушивания событий входа/выхода в FB:
Google.setOnLoadCallback(on_load); google.load("jquery", "1.4.4"); window.fbAsyncInit = function() { FB.init({appId: "", status: true, cookie: true, xfbml: true}); FB.Event.subscribe("auth.login", on_fb_login); FB.Event.subscribe("auth.logout", on_fb_logout); }; function on_load() { // force all anchors with the rel tag "ext" to open in an external window // (replaces target= functionality) $("a").click(function(){ window.open(this.href); return false; }); } function on_fb_login() { location.reload(); } function on_fb_logout() { location.reload(); }