Расширение EAuth, основы авторизации через социальные сети

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
Sereja3578
Сообщения: 204
Зарегистрирован: 2016.09.21, 11:15
Контактная информация:

Расширение EAuth, основы авторизации через социальные сети

Сообщение Sereja3578 »

Всем доброго времени суток)
Понадобилось к сайту прикрутить возможность регистрации и авторизации через социальные сети (вк, одноклассники, mail, yandex). До этого кроме, как в cms с помощью плагинов этого не делал, поэтому вообще в теме не разбираюсь)

Почитал, нашел расширение eauth, на гите есть инструкция и демка, но там в принципе описано только, как подключать это дело, а как работать с ним не ясно, особенно новичку) На сколько я понял суть всего этого дела, почитав, что такое вообще oauth протокол в документации яндекса https://tech.yandex.ru/oauth/ , то для сайта нужно регистрировать учетную запись, там мы получаем id и пароль для авторизации, потом должны формировать какую-то ссылку с этими данными, отсылать запрос сервису, в ответ получаем другую ссылку из которой вытаскиваем токен и куда-то там его записываем. Вот с этим и возникают непонятки.

Как мы получаем этот токен, id юзера, название сервиса? Куда записываем? Какой потом алгоритм работы со всем этим?

Дальше, если все же разобрались с получением данных, записали их допустим в базу данных или сессию (наверно токен все же надо в БД хранить, так как он на год вроде дается), то как нам на сайте идентифицировать пользователя? У меня идет стандартная структура таблицы пользователя (из коробочной миграции). Нужно как-то связываеть его id с id полученным после авторизации в соц сети? Типа чтобы получилась запись вроде один ко многим? Один пользователь создается в бд с моим id, и плюс например, в таблицу token, добавлять этот id, потом id социальной сети, название сервиса и сам token?

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

Что например, будет, если пользователь войдет через одну социальную сеть, а потом через другую? Это вроде конечно решается той структурой таблиц, как я описал выше, но все же.

Помогите пожалуйста разобраться, как вообще это работает.
Аватара пользователя
Sereja3578
Сообщения: 204
Зарегистрирован: 2016.09.21, 11:15
Контактная информация:

Re: Расширение EAuth, основы авторизации через социальные сети

Сообщение Sereja3578 »

Да, и плюс вопрос вдогонку. Пользователю ведь выдается токен на определенное время (у яндекса 1 год при запросе только имени, почты, логина). Мы этот токен только один раз должны сохранять? Как тогда узнать когда нужно его будет в следующий раз запросить, чтобы перезаписать на новый? Или все же каждый раз при логине нужно перезаписывать в базу данных этот токен?
Аватара пользователя
Sereja3578
Сообщения: 204
Зарегистрирован: 2016.09.21, 11:15
Контактная информация:

Re: Расширение EAuth, основы авторизации через социальные сети

Сообщение Sereja3578 »

ElisDN писал(а): 2017.03.18, 10:59 Есть https://github.com/yiisoft/yii2-authclient с инструкцией https://github.com/yiisoft/yii2-authcli ... s/guide-ru
Спасибо Дмитрий.

Вчера все же разобрался ночью с этим делом. Там оказалось, что все данные авторизации хранятся в сессии. Для базового примера это довольно странно, потому что пользователь, который хранится просто в сессии, и не как не связан с таблицей user это не пользователь, а что-то абстрактное, на него даже политики rbac не действуют. Для решения проблемы можно создать таблицу authenticate, там хранить данные пришедшие после авторизации, токен (раз он на год дается) записать в таблицу user. При регистрации создавать как обычно пользователя в таблице user, и если авторизация проходит через сервис, то в таблицу authenticate заносить еще связку id юзера в нашей системе и id юзера в другой системе и все остальные данные. Таким образом будет связь учетных записей, где один пользователь нашей системы имеет еще много других учетных записей, и их id не будут точно пересекаться (для пущей безопасности можно и составной ключ сделать). Далее добавляем метод поиска пользователя по id внешних сервисов и готово.

Но дальше возникло несколько вопросов, на которые пока не смог найти ответа:

