Посты / Авторизация в Laravel, через социальные сети (Ulogin). Просто, гибко и эффективно

09.02.2017 17:54
Привет, друзья. Хочу сегодня поделится своим взглядом на то, как можно сделать простую и эффективную авторизацию/регистрацию пользователей через любую социальную сеть, используя сервис Ulogin. Почему через этот плагин? Потому что он может избавить разработчика от кучи головной боли, которая возникнет при синхронизации с каждой социальной сетью в отдельности. Плюс вы сможете получить данные из плагина в едином красивом формате.

Внимание! Хочу сообщить, что полагаться на данные от сервиса Ulogin не безопасно! Так как сервис позволяет вводить свои данные, если они не были получены от социальной сети. Поэтому, эта статья может служить, как небольшой пример реализации. Но внедрять у себя на сайте это не безопасно!

Я исхожу из того, что читатель разбирается во фреймворке Laravel 5.4 Поэтому я не буду разжевывать простые вещи. Итак, с чего начать? Для начала нам нужно на странице регистрации и авторизации подключить JS плагин. Лично я делаю это через создание отдельного шаблона auth/social.blade.php В который помещаю следующий простой код:

{{-- Social buttons--}}

<div class="text-center margin-bottom-20" id="uLogin"
data-ulogin="display=panel;theme=flat;fields=first_name,last_name,email,nickname,photo,country;
providers=facebook,vkontakte,odnoklassniki,mailru;hidden=other;
redirect_uri={{ urlencode('http://' . $_SERVER['HTTP_HOST']) }}/ulogin;mobilebuttons=0;">
</div>

@section('js')
<script src="//ulogin.ru/js/ulogin.js"></script>
@endsection

Немного объяснений к коду. urlencode используем для кодирования строки к нормальному для передачи по http виду. На redirect_uri будет приходить ответ от сервера Ulogin со статусами и данными. В поле fields мы указываем, какие данные нам нужно получить из социальной сети. В конце шаблона я подключаю сам плагин. Обратите внимание, что здесь происходит вставка кода в блок 'js', который должен быть прописан в главном шаблоне:
@yield('js')

Да, один момент. Если вы работаете по SSL, то вместо 'http://' указывайте 'https://'. Тогда не будет предупреждения о небезопасной передаче данных.

Когда шаблон готов, то мы его просто подключаем на странице регистрации и залогинивания в том месте, где нам нужно, просто вставив в шаблоне одну строчку:

{{--Add social buttons--}}
@include(
'auth.social')

Все, теперь на странице регистрации появится симпатичный виджет с выбором социальных сетей. При клике на кнопку социальной сети, откроется новое окно для авторизации в конкретной социальной сети (если вы не авторизованы, конечно).

Теперь нам нужно написать бэкенд часть. А именно создать контроллер и роут. Роут будет получать ответ от сервера Ulogin и передавать его в наш контроллер.

Создаем контроллер с названием UloginController.php и прописываем в нем публичный метод login в который передаем запрос.

Создаем роут:
// Auto login from ulogin. Need for social login and registration.
Route::post('ulogin', 'UloginController@login');

Есть еще один нюанс! В Laravel есть защита от CSRF атак. А значит, передача данных с другого сервера не будет иметь токена безопасности и случится ошибка безопасности. Для того, чтобы это пофиксить, необходимо в посреднике (middleware) VerifyCsrfToken.php прописать исключение для нашего роута (пути):
/**
* The URIs that should be excluded from CSRF verification.
*
* @var array
*/
protected $except = [
'ulogin'
];

Теперь, когда сервер вернет ответ на '/ulogin', токен безопасности будет проигнорирован и ошибки не произойдет.

Теперь напишем сам контроллер:

<?php
/**
* Ulogin.ru auto registration or login.
*/
namespace App\Http\Controllers;

use App\User;
use Auth;
use Hash;
use Illuminate\Http\Request;
use Redirect;

