Comments 105
Спасибо. Давно хотел написать подобное, только(как обычно) руки не доходили.
аааа, где же Вы были месяца три назад) пришлось писать свой экстеншен.
Интересно, задавались ли вы следующим концептуальным вопросом. И как решили его для себя.
Когда пользователь приходит на сайт первый раз — всё круто! Он нажимает кнопочку со знакомым логотипом, идентифицируется и сразу пользуется функционалом, доступным для зарегистрированных пользователей.
Но допустим, проходит время, пользователь забывает про сайт на какое-то время. А потом (через год) снова на него наталкивается. И хочет продолжить использование своего аккаунта. Только не помнит с помощью чего он авторизовывался раньше. Его действия в этом случае? Придётся перебирать по очереди провайдеров авторизации? И каждый раз будет заводиться новый аккаунт в вашей системе?
Иными словами можно ли в вашей системе будет как-то связать между собой аккаунты от разных провайдеров с аккаунтом создаваемом в вашей системе?
Когда пользователь приходит на сайт первый раз — всё круто! Он нажимает кнопочку со знакомым логотипом, идентифицируется и сразу пользуется функционалом, доступным для зарегистрированных пользователей.
Но допустим, проходит время, пользователь забывает про сайт на какое-то время. А потом (через год) снова на него наталкивается. И хочет продолжить использование своего аккаунта. Только не помнит с помощью чего он авторизовывался раньше. Его действия в этом случае? Придётся перебирать по очереди провайдеров авторизации? И каждый раз будет заводиться новый аккаунт в вашей системе?
Иными словами можно ли в вашей системе будет как-то связать между собой аккаунты от разных провайдеров с аккаунтом создаваемом в вашей системе?
Как вы сами себе это представляете? Если пользователь использовал для авторизации один аккаунт, не привязывая других — откуда системе знать о других его аккаунтах?
Можно разве что в настройках аккаунта дать возможность подключать другие аккаунты.
Можно разве что в настройках аккаунта дать возможность подключать другие аккаунты.
ну я честно говоря статью бегло смотрел, но самый очевидный и простой способ — таблица authentications, в которую пишем user_id и provider (ну и всякие oauth_token и тп). Ну и ищем по ней когда кто-то логинится через сторонний сервис.
помоему пытаться привязать аккаунты пользователя через OAuth, это вообще не совсем правильно, так как OAuth не идентифицирует пользователя, он только разрешает доступ к определенной его информации. А OpenID идентфицирует пользвателя. Как где то писали мол OpenID — это паспорт человека, а OAuth — это ключи от машины, в бардачке которой лежит паспорт…
Допустим, я зашел в систему используя OAuth гугла, для меня создался аккаунт. А в следующий раз я зайду используя свой фейсбук аккаунт, как система узнает, что это тот же человек?
никак. только если вы к примеру в настройках своего аккаунта привяжете свой фб-аккаунт (само собой, если только это реализованио)
Ну, теоретически, если второй провайдер предоставляет адрес мыла, можно сравнить.
Нельзя на 100% доверять никаким данным (пожалуй, кроме id пользователя), полученным от провайдера.
Про email уже писал ниже.
Про email уже писал ниже.
у меня была такая же проблема, в итоге вместо этого:
завел отдельную табличку identities(service, id, token, userid). Заодно для вк и фб храню токен для использования их API.
Правда если пользователь сразу не свяжет свой аккаунт с другими сервисами, будет плохо. Написал небольшой алгоритмик для сравнения данных пользователя и автосвязывания, но это все равно не всегда сработает.
Интегрировать расширение с yii-user. В общем случае для регистрации пользователя достаточно добавить в таблицу {{users}} всего два поля: service и identity. Первое поле – название сервиса авторизации (свойство serviceName). Второе – уникальный идентификатор пользователя на этом сервисе (свойство id);
завел отдельную табличку identities(service, id, token, userid). Заодно для вк и фб храню токен для использования их API.
Правда если пользователь сразу не свяжет свой аккаунт с другими сервисами, будет плохо. Написал небольшой алгоритмик для сравнения данных пользователя и автосвязывания, но это все равно не всегда сработает.
Делал аналогично, через таблицу связей.
А еще, например, можно привязывать, если встречаешь email, уже присутствующий в БД.
Т.е. я захожу через Яндекс, расширение берет данные, в том числе мое мыло (допустим test@yandex.ru).
В след. раз я захожу допустим через FB(Твитер, Вконтактик...) и опять же расширение получает инфу.
И если на FB я юзал это же мыло Яндекса, то считаю, что расширение смело может привязаться к уже существующему акку в БД.
А еще, например, можно привязывать, если встречаешь email, уже присутствующий в БД.
Т.е. я захожу через Яндекс, расширение берет данные, в том числе мое мыло (допустим test@yandex.ru).
В след. раз я захожу допустим через FB(Твитер, Вконтактик...) и опять же расширение получает инфу.
И если на FB я юзал это же мыло Яндекса, то считаю, что расширение смело может привязаться к уже существующему акку в БД.
И если на FB я юзал это же мыло Яндекса, то считаю, что расширение смело может привязаться к уже существующему акку в БД.
да, только фб иногда дает «левое» мыло.
У меня получилось сравнение по имени-фамилии, screenname, городу, дате рождения и % пересекающихся друзей.
А вообще придерживался простого алгоритма:
Если юзер логинится через внешний сервис в первый раз — показываю 2 формочки — создать новый акк(заполнить поля имя и мыло(которые в большинстве случаев уже заполнены инфой из API)), либо привязать к уже существующему (просьба ввести логин и пароль от обычного акка).
Итого, без ведома юзера акки не плодятся, если конечно он не будет все время жать «создать новый акк».
Если юзер логинится через внешний сервис в первый раз — показываю 2 формочки — создать новый акк(заполнить поля имя и мыло(которые в большинстве случаев уже заполнены инфой из API)), либо привязать к уже существующему (просьба ввести логин и пароль от обычного акка).
Итого, без ведома юзера акки не плодятся, если конечно он не будет все время жать «создать новый акк».
При авторизации, например, через Яндекс можно спокойно указать email другого человека. Если привязываться только к email — то можно получить доступ к чужому аккаунту.
Спасибо, не знал.
(хотя немного не понимаю, зачем предоставляется такая возможность)
(хотя немного не понимаю, зачем предоставляется такая возможность)
Собственно поэтому чуть ниже и описал логику привязки без использования адреса электронной почты пользователя.
Будете внедрять этот функционал или предоставляете расширение «as is» и поддерживать не планируете?
Будете внедрять этот функционал или предоставляете расширение «as is» и поддерживать не планируете?
Считаю, что данный функционал должен быть в модуле управления/регистрации пользователей. В данное расширение внедрять его не планирую.
Как вариант, можно разработать еще одно расширение, которое будет интегрироваться с eauth и, например, с yii-user.
Расширение предоставляется «as is», но планирую фиксить баги, добавлять провайдеров и т.д. С удовольствием буду реализовывать интересные предложения.
Как вариант, можно разработать еще одно расширение, которое будет интегрироваться с eauth и, например, с yii-user.
Расширение предоставляется «as is», но планирую фиксить баги, добавлять провайдеров и т.д. С удовольствием буду реализовывать интересные предложения.
Вы читали статью? Про логинзу написано в самом начале.
Не конкуренты.
Не конкуренты.
Я думаю, вам не стоит читать и комментировать такие топики, если вы не занимаетесь веб-программированием.
Слишком толсто…
Не сразу понял, феномен это или троллинг )
Спасибо, не знал что такое HDL, до конца не понял, но видно классная штука, до этого для построения конечных автоматов пользовался jflap.
И я понял, самые крутые перцы, это те которые:
>> может посчитать физические модели самостоятельно и не имеет практику в Радиоэлектронике.
и им уже не нужны ни mathlab ни языки программирования?
И я понял, самые крутые перцы, это те которые:
>> может посчитать физические модели самостоятельно и не имеет практику в Радиоэлектронике.
и им уже не нужны ни mathlab ни языки программирования?
а что делать людям, которые какбэ и asm знают, и С, и php (именно знают, а не
лох (почему-то только это в голову пришло)
В своем проекте сделал аналогичным образом.
В настройках пользователя есть отдельная страница с виджетом eauth и списком уже подключенных аккаунтов. При авторизации на этой странице просто записываю в базу uid, serviceName и identity.
В настройках пользователя есть отдельная страница с виджетом eauth и списком уже подключенных аккаунтов. При авторизации на этой странице просто записываю в базу uid, serviceName и identity.
А если пользователь сначала заходит через сервис, без регистрации, то данные вставляются в таблицу users, а потом в identities с полученным userid?
Или поле userid в таблице identities сначала идет в null, а только потом обновляется обновляется?
Или поле userid в таблице identities сначала идет в null, а только потом обновляется обновляется?
а что значит «без регистрации»? мы же получаем данные о нем сразу, создаем юзера и создаем identity с этим юзером.
Тогда получается что в users нет email и пароля, которые можно предложить ввести после входа через сервис?
Автоматом этого никак не сделать, но как можно связать разные аккаунты одного пользователя?
Первое, что приходит в голову:
1. Пользователь должен пройти аутентификацию под любым из провайдеров.
2. Теперь уже аутентифицированный пользователь должен иметь возможность пройти аутентификацию через других провайдеров — тем самым давая нашему приложению данные о формировании связей.
Таким образом можно обойтись без анализа адреса эл. почты.
Ясно, что в рамках данного расширения это не реализовано. Нужно дописывать.
Первое, что приходит в голову:
1. Пользователь должен пройти аутентификацию под любым из провайдеров.
2. Теперь уже аутентифицированный пользователь должен иметь возможность пройти аутентификацию через других провайдеров — тем самым давая нашему приложению данные о формировании связей.
Таким образом можно обойтись без анализа адреса эл. почты.
Ясно, что в рамках данного расширения это не реализовано. Нужно дописывать.
Мне кажется все равно имеет смысл завести в системе свой user id. А вот как этот id будет идентифицироваться — это уже дело самого пользователя.
Я делаю так — в таблице пользователей вообще никакой аутенфикационной информации не содержится, у каждого провайдера своя таблица, связанная по user_id. Обычный логин/пароль такой же провайдер, как и Гугл или ВКонтакте, лишь чисто случайно оказавшийся на том же домене. Пользователь залогинившись хоть раз получает возможность привязать всех остальных провайдеров. Если не привязал и пользуется то ФБ, то Яндексом, то ССЗБ. В крайнем случае ручками в базе можно поправить.
А меня больше вот какой вопрос интересует: жил-был пользователь, который использовал авторизацию через стороннего провайдера. Потом этот сторонний провайдер отпал… Ну например, увели учетку или он забыл про нее… Можно нафантазировать разное.
И как ему теперь быть? На сайте-то много разной важной инфы для него скопилось.
Юзкейс: я на на одном сервисе зарегистрирован через ЖЖ-шный айди. ЖЖ последнее время работает из рук вон плохо и когда он лежит я не могу пользоваться и сервисом. Что делать в конкретном случае — наверное мне стоит спросить у администрации ресурса, но в целом: как можно было бы акую задачу решить?
И как ему теперь быть? На сайте-то много разной важной инфы для него скопилось.
Юзкейс: я на на одном сервисе зарегистрирован через ЖЖ-шный айди. ЖЖ последнее время работает из рук вон плохо и когда он лежит я не могу пользоваться и сервисом. Что делать в конкретном случае — наверное мне стоит спросить у администрации ресурса, но в целом: как можно было бы акую задачу решить?
Мы, при разработке последнего интернет магазина выбрали следующее решение. Пользователь авторизовавшись должен ввести эмейл, затем если возникнет описанная ситуация, он запрашивает на эмейл временную ссылку на одноразовую авторизацию под аккаунтом, к которому привязано адрес почты. И далее пользователь может привязать способы авторизации, либо выполнять процедуры, за которыми пришел на сайт.
И почему, когда начинаешь писать свой велосипед, его тут же выкладывают :)
Спасибо больше за расширение, как раз сами собирались писать такое.
Но почему не GitHub? :(
Но почему не GitHub? :(
А мой велосипед дружит с yii-user, который в свою очередь дружит с rights, но в общем-то привязка к пользовательскому модулю осуществляется через адаптер, так что не проблема написать адаптер для интеграции с каким-то другим модулем по управлению пользователями.
Еще модуль позволяет привязывать аккаунты соц. сетей к одному основному и в случае регистрации через акк. соц. сети, позволяет автозаполнять поля профайла данными с соц. сетей.
Поддерживает пока Facebook, Vkontakte (как плагины) и вот недавно мне дописали поддержку Google.
Еще модуль позволяет привязывать аккаунты соц. сетей к одному основному и в случае регистрации через акк. соц. сети, позволяет автозаполнять поля профайла данными с соц. сетей.
Поддерживает пока Facebook, Vkontakte (как плагины) и вот недавно мне дописали поддержку Google.
Пробую на демке авторизоваться через ФейсБук:
Fatal error: Call to undefined method EAuthException::getPrevious() in /home/n/nodge/nodge.ru/public_html/yii-eauth/demo/protected/extensions/auth/services/FacebookOAuthService.php on line 68
а есть ли аналоги без привязки к конкретному движку?
Есть библиотеки для работы с OpenID и OAuth. Некоторые провайдеры, например Facebook, предоставляют собственные библиотеки для работы с api. А вот готовых библиотек для работы с различными провайдерами через единый интерфейс мне не попадалось, к сожалению.
Loginza, не?
Вы проделали хорошую работу. Возьму её за основу, при написании подобной библиотеки для CodeIgniter.
Собираетесь ли обновлять проект до текущей версии (1.1.9)?
Огромное спасибо за расширение, сэкономило кучу времени!
когда прикручивал авторизацию одноклассников столкнулся с тем что после каждого действия происходил редирект на odnoklassniki.ru. Полез разбираться и оказалось что в методе EOAuth2Service::restoreAccessToken проверка $this->getState('expires', 0) > time() никогда не проходит поскольку для одноклассников вообще не устанавливается expires. Возможно это стоит поправить
когда прикручивал авторизацию одноклассников столкнулся с тем что после каждого действия происходил редирект на odnoklassniki.ru. Полез разбираться и оказалось что в методе EOAuth2Service::restoreAccessToken проверка $this->getState('expires', 0) > time() никогда не проходит поскольку для одноклассников вообще не устанавливается expires. Возможно это стоит поправить
А не подскажите, как с помощью вашего расширения получить аватарки с этих соц. сетей?
Зависит от API каждой соц. сети. Для большинства можно найти примеры в папке
Например, из Вконтакта можно получить фото:
А аватар из Твиттера так:
eauth/custom_services
.Например, из Вконтакта можно получить фото:
protected function fetchAttributes() {
$info = (array)$this->makeSignedRequest('https://api.vkontakte.ru/method/getProfiles', array(
'query' => array(
'uids' => $this->uid,
'fields' => 'photo',
),
));
$info = $info['response'][0];
$this->attributes['photo'] = $info->photo;
}
А аватар из Твиттера так:
protected function fetchAttributes() {
$info = $this->makeSignedRequest('https://api.twitter.com/1/account/verify_credentials.json');
$this->attributes['photo'] = $info->profile_image_url;
}
Спасибо большое за проделанную работу, только никак не выходит авторизация с Twitter. Почему на получении токена
в вызываемой GetRequestToken функции GetTokenFromUrl мне выдается 401 ошибка в полученных от Твиттера заголовках. Не подскажите в чем может быть дело? Часть конфигурации можно глянуть тут pastebin.com/5wY8jG25
$token = EOAuthUtils::GetRequestToken($consumer, $scope, $this->provider->request_token_endpoint, $applicationName, $callbackUrl);
в вызываемой GetRequestToken функции GetTokenFromUrl мне выдается 401 ошибка в полученных от Твиттера заголовках. Не подскажите в чем может быть дело? Часть конфигурации можно глянуть тут pastebin.com/5wY8jG25
Поправка:
Еще бы посмотреть какие данные уходят в твиттер при запросе…
Еще бы посмотреть какие данные уходят в твиттер при запросе…
Еще раз большое спасибо за расширение, разобрался сам. Не указал redirect URI в настройках приложения, прошелся по коду, узнал ответ от Твиттера, это было что-то вроде «Десктопные приложения в redirect URI должны указывать...». Я удивился, что мой запрос считают запросом от десктопного приложения и обнаружил это в настройках.
подключил данный модуль, но при вызове выдаёт такую ошибку «curl_setopt(): CURLOPT_FOLLOWLOCATION cannot be activated when safe_mode is enabled or an open_basedir is set» можно решить эту проблему?
спасибо, по этому архиву заработало. Но вот мистика, вернулся к той что до этого стояла, тоже заработала. Но это только через mail.ru другие площадки не подключал. Подключил вконтакт, но во конце авторизации выдало сообщение:
Error 500
Invalid response http code: 400.
заменил расширение на то что сейчас дали ссылку, авторизацию заработала успешно. Сейчас работает как майл, так и квонтакт. Гугл, яндекс не удаётся авторизовать, при первом клике в появившемся попап окне выдаёт туже ошибку FOLLOWLOCATION. Видимо они OpenID.
Кстати у вас на сайте в демо версии nodge.ru/yii-eauth/demo/login заметил больше провайдеров, а у меня всего 6шт. Увас имеется ещё Google (OAuth2), Yandex (OAuth) в расширении я так понимаю они уже имеются, только нужно где-то прописать их?
Спасибо.
Error 500
Invalid response http code: 400.
заменил расширение на то что сейчас дали ссылку, авторизацию заработала успешно. Сейчас работает как майл, так и квонтакт. Гугл, яндекс не удаётся авторизовать, при первом клике в появившемся попап окне выдаёт туже ошибку FOLLOWLOCATION. Видимо они OpenID.
Кстати у вас на сайте в демо версии nodge.ru/yii-eauth/demo/login заметил больше провайдеров, а у меня всего 6шт. Увас имеется ещё Google (OAuth2), Yandex (OAuth) в расширении я так понимаю они уже имеются, только нужно где-то прописать их?
Спасибо.
1. Google и Яндекс есть в двух вариантах: openid и oauth2.
2. Старые версии библиотеки не будут работать, т.к. API сервисов меняется.
3. Самый полный список сервисов есть в последней версии на github.com. Там же есть краткая инструкция что и как подключать. Демо проект так же есть на github.
2. Старые версии библиотеки не будут работать, т.к. API сервисов меняется.
3. Самый полный список сервисов есть в последней версии на github.com. Там же есть краткая инструкция что и как подключать. Демо проект так же есть на github.
разобрался спасибо, я полностью решил подключать только по OAuth. Сейчас пытаюсь подключить Yandex, Google(OAuth) скачал по вашей последней ссыке GoogleOAuthService.php (изменение 8 months ago) и яндекс и гугл при запросе авторизации в попап окне выдаёт сообщение redirect_uri_mismatch. Тоесть как понял API у них время от времени меняется, и возможно адрес мог поменять?
Если в демо работает, значит API не менялся. В вашем случае нужно указать правильный redirect url в настройках приложения у Google и Яндекс. Например, для Google у меня прописано так:
Вариант с
http://nodge.ru/yii-eauth/demo/login/google-oauth
http://nodge.ru/yii-eauth/demo/login/google-oauth?js
Вариант с
?js
нужен если вы используете popup окно для авторизации.если можно ещё один вопрос, как можно получить емайл? пытался вывести так $this->email = $this->service->getAttribute('email'); но ни один из провайдеров не выдаёт
Заметил такой баг. Все установил и сделал как по инструкиции но при авторизации ВКонтакте выдавало ошибку 400. Оказалось, что на API не передается параметр request_uri при формировании УРЛа в
пришлось добавить
protected function getTokenUrl($code) {
return $this->providerOptions['access_token'].'?client_id='.$this->client_id.'&client_secret='.$this->client_secret.'&code='.$code;
}
пришлось добавить
.'&redirect_uri='.urlencode($this->redirectUrl)
Суда по всему, вы скачали устаревшую версию. Последнюю всегда можно найти на github.com.
Да, вы наверное правы. Но все равно параметр redirect_uri нужен хотя бы для того, чтобы вернуть пользователя на ту страницу, с которой произошла авторизация. Например, мне надо авторизовать пользователя в момент чтения новости (когда для комментирования надо авторизоваться) а плагин перебрасывает все время на индекс.
redirect_uri
передается для всех OAuth 2.0 провайдеров.Выдержка с gitbub:
EOAuth2Service.php#L100
...'&redirect_uri='.urlencode($this->getState('redirect_uri'));
Спасибо за расширение, очень облегчило жизнь.
Скажите, а можно у вас авторизоваться, если провайдер и access_token уже известны?
Скажите, а можно у вас авторизоваться, если провайдер и access_token уже известны?
Sign up to leave a comment.
Единая авторизация пользователей с поддержкой нескольких сервисов