Как стать автором
Обновить

Комментарии 63

Вопрос: при авторизации ВКонтакте E-mail возвращает?
Да, возвращает.
Смотря как пользователь зарегистрирован в ВК. Не все сейчас регистрируются через эмейл. В этом случае эмейла нет
Ну этого нюанса я не знаю, честно говоря. Если сервер мыло не передаст, то скрипт может бросить исключение. Нужно тогда ставить проверку на существование мыла.
Для проверки существования мыла, нужно вставить проверку:

// Check exist email.
        if (isset($user['email']) && !empty($user['email'])) {
            // Здесь основной код
        }
        \Session::flash('flash_message_error', trans('interface.NotEmail'));

        return Redirect::back();
Ааа, господа и дамы. Стормозил, простите. Если какого-либо поля в социальной сети не будет, включая мыло, то во всплывшем окошке ulogin попросит пользователя заполнить недостающие поля. Поэтому, если Вконтакте не содержит мыло, то пользователю предложат его ввести отдельно во время авторизации на вашем сайте. Так что проблемы как бы и нет.
  // Find user in DB.
        $userData = User::where('email', $user['email'])->first();

        // Check exist user.
        if (isset($userData->id)) {
           ...
        }
        // Make registration new user.
        else {
           ...
            ]);

А почему бы не использовать findOrNew? И к тому же, можно проверку сделать намного проще в Вашем случае:


if($userData)

Ведь если такой пользователь не будет найдет, в $userData будет null.

firstOrCreate, если точнее.

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

Сообщений каких?


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

Этих?

Да.

Так ведь firstOrCreate вернет Вам инстанс юзера, его статус и можно проверять для вывода сообщения (или его отсутствия). Еще есть замечательный метод exists, который поможет Вам в выводе сообщения об успешной регистрации.

Согласен, но ведь все равно нужно будет писать условие. А значит как именно сделать проверку и регистрацию становится не особо принципиальным. Хотя вы говорите про Ларавел вей, что очень правильно.
Да, кстати. Почему не стоит тут применять firstOrCreate. Дело в том, что аргументы нужно прописывать в методе, полученные от социальной сети. И все они должны совпадать с существующим профилем. Но может получится так, что пользователь изменил некоторые данные в профиле. Тогда будет произведена попытка регистрации и ошибка по не уникальности емаил.
если сделать так
$newUser = User::firstOrCreate([
                'nik' => $user['nickname'],
                'name' => $user['first_name'] . ' ' . $user['last_name'],
                'avatar' => $user['photo'],
                'country' => $user['country'],
                'email' => $user['email'],
                'password' => Hash::make(str_random(8)),
                'role' => 'user',
                'status' => TRUE,
                'ip' => $request->ip()
            ]);

то последует попытка создать нового пользователя, т.к. Hash::make('any_string') будет все время различаться
Кстати, тоже хорошее замечание.
Потому что то решение, которое написал я, быстрее написать, чем установить и настроить пакет socialite. Плюс вся «магия» и головная боль по работе с социалками лежит на сервере ulogin. Я же просто работаю с json массивом. Плюс ко всему прочему, я использую всякие диалоговые окошки для мгновенной авторизации, формируя их аяксом на лету, и прочие плюшки. Поэтому мне гораздо проще работать со своим решением (простым, как угол дома, всего с одним роутом и одним контроллером), чем допиливать напильником чужое. Хотя каждый выбирает то, что удобно/выгодно/и т.д. ему конкретно. Я же люблю иногда создавать свои решения под мои конкретные задачи. И если случается где-то трабла, то я не жду, пока автор пакета его допилит, пофиксит, выпустит новый релиз. Я свое решение смогу доработать/пофиксить в течении нескольких минут. Но, опять таки, каждый выбирает свой путь. И очень часто многие разработчики хотят поставить пакет и забыть. Но я часто использую нетрадиционные и нестандартные подходы, поэтому большинство готовых решений мне просто не подходит.
Плюс, этот пакет работает только с рядом социалок: Laravel Socialite provides an expressive, fluent interface to OAuth authentication with Facebook, Twitter, Google, LinkedIn, GitHub and Bitbucket. А ulogin со всеми существующими.
тут смотря с какой стороны посмотреть и для чего это будет использоваться. мне спокойнее, если я как можно меньше завишу от внешних сервисов, да и никто не мешает сделать с socialite так:
public function redirectToProvider($driver)
    {
        if(empty(config('services.'.$driver))){//нет драйвера - нужно что-то сделать
            abort(404);
        }
        return Socialite::driver($driver)->redirect();
    }