class UloginController extends Controller
{
// Login user through social network.
public function login(Request $request)
{
// Get information about user.
$data = file_get_contents('http://ulogin.ru/token.php?token=' . $request->get('token') .
'&host=' . $_SERVER['HTTP_HOST']);
$user = json_decode($data, true);

// Check exist email.
if (isset($user['email']) && !empty($user['email'])) {
// Find user in DB.
$userData = User::where('email', $user['email'])->first();

// Check exist user.
if ($userData) {
// Check user status.
if ($userData->status) {
// Make login user.
Auth::loginUsingId($userData->id, true);

} else {
// Wrong status.
\Session::flash('flash_message_error', trans('interface.AccountNotActive'));
}

return Redirect::back();
} else {
// Make registration new user.

// Create new user in DB.
$newUser = User::create([
'nik' => $user['nickname'],
'name' => $user['first_name'] . ' ' . $user['last_name'],
'country' => $user['country'],
'email' => $user['email'],
'password' => Hash::make(str_random(8)),
'role' => 'user',
'status' => true,
'ip' => $request->ip()
]);

// Make login user.
Auth::loginUsingId($newUser->id, true);

\Session::flash('flash_message', trans('interface.ActivatedSuccess'));

return Redirect::back();
}
}

\Session::flash('flash_message_error', trans('interface.NotEmail'));

return Redirect::back();
}

Как видно из кода, мы вначале проверяем, передан нам email или нет. Если передан, то есть ли в нашей базе пользователь с таким email адресом. Если есть, то мы его сразу залогиниваем. Если нет, то мы вначале создаем пользователя в базе, а потом залогиниваем. Вероятность того, что кто-то создаст аккаунт в социальной сети с email адресом того, кто на вашем сайте уже зарегистрирован, для того, чтобы войти в чужой аккаунт, практически сведена к нулю, так как социальные сети требуют проверки указанного адреса.

Какие поля в базе данных видно из кода. Для вывода текстового сообщения я использую функцию перевода trans(), что позволяет мне использовать любые языки на сайте.

Вот и все. Просто, эффективно и очень гибко. В следующий раз, если будет время, я напишу о том, как можно автоматически залогинить/зарегистрировать пользователя, когда гость ставит лайк посту или жмет на кнопку создания комментария на вашем сайте. Там все посложнее, но тоже гибко и эффективно.

П.С. Эту статью я публиковал ранее на Хабрахабра и получил много гневных комментариев, что все это неправильно. Нужно использовать пакет Socialite для Laravel. Мол а что будет, если сервис Ulogin перестанет работать и т.д. и т.п. Так вот, когда я писал статью, то еще была версия Laravel 5.3 И когда вышла версия 5.4, то проблемы, как раз, возникли не с сервисом Ulogin, а с пакетом Socialite. Использование сервиса дает вам возможность использовать все возможные социальные сети без возможности регистрации, как разработчик в каждой, получении своего токена безопасности и т.д. В пакете для Ларавел вы будете ограничены только рядом социальных сетей. Для каждой сети вам нужно будет создавать свои настройки со своими параметрами. Другим словом - очень много возни, и с кодом, в том числе. У меня возникает вполне здравый вопрос, а ваш заказчик готов платить за то, что вы с огромной любовью будете вручную ставить и настраивать каждую сетку черех ларовеловский пакет?

Все свои идеи, мнение и возмущение пишите в комментариях под статьей. Всем удачи.
0

Комментарии (57):

UPD. Прочитал, что wargamig отдает только  никнейм игрока. Поэтому, нужна авторизация для laravel через wargaming :))) Помогите, прошу )
P.S. И email если можно, но проверку и авторизацию сделать по nickname, а не через email

Здравствуйте! Помогите написать авторизацию через wargaming,
Нужно от сайта получить:  
 Имя в игре (nickname)
 Страна проживания  (country)
И по возможности получить  идентификатор OpenID, если нет, то достаточно Имя в игре и страну проживания.