1. На локалхосте можно ли тестировать oauth? Пишет не совпадение redirect_url и callback_url, а я указываю http://my-site.local и там и там.
2. Что делать с пользователями, которые уже имеют учетные данные в системе? Получается при регистрации мы можем создать пользователя, и сразу связать его с какой-то учетной записью, а вот как быть при логине, если пользователь уже зарегистрирован? Вот он видит, что теперь можно войти через социальную сеть, входит, например через яндекс, как системе связать его с уже существующим пользователем? Это вообще возможно? Нужно просить его привязать сервис к учетной записи путем авторизации в ней? Это получается какая-то двойная авторизация, что не удобно.

Пока почитаю информацию по вашей ссылке, может там все доступно и проще.
rsgrey
Сообщения: 10
Зарегистрирован: 2017.01.27, 14:50

Re: Расширение EAuth, основы авторизации через социальные сети

Сообщение rsgrey »

1. На локалхосте можно ли тестировать oauth? Пишет не совпадение redirect_url и callback_url, а я указываю http://my-site.local и там и там.
Нельзя, удаленный сервер не знает, что такое my-site.local
2. Что делать с пользователями, которые уже имеют учетные данные в системе? Получается при регистрации мы можем создать пользователя, и сразу связать его с какой-то учетной записью, а вот как быть при логине, если пользователь уже зарегистрирован? Вот он видит, что теперь можно войти через социальную сеть, входит, например через яндекс, как системе связать его с уже существующим пользователем? Это вообще возможно? Нужно просить его привязать сервис к учетной записи путем авторизации в ней? Это получается какая-то двойная авторизация, что не удобно.
Если пользователь уже вошел и в личном кабинете привязывает соц.сеть, думаю итак понятно как связать.
Если есть в системе пользователь с данным email полученным от соц.сети, то заставьте его залогиниться по паролю и привяжите к нему.
Либо если вы доверяете соц.сети, то привяжите сразу
Аватара пользователя
Sereja3578
Сообщения: 204
Зарегистрирован: 2016.09.21, 11:15
Контактная информация:

Re: Расширение EAuth, основы авторизации через социальные сети

Сообщение Sereja3578 »

rsgrey писал(а): 2017.03.18, 13:24 Если пользователь уже вошел и в личном кабинете привязывает соц.сеть, думаю итак понятно как связать.
Если есть в системе пользователь с данным email полученным от соц.сети, то заставьте его залогиниться по паролю и привяжите к нему.
Либо если вы доверяете соц.сети, то привяжите сразу
Да, с локалкой немного обидно, но вполне понятно.

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

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

А если пользователь решит сразу залогиниться через социальную сеть, без регистрации? Получается нужно в механизме логина еще и прописать такой же механизм, как в регистрации, с созданием пользователя? Причем надо еще объяснить как-то пользователю (а это всякие 40-60 летние барышни), что вот вы вошли через соц сеть, но вы не совсем вошли, а вам надо еще раз ввести данные от здешней учетной записи, чтобы вы увидели свой профиль, который уже создавали неделю назад. А если у вас еще нет здесь учетной записи, нажмите пропустить и вот после этого нажмите пропустить, создавать нового пользователя с новым профилем. А если человек этого сразу не впилит (женщины такого возраста не слишком уверенные пользователи пк), то человек просто создаст лишнюю учетную запись на сервере с пустым профилем и будет думать, что у него почему-то весь профиль который он заполнял неделю назад вдруг опустел) Можно конечно и на странице профиля сделать еще раз дополнительно возможность привязать соц сеть к учетке и при этом делать прявязку, логинить под тем пользователем, а текущую запись удалять. Но это все выливается в конкретное такое переделывание механизмов авторизации и регистрации)
rsgrey
Сообщения: 10
Зарегистрирован: 2017.01.27, 14:50

Re: Расширение EAuth, основы авторизации через социальные сети

Сообщение rsgrey »

А если пользователь решит сразу залогиниться через социальную сеть, без регистрации? Получается нужно в механизме логина еще и прописать такой же механизм, как в регистрации, с созданием пользователя?
Разницы нет из какой страницы пользователь хочет войти с помощью соц.сети, механизм один и тот же.
А если он вошел через социальную сеть, то изначально он вообще никто, и у него даже профиля нет и чтобы профиль начал работать, ему нужно по мимо авторизации через социальную сеть еще и авторизироваться обычным методом (по крайней мере первый раз, когда он входит через другую социальную сеть) и так каждый раз для каждой соц сети.
Почему нет? Email вытащить можно, имя, пол и прочее, пароль сами генерируйте.
А вот на прямую связывать не получится, так как у него email при регистрации мог быть указан yandex а авторизироваться он захочет через vk.
Если почта на вк таже, то вот и связь, если нет, то получится новая регистрация.
Аватара пользователя
Sereja3578
Сообщения: 204
Зарегистрирован: 2016.09.21, 11:15
Контактная информация:

