Бальзам account fb connect php. Это правильный способ сделать FB Connect? Регистрация приложения в фб


Итак, начал я разрабатывать один проект по фану. Основная идея проекта проста: площадка, где все могут ставить на всё что угодно, заключать пари, сделки и БЕЗ каких либо ограничений. Развлекательный проект по сути своей.

Ну и конечно стал вопрос Удобной авторизации пользователей с наименьшим «трением». Подумав немного, я выбрал авторизацию через 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(); }

Facebook is the most popular social media and shares on the Facebook wall are the most used activity by its user. Facebook share option is a common and required feature for every web application. We can easily share the post on Facebook by manually or from the script. In this tutorial, you’ll learn how to post activity on Facebook wall from website using PHP and Facebook API.

Post to Facebook wall is useful when you want to post dynamic content to Facebook from the website. Here we’ll build a simple PHP script to publish Facebook post from website using Facebook PHP SDK. This functionality lets the user submit the post (message, picture, link, text content) on their Facebook timeline from the website using PHP SDK v5.0 and Facebook Graph API .

Before getting started to post to Facebook wall using PHP, take a look at the files and folders structure.

Facebook Apps Creation

To access Facebook API, App ID & App Secret need to be specified on Facebook API call. You need to create a Facebook App for generating App ID & App Secret. If you’re not already created a Facebook app, visit the link below to create and configure a Facebook App from the App Dashboard .

After completing the Facebook App creation and configuration you’ll get the App ID and App secret. Copy this App ID and App Secret of your Facebook App for later use.

Facebook SDK for PHP v5.0

All Facebook PHP SDK files are included in the facebook-php-sdk/ directory, place the facebook-php-sdk/ folder into the root directory. You don’t need to download it separately, Facebook SDK v5 is included in our source code.

Facebook API Configuration (fbConfig.php)

The fbConfig.php file is used to configure Facebook SDK and connect to Facebook Graph API. Specify your Facebook App ID ($appId), App Secret ($appSecret), Callback URL ($redirectURL), and Permissions ($fbPermissions) to connect with Facebook API and working with SDK.

Note that: The access token must have the publish_actions permission to post on Facebook wall.

Note that: You’ll find the App ID and App Secret on your Facebook Apps settings page.

Submit Post to Facebook Wall (index.php)

Include the fbConfig.php file to connect Facebook API and get the access token.

If FB access token ($accessToken) is available, the following will happen.

If FB access token ($accessToken) is not available, the Facebook Login URL will be generated and the user would be redirected to the FB login page.