этот пакет работает только с рядом социалок:

нужно больше социалок? не вопрос — https://socialiteproviders.github.io/
Я с вами согласен в том, что чем меньше от внешних сервисов зависишь, тем лучше. Но от этого все равно не уйти, к сожалению. Сегодняшние web решения много от чего внешнего зависят. Да хоть те же скрипты для бутстрапа, фронтенд фреймворка и т.д. А написать свое грамотное и независимое решение по авторизации через социалки из коробки — это очень приличный кусок работы. А сделать его еще и гибким, с легкой интеграцией в фронтенд фроймворки, с красивой передачей данных через свое API и т.д., то в какой то момент приходит понимание, что уже ничего не хочется.
библиотека и внешний сервис — немного разные зависимости. Если библиотека окажется с багом — я могу отправить pull-request туда, а если не примут — использовать свой форк на крайний случай. А если тот же самый ulogin ляжет — что тогда делать?
Тогда в ритме танго отключать виджет (закомментировать в шаблоне одну строчку) и всем юзерам придется жать кнопку восстановления своего пароля. Если вспомнят свой email. Торба будет! Тут без вариантов. Но вот пару дней назад глюканул фэйсбук по всему миру, и народ не мог зайти в свои аккаунты. Так что тут тоже вопрос интересный. Если пользователь новый, то он может зарегистрироваться в родной форме регистрации. А для зареганных можно хранить очень долгую куку.
Но огромный минус внешнего сервера авторизации в том, что если ляжет он, то и наш сайт тоже приболеет. Это очевидно. Но как тут быть, что лучше/проще/дешевле — это уже философский вопрос.
НЛО прилетело и опубликовало эту надпись здесь
Здесь с вами спорить тяжело. Это сложный выбор. Но взять и ручками написать авторизацию с кучей социалок, следить за изменением их API и так далее, это тоже задача непростая. Везде завести сигнатуры, везде зарегаться, как разработчик и еще куча всего. Если речь идет о трех-шести социалках, то может через OAuth и надежнее будет. Но когда социалок много — это headache еще та. Выбор сложный.

Судя по коду, автор вообще не имеет опыта с Laravel. Да и в целом стиль, мягко говоря, хромает.

Я был бы вам очень сильно благодарен, да и все читатели тоже, если бы вы взяли эту горстку кода, и переписали так, как вы считаете будет идеально и с Ларавел вей. Ведь написать гораздо быстрее, чем даже сказать. Покажите класс?
    public function login(Request $request, uLoginService $uLogin)
    {
        $data = $uLogin->getUserInfo($request->get('token'));

        $user = User::where('email', $data->email])->first();

        if (null === $user) {
            $user = User::createFromULogin($data);

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

        Auth::loginUsingId($user->id, TRUE);

        return Redirect::back();
    }

Ну хотя-бы как-то так.

Вопрос. Зачем ради сокращения двух строчек кода, писать свой сервис провайдер и фасад? В чем преимущество, или смысл? Всю «магию» перебросили в итоге в пакет, но смысла это не поменяло! Читал как-то статью от автора Джанго на питоне. Так человек пытался объяснить, что делать класс с двумя строчками кода — это путь в никуда. И мол, сегодняшние программисты дошли до полного абсурда. Что в итоге не упрощает приложение, а очень сильно его усложняет. Выглядит изящнее, бесспорно. Но ради этого делать еще один пакет с пару строк кода, лично я считаю уже чересчур. Спасибо вам за конструктив, это приятно видеть.

А причем тут еще один пакет? uLoginService — это отдельный класс, а не пакет.