Заранее, огромное спасибо! И двойное спасибо если чуть чуть разжуете код :) 
фрилансер, при чем самоучка, на зарплате был всего один раз не долго ито в должности QA. Даже если бы сильно захотел в той местности к которой я сейчас привязан сесть на зарплату -это проблема.
artem писал(а):
Ну и да если вопрос о заказчике у которого есть $100 на аналог Амазон, я предпочитаю порекомендовать этому заказчику конкурента. Ну вот совсем не интересно, сегодня на рынке куча воможностей, он развивается ежедневно и мне как минимум не интересно (хотя в первую очередь не выгодно в перспективе) работать с такими заказчиками и терять время.
Вы фрилансер или на зарплате?
artem писал(а):
Да я считаю себя как разработчика обязанным имея возможность получить данные из соц сети не задавать лишних вопросов и не предлогать пользователю моего продукта, которому он доверяет решения других о которых по сути не знаю ничего.
Я с вами согласен! Я попробовал сервис, оказалась лажа, с потенциальными дырками. Поэтому я и написал здесь (красными буквами), что не рекомендую. Согласен, что лучше через социалайт создать свои методы. Это обсудили в комментариях ниже. Нет никаких объективных причин использовать сторонние сервисы, если есть внутренняя альтернатива. Но не удалять же статью только потому, что использование данного сервиса не супер решение!
Ну и да если вопрос о заказчике у которого есть $100 на аналог Амазон, я предпочитаю порекомендовать этому заказчику конкурента. Ну вот совсем не интересно, сегодня на рынке куча воможностей, он развивается ежедневно и мне как минимум не интересно (хотя в первую очередь не выгодно в перспективе) работать с такими заказчиками и терять время.
На самом деле Socialite как раз такой инструмент, который помогает делать дешево и быстро. Как собственно и фреймворки в целом. Разница лишь в квалификации исполнителя. Я же не предлогал вам реализовывать своего провайдера, что к слову делается минут за 10 с опытом и минут 30 если придется разбираться в api провайдера, а предлогал использовать уже готовые решения, коих масса (провайдеры от сообщества). Говорил лишь о том, что вы добавляете в проект некотролируемый слой и я вижу такую работу, как "на отвали", абы работало. Ну вот не верю я в то, что заказчик, которому объяснят не только вопросы безопастности, но и последствия вендорлока не согласятся выделить деньги на 1-2 часа работы. С учетом того, что наличие токена -есть доступ к api и потенциальная возможность расширения функционала обычно идет в плюс всегда. Более того какова цель? Сделать авторизацию удобной? ну ок, если вас не смущает возможная не достоверность данных и вендорлок - ваше право, я же вас не обвиняю, просто пытаюсь понять и найти для себя хоть 1 плюс, коих не вижу вообще. Но к примеру у меня это означает не просто упрощение авторизации пользователю, но и определенный уровень интеграции всегда. Да я считаю себя как разработчика обязанным имея возможность получить данные из соц сети не задавать лишних вопросов и не предлогать пользователю моего продукта, которому он доверяет решения других о которых по сути не знаю ничего. Имея токен я могу выполнить массу запросов не задавая пользователю вопросы и предложить ему готовую информацию для проверки, в дальнешем закончив процесс авторизации. И не вижу в этом никаких проблем поскольку опять же квалификация разработчика и его опыт решает. Если у него уже был опыт реализации. то он просто использует готовое решение и потратит на это минимум времени.
artem писал(а):
Если честно у меня возник вопрос к вам, кто ваш заказчик, если он готов за это платить? С точки зрения бизнеса продать ему такую авторизацию -невозможно, если конечно он в курсе реализации, а не покупает кота в мешке.
Если идет речь о корпоративном сегменте, то вопрос оплаты за проект не стоит. А вот если это заказчик из разряда, "Я хочу аналог Амазона... и у меня есть пару тысяч", то тут уже другая ситуация. Легко об этом всем рассуждать, к примеру тому, кто сидит в компании на зарплате. А когда вы скачете по проектам, где денег в обрез, то понятие того, как правильно и нужно делать, и того, что вам платят и заказчики готовы ужиматься везде и на всем, то тут уже совсем другие играют правила, к сожалению. Вот поэтому, всякие CMS и популярны во всем мире, так как позволяют за пару дней и за малые деньги сделать проект, который на фрэймворке пришлось бы делать долго и мучительно. И в тех же США огромное количество всевозможных сервисов, которые легко интегрируются в CMS.

