[Из песочницы] Регистрация и авторизация пользователя на сайте — одним кликом — через кастомную кнопку Facebook. 2017
Ну и конечно стал вопрос Удобной авторизации пользователей с наименьшим «трением». Подумав немного, я выбрал авторизацию через Facebook, но думаю, на этом я не остановлюсь и вы прочтете ещё несколько статей, с авторизацией через Google Acc, VK и Tweet.
Итак к делу! В интернете я нашел несколько тем, которые описывают вопрос авторизации, некоторая информация мне помогла, но я не нашел ни одной, которая бы решила поставленную мной задачу, поэтому, завершив задачу я и решил написать эту статью.
СДЕЛАНО: Регистрация пользователя в БД и его авторизация на сайте одним нажатием Кастомной кнопки (любая картинка на ваш вкус)
1. РЕГИСТРАЦИЯ ПРИЛОЖЕНИЯ В ФБ:
а. https://developers.facebook.com/apps/
б. Регистрируем приложение, прописываем адрес вашего сайта, страницы принятия данных для ответа, и многое другое. Интерфейс очень дружелюбный, фэйсбук нас любит. Поэтому рассписывать всё и вся я не буду. Оттуда нам нужно будет ID приложения и адрес сайта.
2. ФРОНТ ЭНД:
Привожу полный рабочий пример со своего сайта. По клику на ссылку вызывается функция: «fb_login ()», функция сначала проверяет «а залогинен ли пользователь в фэйсбуке?» если ДА, берет его ID и отправляет аяксом в БэкЭнд, если НЕТ, то вызывает форму для входа в Фэйсбук аккаунт.
fb_login () — инициирует общение с ФБ
handle_fb_data () — занимается получением и пересылкой полученных из ФБ данных пользователя в БэкЭнд
Ну собственно по фронтэнду всё, теперь рассмотрим БэкЭнд.
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 ();}
Спасибо за внимание!
Комментарии (1)
3 апреля 2017 в 13:24
0↑
↓
Зачем в 2017 году делать по фану проект на CI?