А где вы будете прописывать этот отдельный класс? А главное, для чего? Чтобы перенести пару строчек кода в него? Опять таки, ради чего? Все должно иметь какой-то смысл. В чем здесь смысл вынести одну-две строки кода в отдельный класс?

Для того чтобы можно было все это протестировать, для того чтобы заменить file_get_contents на curl с таймаутом, для того чтобы проверить что мы получили валидный json и так далее, и тому подобное.

Тоже верно. Но это двойная работа. Сам сервер нам либо валидный json возвращает, либо error. Хотя, вы правы. Лучше не доверять получаемым данным и контролировать их самому. Но суть статьи была не в том, чтобы показать примочки кодинга, а в еще одном методе, как можно авторизироваться через социалки. Но ваше замечание дельное, благодарю.

Потому что у вас не две строчки кода. Потому что так будет проще тестировать. Потому что так читабельнее. Потому что такой код легче в поддержке.

Да, кстати, запрост передается постом!

И что? $request->get('token') позволяет получить данные как из $_GET, так и из $_POST. Название метода в данном случае означает «получить», а не «получить из $_GET».

Ок, согласен. Просто в документации не нашел четкого описания, что POST он также получает. Только про проверку полученного из запроса метода нашел. Спасибо за пояснение.

что бы не сбиваться можно использовать метод $request->input($key)

НЛО прилетело и опубликовало эту надпись здесь
За такой код в нормальных компаниях принято увольнять.


А где вы работаете?

Вы не используете пакет Laravel Socialite и переизобретаете то, что он и так уже делает.


Вы точно программист? Ведь вам так лень что-то свое писать. Про чтобы просто вникнуть в суть задачи, так вообще молчу.

Вы не умеете пользоваться классом Request и неправильно обрабатываете запрос.


Конкретно укажите на код! А то пока выглядит, как гав-гав-гав.

Вы игнорируете соглашение PSR-2, которому следует Laravel.


Вы серьезно? https://laravel.com/docs/5.3/structure#the-app-directory А вы вообще в курсе, что это значит?

В вашем коде есть ошибки с неопределенными индексами.


Я глянул ваши другие комментарии и сколько вам наплевали за ваш «профессионализм» в карму, так походу это у вас ошибка в ДНК.

Представьте, какую свинью вы подкладываете человеку, которому придётся работать с этим после вас.


Лучше не нужно про свиней, а то ваше похрюкивание вас выдает.

П.С. Бог ты мой! Во что превратилась Хабра! Неужели все адекватные люди уже убежали отсюда?!

PSR-2 не про папочки, а про стиль кодирования.

Я использую последний PhpStorm, с подключенным модулем Ларавел. И он автоматически использует код стайл с отступами в 4 пробела, переносами скобки и т.д… Лично я не вижу в этом ничего смертельного. Хотя с удовольствием прочел бы рекомендацию Тейлора по Ларавел код стайл. Изменить его — это дело нескольких минут.
Я глянул ваш профиль, вы раньше писали статьи. Если не секрет, почему сейчас не пишите?

Своих идей для статей пока нет, а переводами заниматься не очень хочется.

У меня есть миллион идей (особенно по аналитике). Если интересно, можем скооперироваться.
НЛО прилетело и опубликовало эту надпись здесь
Объективную критику выражают такие пользователи, как: franzose, Big_Shark, nukedsun и MetaDone. И я им благодарен и нормально с ними общался. А вы же просто дерьмом кидаетесь. Проявить после вашего «супер адекватного и аргументированного» комментария хоть каплю уважения — это себя не уважать. Если вы не видите разницы между аргументированной критикой с указанием конкретных узких мест, между тупым высером, который вы тут родили, то лучше тогда вообще помолчать, сохраните свою карму!

Вы бы хотя бы сделали по Laravel-way, и как минимум обрабатывали запрос через Request, который вы заинжектили. А так, у Вас, по-сути, код написанный на коленке. Зачем писать статью ради того, чтобы написать статью? Какая от этого польза?

