[2.x.x] Авторизация через социальные сети

Решил написать небольшой туториал по авторизации и регистрации пользователей в интернет магазине через социальные сети.

 

Что дает это дополнение?

- Автоматический вход клиента без регистрации в интернет магазине

- Автоматическая регистрация покупателя который зашел через социальную сеть

- Сбор базы клиентов на лету

 

Ну что ж приступим.

 

1. В файл шаблона design/ваш шаблон/html/index.tpl перед закрытием тега </head> вставим такой код:

<!-- Ulogin -->
<script src="http://ulogin.ru/js/ulogin.js"></script>
<div id="uLogin" data-ulogin="display=small;fields=first_name,last_name,email,phone;providers=vkontakte,facebook,odnoklassniki,mailru;hidden=other;redirect_uri=http://ваш-сайт.ru/user/login"></div>
<!-- end -->

не забудьте поменять ссылку http://ваш-сайт.ru/user/login на ссылку вашего сайта.

 

2. В фале view/LoginView.php после 64-й строки вставим такой код:

// Вход через ULogin
elseif(isset($_POST['token']))
{
	$s = file_get_contents('http://ulogin.ru/token.php?token='.$_POST['token'].'&host='.$_SERVER['HTTP_HOST']);
	$simpla = json_decode($s, true);

	if (isset($simpla['identity'])){
		$name = $simpla['first_name'].' '.$simpla['last_name'];
		$email = $simpla['email'];
		$phone = $simpla['phone'];
		$password = md5($simpla['identity'].'Noxter');

		// Проверяем есть ли в БД такой e-mail
		$this->db->query('SELECT count(*) as count, id FROM s_users WHERE email=?', $email);
		$user_exists = $this->db->result();

		if($user_exists->count)
		{
			$_SESSION['user_id'] = $user_exists->id;
			header('Location: '.$this->config->root_url);
		}
		else
		{
			$user_id = $this->users->add_user(array(
				'name'=>$name,
				'email'=>$email,
				'password'=>$password,
				'enabled'=>1)
			);
			$_SESSION['user_id'] = $user_id;
			header('Location: '.$this->config->root_url);
		}
	}
}

Готово!

Внедряем и отписывемся.