А вот если речь идет о энтерпрайз, то там играют другие правила - гибкость и масштабируемость, а не дешево и быстро. Нет, конечно, никто не ограничивает вас в вашем порыве. Вы вольны хоть на Симфони написать свой Амазон, но заплатят вам, как за сайт визитку. Поэтому нужно на проблему смотреть шире, чем только через призму профессионального подхода. Все программисты знают, как нужно правильно, а по факту мало кто делает, как нужно! И причина очень часто заключается не в персональной личности разработчика.
Статью на хабре я не читал, но после вашего уточнения я и тут комментарии решил не читать. Но как бы у меня в самом начале статьи возник тот же вопрос, почему не Socialite. B конце аргументации не понял. Да мой заказчик готов платить за это просто потому, что он получает подконтрольный продукт, а не зависимость в результате сбоя которой фикс стороной указанной в договоре будет под вопросом. Более того Socialite не ограничен колличеством соц сетей, там очень много плагинов, которые по моему опыту работают. Более того он не зависит от js, который отключается и в ответ от сервера я всегда получаю токен (там где это возможно), т.е. это не только авторизация на своем сервисе, но и доступ к api, который я привык использовать. Более того, вы сами добавили оговорку о безопастности.

Если честно у меня возник вопрос к вам, кто ваш заказчик, если он готов за это платить? С точки зрения бизнеса продать ему такую авторизацию -невозможно, если конечно он в курсе реализации, а не покупает кота в мешке.
Kirill wrote:
Вы работаете на западную компанию?
нет
Alexander писал(а):
Ну я мысли читать не умею) Я не знаю про рунет вы говорите или про мир) А почему именно рунет? Программист свободная птица, может работать где угодно)
Вы работаете на западную компанию?
Alexander писал(а):
А вообще да, сейчас бы по другому делал, этот код годичной давности)
Просто люди есть разные. Кто начинает потешаться и издеваться, а кто просто поможет, тихо и спокойно. Поэтому и статьи свои я пишу очень подробно и разжевываю. Я стараюсь донести не код, а логику решения. Почему так, исходя из чего я делал вывод. Как пришел к такому решению, почему не получилось, и что нужно сделать, чтобы получилось. И код тут не играет ровным счетом ни какой роли. Научить писать код можно и мартышку, а вот научиться аналитически мыслить, вот это гораздо важнее! Первое правило, которому должны учить профессора молодого инженера:

Все знать нельзя, для этого есть справочники. Учитесь думать, а не копировать и подражать. Если толпа что-то делает одинаково, это не значит, что это правильно.


Kirill wrote:
Мы говорим не про Мир, а про Рунет. Откройте вакансии и посмотрите, кого больше нужно.
Ну я мысли читать не умею) Я не знаю про рунет вы говорите или про мир)
А почему именно рунет? Программист свободная птица, может работать где угодно)
Kirill wrote:
Использование статических методов - это не есть хорошо.
Иногда ничего плохого в этом нет. Юзера возвращаю потому что да, с ним что-то происходит)
Да данным доверяю, они уже прошли валидацию. А вообще да, сейчас бы по другому делал, этот код годичной давности)
Alexander писал(а):
С чего вы это взяли? Лара гораздо популярней и востребованней чем yii.
Мы говорим не про Мир, а про Рунет. Откройте вакансии и посмотрите, кого больше нужно.
Alexander писал(а):
Откомментируйте раз уже написали.
Использование статических методов - это не есть хорошо. Вы это и сами знаете. Плюс мне не понятно, зачем вы юзера возвращаете? У вас с ним еще что-то происходит потом? Я не вижу проверки полученных данных. Вы им доверяете на все 100%? Потом у вас проверка на банн уже после того, как вы вернули авторизованного пользователя. Это так, быстро на вскидку.
И дело не в красоте кода, а в его читаемости, понятности, гибкости и поддерживаемости.
Kirill wrote:
А по сути, Yii востребованнее лары.
С чего вы это взяли? Лара гораздо популярней и востребованней чем yii. 
Знаете когда вы делаете проект один, то можно писать как угодна это будут чисто ваши проблемы. 
Когда вы работаете в команде или предлагаете свое решение публике, то будь-те добры привести все в порядок. ИМХО
Kirill wrote:
Я не буду комментировать ваш код, хотя там есть что прокомментировать
Откомментируйте раз уже написали.