Написать по код стайлу, задача пары минут. Сделать алгоритм, задача уже гораздо потруднее. Я предоставил вариант для решения непростой задачи простым путем. Суть идеи ясна. Если никому ничего не интересно, не нужно, всем нужен готовый пакет, то тогда и незачем вообще что-либо писать, и что-либо обсуждать. Отличных кодеров очень много. А вот тех, кто может что-то «родить» очень и очень мало. По сути, практически все эксперты и гики. Просишь показать свои порталы, социальные сети, интернет-магазины, которые создали с нуля эти профи, и все сразу сливаются. А так все супер эксперты, которые все знают, умеют, и другим рассказывают, что они ламеры. Читаю кучу статей по Ларавел, процентов 98 тупо перевод из буржуй нета. Что, уже сами ничего не можем написать и родить? А как только что-то написал (пусть и на коленке), то все, на фиг такое нужно, мол это никому не интересно. Это тупик для русскоязычного сообщества! Вы это понимаете? Вон я на гике написал статью по поводу создания ТЗ: https://geektimes.ru/post/275068/ И где все профи были? Смотрели на статью, как баран на новые ворота. Слова знакомые искали, но так и не нашли. Нет никакого у нас сообщества профессионалов. Одни анонимные «гики» с самооценкой до небес и скромным портфолио, которое нигде найти невозможно. Это так, немного лирики.

Тогда выходит, вы родили "недоношенную" идею. Суть создания "нового" разве состоит в том, чтобы сделать что-то, абы работало? Можно ведь сделать нормально, потратив чуть больше времени.
И по поводу того, что Вас бы уволили за такой код — чистая правда.

К большому сожалению большинства, и большому моему счастью, я независимый специалист, и могу позволить себе написать код на коленке. Много тут на хабре «умников» готовых уйти на свои хлеба, самому искать себе заказчика, и работать по 12 часов в день на стартапах, которые часто не стреляют? А то многие пригрели пятую точку на конторах и умничают про свой хай левел. Я этот контроллер написал через пять минут после прочтения документации. И ничего, не умер. Получил дельные замечания, и тут же поправил. Кстати, если откроете сайт Ларавел, то Тейлор всем рекомендует не парить мозг по поводу код стайла, а сосредоточится на функционале. Код стайл можно и позже поправить. Но все так цепляются не за суть, не за алгоритмы, не за какие-то другие подходы, а именно за код стайл, или применение не родных функций (мол гики классно знают фреймворк). Мне это напоминает, когда в дискуссии начинают цепляться уже к найденным в словах ошибках и пунктуации. Это о многом говорит. Во всем мире приложения и всякие программы написаны по кодстайлу, с соблюдением всех патернов и правильного использования функций ядра. Но почему-то большинство этих решений говно говном! И каждый день выходят новые программы, новые фреймворки, кучи аналогов и т.д. Может дело не в код стайле? Может инструмент нужно применять для достижения конкретных целей, а не делать из него фетиш? Очень многие отлично знают свой инструмент, а вот что они с его помощью делают — вот это часто полная шляпа!
Прост мошна сраз уписть, использя рускиы язык, а мошн писть каг бох на дху полошт.
Взмжн ваш програм и норм, но за хрновый код-стуле мошн луз ёр айдиа. Без обид ифчо.

P.S. ошибки потом поправлю, сейчас времени нет.
Можно на красивом чистом русском языке говорить полный бред, переливая из пустого в порожнее и корчя из себя большого эксперта! Что можно наблюдать на всех каналах страны с «великими» политологами и экономистами. Можно бить себя пяткой в грудь и кричать, то что вы великий гуру, но не в состоянии показать и строчки своего кода. Но то все пустое. Вспомним такое приложение, как Sypex Dumper. Код этого приложения — это ад адский. Но тем не менее — это одно из самых популярных и востребованных решений во всем мире! Да и вообще, я уже очень давно обратил внимание на то, что «великие» критики не написали ни одной статьи, не создали не одного опен сорс решения, которое можно скачать с гитхаба или битбакета. А так они огого какие гуру, под анонимными никами и без своего фото в профиле! Наверняка происходит в пятой точке жим-жим, что бы когда будете устраиваться на очередное место работы, не дай бог не нашли ваши высоко интеллектуальные размышления в сети. Умно, но вас это явно не красит!

