Спокойный account fb connect php. Это правильный способ сделать FB Connect? 'Войти через Facebook'

login api (3)

Я считаю, что вам нужно вернуть 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.

Итак к делу! В интернете я нашел несколько тем, которые описывают вопрос авторизации, некоторая информация мне помогла, но я не нашел ни одной, которая бы решила поставленную мной задачу, поэтому, завершив задачу я и решил написать эту статью.

СДЕЛАНО: Регистрация пользователя в БД и его авторизация на сайте одним нажатием Кастомной кнопки (любая картинка на ваш вкус)

1. РЕГИСТРАЦИЯ ПРИЛОЖЕНИЯ В ФБ:а. https://developers.facebook.com/apps/
б. Регистрируем приложение, прописываем адрес вашего сайта, страницы принятия данных для ответа, и многое другое. Интерфейс очень дружелюбный, фэйсбук нас любит. Поэтому рассписывать всё и вся я не буду. Оттуда нам нужно будет 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"));
Ну собственно по фронтэнду всё, теперь рассмотрим БэкЭнд.

3. БЭК ЭНД public function fb(){ if (($this->session->userdata("logged_in") != true)){ // 1. Не делаем ничего, если пользователь УЖЕ залогинен. // 2. Если нет, то Проверим, есть ли у нас в БД юзер с таким FB_ID // если есть, то залогинем его // 3. Если пользователя в базе нет, то сначала его зарегаем и сразу залогинем // Итак, вытаскиваем из базы всё что есть по данному пользователю и заносим всё в его сессию, т.е. "логинем" $query = $this->db->get_where("users", array("fb_id" => $_POST["id"])); if ($query->num_rows() > 0) { foreach ($query->row_array() as $key => $value) { $userdata[$key] = $value; } $userdata["logged_in"] = true; //проверяем, есть ли у пользователя в сессии информация по какой-либо его сделке, если есть, добавляем пользователя в сделку if ($this->session->userdata("bet_code_last") != false) { $data = array("start_user_id" => $userdata["id"]); $this->db->where("bet_code", $this->session->userdata("bet_code_last")); $this->db->update("bet", $data); $this->session->sess_destroy(); } $this->session->set_userdata($userdata); echo "залогинились"; } else { $data = array("fb_id" => $_POST["id"], "lang" => "en", "name" => $_POST["name"],); // предполагаем, что если имя пользователя содежит русские символы, то русский язык интерфейса ему будет более удобен if(preg_match("/[ёа-я]/i", $_POST["name"])){$data["lang"]="ru";} $this->db->insert("users", $data); // строчкой выше зарегали его в базе, а стройкой ниже залогинили пользователя;) $data["logged_in"] = true; $this->session->set_userdata($data); echo "зарегались"; } }else{echo "уже был залогинен";} }
В 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")); } } }

Logout

Второе редактирование:

К сожалению, это было в то время как я написал это, поэтому мне пришлось вернуться и выяснить, как это реализовано: 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")); } } }

Logout

Второе редактирование:

Простите, прошло некоторое время с тех пор, как я это написал, поэтому мне пришлось вернуться и выяснить, как это реализовано: 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(); }