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

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, заключалось в том, чтобы добавить 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(); }

Connecting FB accounts with accounts on my website

Please help me or just give me a hint where should I start, because I"ve been fighting with this for 2 weeks. As we all know, facebook has a new auth system which means I have to implement it on my website and I just can"t understand how it works and how to implement it on my website. Of course I know there are examples over the Internet and on Developers page - I had read them all and still don"t know how to acheive linking accounts on my website with FB accounts. Maybe I will present some situations I need to cover: The website has local accounts. There is an additional DB table which can link my user ids with FB user ids. Situation 1: a new person comes to my website. He/She does not have my website"s account but does have FB account. He/She clicks on "Login with facebook", gets redirected to FB, authorizes the app and gets redirected back to my website which creates a new user account and connects my website"s uid with authed FB uid. Situation 2: a person has an account on my website, already connected to some FB account. He/She clicks on "Login with facebook", my website finds FB uid in "link" table and logs in the user which is connected to that FB account. Situation 3: a person has an account on my website which is not connected to any FB account. He/She goes to a special panel on my website with a link "Connect this account with Facebook". He/She clicks on it, authorizes the app, gets redirected back to my website which creates a record in "link" table connecting website"s uid with facebook uid. After making the connection that special panel shows an info "Your are connected to facebook account. ". Situation 4: a person is logged in to my website to an account which is connected to Facebook account. He/She does some actions on my website which result in posting messages on his/her FB wall. So TL;DR, a normal functionality of making a bound between FB accounts and accounts on my website. With previous API everything was fine and working, there was also offline_access I could use for posting on wall, there was no tokens for that etc., you know. Right now.. I don"t know where to start, where and how I should store these tokens, how to get them and on what occasions, how to link exiting accounts, how to "update" existing "bounds" in my "link" table. Just simple hints in pseudocode or a list of 1..2..3.. steps how this flow should look like would be really helpful guys because I can"t find any helping information on the Internet. Every "example" or "tutorial" for this new API tells how to just authenticate FB account on your website but not how to really connect these accounts to something or store this connection for example in the database. I use latest PHP Facebook SDK.

Related Links

WordPress Page Template Remove Sidebar
Php mvc -link redirection issue
Laravel - Seeding Relationships
How to get session array data CodeIgniter
increase size of image and superimpose on transparent image using gd library php

Абсолютно использовать 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(); }