О как у вас подгорело то. Нет, суть в том, что если что-то и делать, то делать с умом и последующим продвижением вашего решения в массы (аля хабр, как вы и поступили). И не удивляйтесь, что на вас вылили бочку с Г, потому что ваш код и наполнил эту самую бочку.


Я этот контроллер написал через пять минут после прочтения документации. И ничего, не умер.

Тогда почему вы удивляетесь критике, причем обоснованной?


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

Ссылочку можно, где это написано?


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

Код должен быть читабельным. Абы как написанную белеберду я лично не стал бы использовать в своем приложении и, тем более, тратить время на приведение этого всего к нормальному виду.


, или применение не родных функций

А зачем тогда используют фреймворки, скажите мне? Чтобы инжектить зависимость для обработки запроса, но использовать глобальный $_POST? WTF?!


Не вижу смысла с вами дальше продолжать диалог (хотя, скорее, это два монолога, потому что вы отказываетесь слушать и прислушиваться) с человеком, у которого нет серьезного опыта разработки на Laravel. Почему я решил, что у вас его нет? Да потому, что для вас, видимо, создание фасада или сервис провайдера это невероятно сложные задачи.


Have a good life.

Господи, ты бы английский выучил бы для начала или вник в то, ЧТО там написано.


  1. Это для КОНТРИБЬЮТОРОВ раздел, т.е. тех, кто ПИШЕТ ФРЕЙМВОРК, а не ИСПОЛЬЗУЕТ его.
  2. Имеется в виду то, что тулза StyleCI всё равно все приведет в PSR-2, поэтому париться по поводу код-стайла не стоит.

Are you blind or something?

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

Хоспаде..

Меня всегда удивляет почему большая часть разработчиков любит городить излишнюю вложенность. Ваш код не исключение. Пример:

if ($someThing) {
    return doSomeThing();
} else {
    return doAnotherAction();
}

Так ведь на много лучше, не так ли:

if ($someThing) {
    return doSomeThing();
}

return doAnotherAction();


Читать код из-за этой постоянной вложенности крайне не удобно.
Согласен. Старая привычка идущая испокон веков. От нее избавится не всегда просто. Мне нравится лаконичность Рельсов, там вообще нет обязательных ретурнов, чище код, разные типы массивов и т.д.
За статью спасибо! Вы потратили время, поделились своим опытом и это надо ценить и труд, какой бы он не был, уважать. Кому-то эта статья будет очень даже полезной, учитывая количество добавивших её в избранное.

По коду. Моё личное мнение.

Зачем использовать стороннюю библиотеку, когда можно написать своё.
А что здесь Ваше? Вы используете сторонний сервис, который Вам отдаёт этот код. Всё, что Вы написали есть на сайте самого сервиса. Более того, для Laravel есть готовый плагин который надо подключить и тогда писать ничего не надо. На Вашу фразу про то, что «какие нынче разработчики, что ничего сами написать не могут» — не ко мне. Вы копипастом и созданием контроллера потратили 2 часа, я подключением в composer пакета и выводом формы — 1 час (время условное). Думаете, мой уровень от этого пострадал?

А если нативное API изменится, что следить за всеми изменениями?
А если изменится response сервиса?
$network = $user['network'];

И завтра уже не network, а userData и что делать будете? А если ID самого div блока поменяется и т.д… Для этого есть тесты — пишите их и Вам будет всё равно что использовать.

А что в коде не так?
Всё, что уже писали ребята до меня +
1. — file_get_contents -> cUrl
2. —
if ($userData->status) {

                // Make login user.
                Auth::loginUsingId($userData->id, TRUE);
            }
            // Wrong status.
            else {
                \Session::flash('flash_message_error', trans('interface.AccountNotActive'));
            }
->
    $userData->status 
        ? Auth::loginUsingId($userData->id, TRUE)
         : Session::flash('flash_message_error', trans('interface.AccountNotActive'));

Вставил код

<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>

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

в свой login.blade.php

У меня не отображаются кнопки соц. сетей. Что я не так делаю?

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Изменить настройки темы

Истории