Насчет стороних сервисов я согласен что использовать их нужно по минимуму, тот же улогин я использовал, когда мне впервые поставили задачу сделать авторизацию через соц сети, было это около 2-3лет назад. Использовал я его на двух сайтах, потом перестал
Alexander писал(а):
Ну как видите, больше в таком ключе я не писал. А почему вы не отрефакторили код? Вам же на хабре писали как можно красивей написать
Красота - дело двадцать пятое. Вон народ кидал код ядра Yii2, по моему класс реквестов. Так там и методы распухшие и вложенность просто сумасшедшая. И ничего, юисты пишут и их все устраивает. А ларавелисты шум подняли из-за некрасивого кода. А по сути, Yii востребованнее лары. Так что эти разговоры о красивом коде, это конечно хорошо, когда у вас есть много времени на написание красивого кода. А когда у вас проект на вчера и тебе не хотят оплачивать даже тестирование, то... Ну вы поняли.
Ну как видите, больше в таком ключе я не писал.
А почему вы не отрефакторили код? Вам же на хабре писали как можно  красивей написать
Alexander писал(а):
Зачем? Я не хвастаюсь, не показываю как нужно писать, не пытаюсь кого-то научить. Вы попросили показать - я показал
Я не буду комментировать ваш код, хотя там есть что прокомментировать. Я надеюсь, что Кирилл Несмеянов не будет против, я приведу кусочек нашей переписки из скайпа (орфографию и пунктуацию оставляю):

[18:53:29] Кирилл Данилевский: Слушай, а твое мнение, использование сторонних сервисов, типа Улогин, это зло?
[18:56:24] SerafimArts: если есть конкурентные альтерантивы, которые не будут сложнее в реализации и не позволят пологаться на сторонние сервисы - да, зло
[18:57:54] Кирилл Данилевский: Я тебя понял, спасибо.
[18:59:22] SerafimArts: Ну например в качестве сервиса почты, если нет своего хайлоад почтовика, вполне допустимо использовать всякие mailtrap или mailgun
[19:00:22] SerafimArts: В качестве сервиса отлова ошибок (APM) можно юзать вполне использовать New Relic или Sentry
[19:00:38] SerafimArts: но Sentry поставляется в халявном варианте, так что лучше всё же локально её поднять
[19:01:34] SerafimArts: Тоже самое касается и OAuth, если вариантов нет или они на порядки сложнее, то да, вполне допустимо, но лучше как можно раньше переехать на внутреннее решение

В принципе, я согласен, что лучше не использовать сторонние сервисы. Хотя раньше я считал иначе, пока не столкнулся с кучей неприятных нюансов! Возможно и можно улогин настроить и работать нормально через него. Но я ему не доверяю! Тем более он у себя создает базу с личными данными пользователей. Что он потом с ними делает, вообще никому не известно. Возможно спамерам продает.
Alexander писал(а):
@У меня таких сайтов под сотню будет.@ Нет, таких сайтов под сотню у вас и близко нет. @Где статьи, где ваши опен сорс проекты? @ Если у меня нет статей, то ничего нельзя писать вам? P.S. А несколько цитат нельзя вставить или я не разобрался?
К сожалению, я не делал вставку цитат по отдельности. Может позже реализую. Писать мне и высказывать свое мнение можно. Но писать в таком ключе:
Уязвимость была в вашем коде, а не в ulogin, зачем вы лжете?
Любой другой бы уже удалил подобный коммент, я же не удаляю. Даю вам возможность высказаться. Но мне бы хотелось, чтобы на моем блоге люди культурно себя вели, и не устраивали срач, подобный в группе в ВК. Все же - это территория моей личной свободы. И не стоит злоупотреблять моим терпением!
Kirill wrote:
Киньте эту ссылку в ларавел группу.
Зачем?
Я не хвастаюсь, не показываю как нужно писать, не пытаюсь кого-то научить. Вы попросили показать - я показал
@У меня таких сайтов под сотню будет.@
Нет, таких сайтов под сотню у вас и близко нет.