Re: Расширение EAuth, основы авторизации через социальные сети

Сообщение Sereja3578 »

В общем проще все же реализовать через то расширение, которое посоветовал Дмитрий (ElisDN), там поменьше провайдеров, но зато механизм более подробно изложен в базовом примере. В принципе по структуре я так все и предполагал. Надо только некоторые вещи допилить под себя. Под eauth тоже можно все то же самое сделать, но как говорится, зачем пилить велосипед? Хотя, если вам нужно больше провайдеров, то это вариант.
Аватара пользователя
girmate
Сообщения: 1534
Зарегистрирован: 2015.10.27, 12:52

Re: Расширение EAuth, основы авторизации через социальные сети

Сообщение girmate »

ElisDN писал(а): 2017.03.18, 10:59 Есть https://github.com/yiisoft/yii2-authclient с инструкцией https://github.com/yiisoft/yii2-authcli ... s/guide-ru
Я так понимаю это самое "родное" и желательное расширение с которым можно работать с соц. сетями (судя по авторам)?

А может вот это расширение использовать https://github.com/Nodge/yii2-eauth? В этом расширении все соц. сети уже рассмотрены.
Осторожно! Вы общаетесь с новичком ;)
Alex21
Сообщения: 39
Зарегистрирован: 2016.11.11, 09:27

Re: Расширение EAuth, основы авторизации через социальные сети

Сообщение Alex21 »

ElisDN писал(а): 2017.03.18, 10:59 Есть https://github.com/yiisoft/yii2-authclient с инструкцией https://github.com/yiisoft/yii2-authcli ... s/guide-ru
Добрый день! Скажите, его можно использовать, когда нужно, чтобы через социальные сети регистрировалась определенная роль (rbac), а остальные роли чтобы регистрировались стандартным способом?
Alex21
Сообщения: 39
Зарегистрирован: 2016.11.11, 09:27

Re: Расширение EAuth, основы авторизации через социальные сети

Сообщение Alex21 »

ElisDN писал(а): 2017.08.20, 21:35 Можно. Что в https://github.com/yiisoft/yii2-authcli ... k-start.md запрограммируете, то и будет.
Подскажите еще, пожалуйста, набираю yii migrate/create auth, результат:
Exception 'yii\base\InvalidConfigException' with message 'The configuration for the "user" component must contain a "class" element.'
В common\config\main.php:

Код: Выделить всё

'user' => [
            'identityClass' => 'common\models\User',
            'loginUrl' => ['site/login'],
            ],
Если добавляю строчку 'class' => 'yii\web\User':
Exception 'yii\base\UnknownPropertyException' with message 'Getting unknown property: yii\console\ErrorHandler::errorAction'
Если добавляю:
Fatal error: Uncaught yii\base\UnknownPropertyException: Setting unknown property: yii\console\ErrorHandler::errorAction in G:\OpenServer\domains\hosters\vendor\yiisoft\yii2\base\Component.php:201
Помогите!
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Расширение EAuth, основы авторизации через социальные сети

Сообщение ElisDN »

Уберите 'user' и 'errorHandler' из common.
Alex21
Сообщения: 39
Зарегистрирован: 2016.11.11, 09:27

Re: Расширение EAuth, основы авторизации через социальные сети

Сообщение Alex21 »

ElisDN писал(а): 2017.08.21, 07:02 Уберите 'user' и 'errorHandler' из common.
Компонент 'user' убрал из common, распихал по всем конфигам приложения и в console тоже. Заработало после того, как убрал 'errorHandler' из console и закомментировал:

Код: Выделить всё

'as access' => [
        'class' => 'mdm\admin\components\AccessControl',
        'allowActions' => [
            'site/*',
            'search/*',
            'gii/*',
            '*'
        ]
    ],
Может кому поможет.
А вам спасибо за помощь.
Ответить