Всего 24 комментария

  1. Дмитрий Сарвади
    #1

    Спасибо, все работает, если интересно то можно посмотреть тут http://alkomarket.veresen.com.ua/, а как можно сделать что бы не запрашивались дополнительные данные, у меня при регистрации запрашивает телефон и почту.

  2. Дмитрий Сарвади
    #2

    и еще вопрос, можно ли как то сделать, что б скрытые кнопки всплывали вверх, а не вниз?

  3. Дмитрий Сарвади
    #3

    и было бы классно если бы пользователь записывался в базу с признаком что он из соц сети, например писать в группу пользователей, я так понимаю это в 

    $user_id = $this->users->add_user(array(
                    'name'=>$name,
                    'email'=>$email,
                    'password'=>$password,
                    'enabled'=>1)
    надо где то добавить
  4. Noxter
    #4

    Дмитрий Сарвади, если Вы уберете e-mail то покупателя невозможно будет зарегистрировать.

     

    Для того чтобы убрать доп. поля достаточно в диве убрать нужный Вам параметр:

    first_name,last_name,email,phone

    first_name - имя пользователя

    last_name - фамилия пользователя

    email - почтовый ящик пользователя

    phone - номер телефона пользователя

  5. Noxter
    #5

    Дмитрий Сарвади, это встроенная всплывашка от поставщика сервиса ulogin и это уточнять нужно у них.

    Скорее всего можно обойтись простой версткой.

  6. Noxter
    #6

    Дмитрий Сарвади, чтобы поместить пользователя сразу в какую то определенную группу Вам нужно заменить код:

    $user_id = $this->users->add_user(array(
                    'name'=>$name,
                    'email'=>$email,
                    'password'=>$password,
                    'enabled'=>1)

    на следующий:

    $user_id = $this->users->add_user(array(
                    'name'=>$name,
                    'email'=>$email,
                    'password'=>$password,
                    'enabled'=>1,
    		'group_id'=>1)

    где в group_id нужно вписать ID нужной группы.

     

  7. #7

    Всё работает, спасибо! 

    Только у меня значки соц сетей выводятся в верхнем левом углу, и мало кто поймет, для чего они... 

    Есть возможность вывести их рядом или под ссылками "регистрация" "вход" ?
    Что бы было понятно что с ними делать.. :)

  8. Noxter
    #8

    LevTornado, конечно можно.

    Разместите код кнопок:

    <!-- Ulogin -->
    <script src="http://ulogin.ru/js/ulogin.js"></script>
    <div id="uLogin" data-ulogin="display=small;fields=first_name,last_name,email,phone;providers=vkontakte,facebook,odnoklassniki,mailru;hidden=other;redirect_uri=http://ваш-сайт.ru/user/login"></div>
    <!-- end -->

    в нужном на сайте месте.

    Проше говоря все можно сделать через верстку.

    Если нет таких навыков, обратитесь к специалисту.

     

  9. Сергей Ярошенко
    #9

    Все работает, супер, единственное не могу пока переделать, так это что бы выпадающий список по тапу, был над таблицей, а не в ней.

    <form class="form">

    <p>Так-же Вы можете зайти на сайт посредством социальных сетей. Выберите ниже необходимую Вам сеть, и авторизируйтесь на нашем сайте.</p><br />

     <!-- Ulogin -->

    <script src="http://ulogin.ru/js/ulogin.js"></script>

    <div id="uLogin" data-ulogin="display=small;fields=first_name,last_name;providers=vkontakte,odnoklassniki,mailru,facebook,google,googleplus,yandex;hidden=other;redirect_uri=http://www.pro-xiaomi.ru/user/login"></div>

    <!-- end -->

     </form>

  10. Noxter
    #10

    LevTornado, Вы же недавно заявляли что есть дыра в скрипте, а теперь пишите что все работает супер, Вы уж как то определитесь и не морочьте голову.

     

    О какой таблице и о каком списке идет речь?

    Ну и зачем Вы запостили кусок кода который есть в этот статье, так лишь бы считалось или Вы просто не сильны в таких вопросах?

     

  11. lentalux
    #11

    Спасибо, все работает!

  12. Noxter
    #12

    lentalux, всегда пожалуйста D83DDE09

     

  13. billi_bo
    #13

    Добрый день!

    Спасибо за инструкцию!

    Актуален ли код для версии 2.3.6 ?

     

    Скрипт они немного изменили и выглядит он теперь так:

     

    <script src="//ulogin.ru/js/ulogin.js"></script>
    <div id="uLogin" data-ulogin="display=small;theme=classic;fields=first_name,last_name;providers=vkontakte,odnoklassniki,mailru,facebook;hidden=other;redirect_uri=http://ваш-сайт.ru/user/login;mobilebuttons=0;"></div>

     

    А вот с кодом в LoginView.php не хочет работать:(

     

  14. Noxter
    #14

    billi_bo, что мешает взять и попробовать самому?

    Раньше был актуален, думаю и сейчас тоже.

     

  15. billi_bo
    #15

    Noxter,я попробовал. Скрипт поставил новый. Кнопки появились и можно начать авторизацию, но потом ничего не происходит. На сайт не логиниться( Подскажите, могут ли быть какие-то изменения в коде в LoginView.php ?

     

  16. Noxter
    #16

    billi_bo, только те что указаны в статье.

    Распечатайте переменную $_POST и посмотрите что вам возвращает.

     

  17. billi_bo
    #17

    Noxter,насколько вижу по логам, он спотыкается на captcha

     

    GET /captcha/image.php?2834 HTTP/1.0" 200 3092 "https://www.сайт.com.ua/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:52.0) Gecko/20100101 Firefox/52.0

     

  18. billi_bo
    #18

    Noxter, Вот весь лог, что выдает после нажатия на Авторизацию

  19. Noxter
    #19

    billi_bo, проверки капчи нет в инструкции.

    Покажите содержимое вашего файла view/LoginView.php.

    Попробуйте авторизацию через соцсети в нашем блоге, она работает по той же схеме что и в симпле.

     

  20. billi_bo
    #20

    Вот мой LoginView

     

    <?PHP
    
    require_once('View.php');
    
    class LoginView extends View
    {
        function fetch()
        {
            // Выход
            if($this->request->get('action') == 'logout')
            {
                unset($_SESSION['user_id']);
                header('Location: '.$this->config->root_url);
                exit();
            }
            // Вспомнить пароль
            elseif($this->request->get('action') == 'password_remind')
            {
                // Если запостили email
                if($this->request->method('post') && $this->request->post('email'))
                {
                    $email = $this->request->post('email');
                    $this->design->assign('email', $email);
                    
                    // Выбираем пользователя из базы
                    $user = $this->users->get_user($email);
                    if(!empty($user))
                    {
                        // Генерируем секретный код и сохраняем в сессии
                        $code = md5(uniqid($this->config->salt, true));
                        $_SESSION['password_remind_code'] = $code;
                        $_SESSION['password_remind_user_id'] = $user->id;
                        
                        // Отправляем письмо пользователю для восстановления пароля
                        $this->notify->email_password_remind($user->id, $code);
                        $this->design->assign('email_sent', true);
                    }
                    else
                    {
                        $this->design->assign('error', 'user_not_found');
                    }
                }
                // Если к нам перешли по ссылке для восстановления пароля
                elseif($this->request->get('code'))
                {
                    // Проверяем существование сессии
                    if(!isset($_SESSION['password_remind_code']) || !isset($_SESSION['password_remind_user_id']))
                    return false;
                    
                    // Проверяем совпадение кода в сессии и в ссылке
                    if($this->request->get('code') != $_SESSION['password_remind_code'])
                        return false;
                    
                    // Выбераем пользователя из базы
                    $user = $this->users->get_user(intval($_SESSION['password_remind_user_id']));
                    if(empty($user))
                        return false;
                    
                    // Залогиниваемся под пользователем и переходим в кабинет для изменения пароля
                    $_SESSION['user_id'] = $user->id;
                    header('Location: '.$this->config->root_url.'/user');
                }
                return $this->design->fetch('password_remind.tpl');
            }
            // Вход через ULogin
            elseif(isset($_POST['token']))
            {
                $s = file_get_contents('http://ulogin.ru/token.php?token='.$_POST['token'].'&host='.$_SERVER['HTTP_HOST']);
                $simpla = json_decode($s, true);
             
                if (isset($simpla['identity'])){
                    $name = $simpla['first_name'].' '.$simpla['last_name'];
                    $email = $simpla['email'];
                    $phone = $simpla['phone'];
                    $password = md5($simpla['identity'].'Noxter');
             
                    // Проверяем есть ли в БД такой e-mail
                    $this->db->query('SELECT count(*) as count, id FROM s_users WHERE email=?', $email);
                    $user_exists = $this->db->result();
             
                    if($user_id = $this->users->check_password($email, $password))
                    {
                        $user = $this->users->get_user($email);
                        if($user->enabled)
                        {
                            $_SESSION['user_id'] = $user_id;
                            header('Location: '.$this->config->root_url);
                        }
                        else
                        {
                            $this->design->assign('error', 'user_disabled');
                        }
                    }
                    elseif($user_exists->count)
                    {
                        $_SESSION['user_id'] = $user_exists->id;
                        header('Location: '.$this->config->root_url);
                    }
                    else
                    {
                        $user_id = $this->users->add_user(array(
                            'name'=>$name,
                            'email'=>$email,
                            'password'=>$password,
                            'enabled'=>1,
                            'group_id'=>2)
                        );
                        $_SESSION['user_id'] = $user_id;
                        header('Location: '.$this->config->root_url);
                    }
                }
            }        
            // Вход
            elseif($this->request->method('post') && $this->request->post('login'))
            {
                $email            = $this->request->post('email');
                $password        = $this->request->post('password');
                
                $this->design->assign('email', $email);
            
                if($user_id = $this->users->check_password($email, $password))
                {
                    $user = $this->users->get_user($email);
                    if($user->enabled)
                    {
                        $_SESSION['user_id'] = $user_id;
                        $this->users->update_user($user_id, array('last_ip'=>$_SERVER['REMOTE_ADDR']));
                        
                        // Перенаправляем пользователя на прошлую страницу, если она известна
                        if(!empty($_SESSION['last_visited_page']))
                            header('Location: '.$_SESSION['last_visited_page']);                
                        else
                            header('Location: '.$this->config->root_url);                
                    }
                    else
                    {
                        $this->design->assign('error', 'user_disabled');
                    }
                }
                else
                {
                    $this->design->assign('error', 'login_incorrect');
                }                
            }    
            return $this->design->fetch('login.tpl');
        }    
    }
  21. Владислав
    #21

    Такой баг: если я авторизовался например через Google, все нормально учетка создалась, но если явыхожу и пытаюсь авторизоваться через другую соц сеть то уже ничего не выходить, снова пытаюсь залогиться через гугл и все нормально. то есть я могу войти только через сеть с которой зарегистрировался. Как это исправить подскажите?

  22. Noxter
    #22

    Владислав, вам уже ответили на форуме. Никакой это не баг.

     

  23. Валерий
    #23

    Здравствуйте, что-то ничего не работает. Установил все по инструкции.

  24. Сергей
    #24

    Валерий, и у меня не работает) Что -то где -то не клеется)

× Вам нужно зарегистрироваться либо войти на сайт чтобы комментировать.