@Где статьи, где ваши опен сорс проекты? @
Если у меня нет статей, то ничего нельзя писать вам?


P.S. А несколько цитат нельзя вставить или я не разобрался?
Alexander писал(а):
А вот моя авторизация через соц сети http://joxi.ru/1A5Qeyacn4M0BA
Киньте эту ссылку в ларавел группу.
Вы попросили работу, я вам скинул работу, если вы подразумеваете что-то другое, то научитесь понятней выражать свои мысли. Да я и не пытаюсь что-то доказать, просто разговор ниочем и все)
Alexander писал(а):
К чему это вообще? Вам нельзя писать, если ничего не сделал?) Вот моя работа https://vybormam.com/
Ну сайт и что с того? У меня таких сайтов под сотню будет. Что по этому сайту можно сказать о человеке, о том как он мыслит, и что умеет? Где статьи, где ваши опен сорс проекты? Я критику воспринимаю, но не воспринимаю упоротую позицию мне что-то доказать. Умеешь лучше, можешь качественнее и грамотнее, я только поддержу! От меня троллинга и издевательств вы не услышите! А так, 27 комментариев ни о чем.
А вот моя авторизация через соц сети  http://joxi.ru/1A5Qeyacn4M0BA
Kirill wrote:
Честно говоря, я еще пока вообще ничего не увидел, что вы что-то делаете. Кидайте ссылки на свои работы.
К чему это вообще? Вам нельзя писать, если ничего не сделал?) Вот моя работа https://vybormam.com/
Alexander писал(а):
Я вам не рассказываю что делать. И когда я совершаю ошибки, то не пытаюсь всеми силами отмазаться или найти виноватого (это улогин виноват, я не причем).
Честно говоря, я еще пока вообще ничего не увидел, что вы что-то делаете. Кидайте ссылки на свои работы.
Я вам не рассказываю что делать. И когда я совершаю ошибки, то не пытаюсь всеми силами отмазаться или найти виноватого (это улогин виноват, я не причем). 
Alexander писал(а):
Я считаю, что когда делаешь статью и что-то рекомендуешь новичкам, следует самому глубже изучить тему и читать больше одной страницы доки
Я ведь предложил вам написать свою статью! И я ее опубликую, хоть здесь, хоть на хабре. Или сами ее опубликуйте. А я приду к вам в комментарии и начну вам рассказывать что нужно делать. Советов навалю тонну!
 Я считаю, что когда делаешь статью и что-то рекомендуешь новичкам, следует самому глубже изучить тему и читать больше одной страницы доки
 Кстати, глянь эту ссылку: https://ulogin.ru/help.php#custom Это реальная дока с примером по внедрению. И там нет ни слова о обязательных полях или еще каких-то!
Alexander писал(а):
Думаю нет, но нужно проверять
Сейчас попробую проверить.
Думаю нет, но нужно проверять
Alexander писал(а):
Я ж скинул скрин. Вот дока https://ulogin.ru/help.php#fields Обязательные это значит, что если от соц сети они не прийдут, значит пользователю нужно будет ввести вручную
Да, прочитал, что не обязательные поля перечисляются в поле optional. Представим, что я открываю дебагер, и меняю название поля optional на fields. Такое возможно?
Я ж скинул скрин.  Вот  дока https://ulogin.ru/help.php#fields
Обязательные это значит, что если от соц сети они не прийдут, значит пользователю нужно будет ввести  вручную
Alexander писал(а):
Ты указываешь обязательные и необязательные поля, которые хочешь получить от ulogin. Для обязательных полей в случае когда они не приезжают и появляется форма заполнение вручную. То есть достаточно сделать поле email не обязательным и все. http://joxi.ru/n2YR7nVuokJakA
А можно ли им на 100% доверять? Вся эта чехарда с обязательными и необязательными полями, какая-то странная. Мы ведь сервису указываем, какие поля нам нужно вернуть:
fields=first_name,last_name,email,nickname,photo,country;
Я указал, что меня интересуют только эти данные. Что значит обязательные и необязательные?
Kirill wrote:
Вот те, которые и не отдают, отправлять сообщение пользователю, мол сорри. Мыла вашего нет из социалки. Ответить с цитатой
Ты указываешь обязательные и необязательные поля, которые хочешь получить от ulogin. 
Для обязательных полей в случае когда они не приезжают и появляется форма заполнение вручную. То есть достаточно сделать поле email не обязательным и все. http://joxi.ru/n2YR7nVuokJakA
Alexander писал(а):
Это не проблема Ulogin, не всегда соц сети отдают емейлы или другие данные
Вот те, которые и не отдают, отправлять сообщение пользователю, мол сорри. Мыла вашего нет из социалки.
Kirill wrote:
Да, и еще, в чем была моя идея. Не просто подвязаться к социальной сети. А в том, что если у вас в разных социалках есть свой аккаунт на один и тот же емаил, то вы бы могли заходить на сайт с любой социалки! И это бы работало, если бы Ulogin отдавал 100% данные именно из социалки, а не подсовывал свою форму.
Это не проблема Ulogin, не всегда соц сети отдают емейлы или другие данные
Да, и еще, в чем была моя идея. Не просто подвязаться к социальной сети. А в том, что если у вас в разных социалках есть свой аккаунт на один и тот же емаил, то вы бы могли заходить на сайт с любой социалки! И это бы работало, если бы Ulogin отдавал 100% данные именно из социалки, а не подсовывал свою форму.
Alexander писал(а):
Понятна, но не особо актуальна. Ну я также могу и без улогин прийти на сайт и зарегистрироваться на левое мыло. Опять же достаточно при регистрации через соц сеть также слать письмо на мыло для подтверждения . 0
Если вы придете на сайт и зарегаетесь на чужое мыло, то доступ к сайту вы не получите, пока не подтвердите свой емаил. А если проверять емал после регистрации, через социальную сеть, то теряется тогда смысл вообще регистрации, через социалку. Быстрее будет ввести свое имя и мыло.
Понятна, но не особо актуальна. Ну я  также могу и без улогин прийти на сайт и зарегистрироваться на левое мыло. Опять же достаточно при регистрации через соц сеть также слать письмо на мыло для подтверждения . 
Alexander писал(а):
Я если честно не понял про фиктивные данные, приведите пример?? Вот я зашел через фб на ваш сайт, вы поставили пометку что этот юзер входит через фб. Тут вам приходит такой же емейл, но из другой соц сети, вы смотрите что не фб и не логините
Представьте, что я злоумышленник. Я зарегистрировал в десяти социальных сетях липовые аккаунты. Мыло там не подтверждал. Потом я иду на сайты, где можно зарегистрироваться, через социальную сеть. Например на какие-то фишинговые сайты или порно сайты, да не важно, на любые, где есть Ulogin. И начинаю создавать там новые аккаунты через социальные сети. Социалка не отдает мыло и телефон, а злоумышленник вводит их в ручном режиме, данные чужих людей. В итоге будут созданы реальные аккаунты, которые не будут уже требовать подтверждения ни мыла, ни телефона. А злоумышленник получит доступ к сайту, и будет вести там деятельность от имени чужих людей.

Такая идея понятна?
Я если честно не понял про фиктивные данные, приведите пример??
Вот я зашел через фб на ваш сайт, вы поставили пометку что этот юзер входит через фб. 
Тут вам приходит такой же емейл, но из другой соц сети, вы смотрите что не фб и не логините
Test писал(а):
Я не хочу вас унизить, но вы обнаружили уязвимость, а код статьи не поменяли и уязвимость оставили. И любого, кто последует примеру из вашей статьи можно будет также взломать. Вы б хоть дописали в нее эти нюансы
Вот это замечание уже по делу! Вы правы. Сейчас я допишу. Запись по сети не решает проблемы фиктивных данных. Поэтому это тоже не вариант.

Да, я адекватный, а вы?
Хорошо, возможно вас взломали по другому как-то, но вы сами сказали что с помощью улогина можно получить доступ к вашей админке.  Вот в этом участке кода http://joxi.ru/RmzKOeVH0vEX62 , вы логините пользователя, на основании емейла. Почему когда впервые пользователь авторизировался через соц сеть, не записать через какую соц сеть он вошел, а потом по этому емейлу пускать только через эту соцсеть? Ведь тогда можно на 100% быть увереным что это именно тот пользователь.
Кстати вот тут  if (isset($user['email']) && !empty($user['email'])) {  , не нужно проверять на isset(), посколько empty и так проверяет на существование, достаточно  if ( !empty($user['email'])) { .

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

И да, еще момент. Даже если полностью обложиться проверками, то все равно нельзя быть уверенным в правдивости полученных от сервиса данных! Это касается и емаилов и телефонов, в том числе. Так как злоумышленник сможет зарегистрировать на сайте чужих людей! Что и без всякого взлома тоже не допустимо!
Test писал(а):
эти слова ложь, никакой уязвимости в сервисе вы не обнаружили. Вы сами разрешили вводить пользователям емейл вручную, вы не сделали привязку к соц сети и вас очень легко взломали.
Вы вообще адекватный человек? В этой статье есть весь код и полная реализация. Выделите кусок кода и вставьте в комментарий, где позволено пользователю вручную ввести емаил. Вот кусок кода, где сервис возвращает JSON на вход нашего роута:
redirect_uri={{ urlencode('http://' . $_SERVER['HTTP_HOST']) }}/ulogin
А роут, в свою очередь, вызывает метод логина:
Route::post('ulogin', 'UloginController@login');
Покажите мне, на каком этапе и в каком месте мой код позволяет пользователю ввести свой емаил в обход социальной сети!

Я понимаю, что вам хочется меня унизить, мокнуть носом в грязь. Но так, как это делаете вы - это уровень третьего класса начальной школы!

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

Сервис, если не получил каких-то запрашиваемых данных от социалки, сам выводит пользователю окошко (на своем сервере!!!) и предлагает их заполнить. А значит, что наш сайт может получить данные, в которых нельзя быть уверенными.

П.С. Для особо деревянных, я специально сделал скриншот!
 
ЧТо вам вам мой ник, вы лично меня не знаете, я вас, так в чем проблема?Вам кинуть ссылку на аккаунт соц сети? 
Теперь насчет уязвимости ваши слова "В работе сервиса Ulogin обнаружена критическая уязвимость" - эти слова ложь, никакой уязвимости в сервисе вы не обнаружили. Вы сами разрешили вводить пользователям емейл вручную, вы не сделали привязку к соц сети и вас очень легко взломали. Это только ваша вина, вашей архитектуры/логики/кода 
Test писал(а):
Уязвимость была в вашем коде, а не в ulogin, зачем вы лжете?
В чем ложь? Пример в студию, пожалуйста. Кусок кода и уязвимость в нем. Код в статье. Показывайте!  И что вы так стыдливо спрятались за ником Тест? Проблема в том, что в uLogin есть возможность вручную передать email, если он не был передан социальной сетью. Моя ошибка в том, что я авторизовал людей по мылу. Но проверить это мыло на подделку не реально! Вот и вся беда. По мылу удобно, когда нужно авторизовать через любую социалку, но не безопасно! У вас другое мнение, готов его выслушать!
Уязвимость была в вашем коде, а не в ulogin, зачем вы лжете?
Всем привет. В работе сервиса Ulogin обнаружена критическая уязвимость. Поэтому не рекомендую его использовать. Уязвимость заключается в том, что Ulogin не требует валидных email адресов от социальных сетей, а может вообще вручную позволить ввести свой email. Таким образом злоумышленник может замаскироваться под любого пользователя, зная его email адрес. Но для общего развития, как и что работает, опыт полезный.