Комментарии 105
Спасибо. Давно хотел написать подобное, только(как обычно) руки не доходили.
0
аааа, где же Вы были месяца три назад) пришлось писать свой экстеншен.
+2
Интересно, задавались ли вы следующим концептуальным вопросом. И как решили его для себя.
Когда пользователь приходит на сайт первый раз — всё круто! Он нажимает кнопочку со знакомым логотипом, идентифицируется и сразу пользуется функционалом, доступным для зарегистрированных пользователей.
Но допустим, проходит время, пользователь забывает про сайт на какое-то время. А потом (через год) снова на него наталкивается. И хочет продолжить использование своего аккаунта. Только не помнит с помощью чего он авторизовывался раньше. Его действия в этом случае? Придётся перебирать по очереди провайдеров авторизации? И каждый раз будет заводиться новый аккаунт в вашей системе?
Иными словами можно ли в вашей системе будет как-то связать между собой аккаунты от разных провайдеров с аккаунтом создаваемом в вашей системе?
Когда пользователь приходит на сайт первый раз — всё круто! Он нажимает кнопочку со знакомым логотипом, идентифицируется и сразу пользуется функционалом, доступным для зарегистрированных пользователей.
Но допустим, проходит время, пользователь забывает про сайт на какое-то время. А потом (через год) снова на него наталкивается. И хочет продолжить использование своего аккаунта. Только не помнит с помощью чего он авторизовывался раньше. Его действия в этом случае? Придётся перебирать по очереди провайдеров авторизации? И каждый раз будет заводиться новый аккаунт в вашей системе?
Иными словами можно ли в вашей системе будет как-то связать между собой аккаунты от разных провайдеров с аккаунтом создаваемом в вашей системе?
+4
Как вы сами себе это представляете? Если пользователь использовал для авторизации один аккаунт, не привязывая других — откуда системе знать о других его аккаунтах?
Можно разве что в настройках аккаунта дать возможность подключать другие аккаунты.
Можно разве что в настройках аккаунта дать возможность подключать другие аккаунты.
+4
НЛО прилетело и опубликовало эту надпись здесь
ну я честно говоря статью бегло смотрел, но самый очевидный и простой способ — таблица authentications, в которую пишем user_id и provider (ну и всякие oauth_token и тп). Ну и ищем по ней когда кто-то логинится через сторонний сервис.
0
помоему пытаться привязать аккаунты пользователя через OAuth, это вообще не совсем правильно, так как OAuth не идентифицирует пользователя, он только разрешает доступ к определенной его информации. А OpenID идентфицирует пользвателя. Как где то писали мол OpenID — это паспорт человека, а OAuth — это ключи от машины, в бардачке которой лежит паспорт…
+1
НЛО прилетело и опубликовало эту надпись здесь
Допустим, я зашел в систему используя OAuth гугла, для меня создался аккаунт. А в следующий раз я зайду используя свой фейсбук аккаунт, как система узнает, что это тот же человек?
0
никак. только если вы к примеру в настройках своего аккаунта привяжете свой фб-аккаунт (само собой, если только это реализованио)
+1
Ну, теоретически, если второй провайдер предоставляет адрес мыла, можно сравнить.
0
Нельзя на 100% доверять никаким данным (пожалуй, кроме id пользователя), полученным от провайдера.
Про email уже писал ниже.
Про email уже писал ниже.
0
у меня была такая же проблема, в итоге вместо этого:
завел отдельную табличку identities(service, id, token, userid). Заодно для вк и фб храню токен для использования их API.
Правда если пользователь сразу не свяжет свой аккаунт с другими сервисами, будет плохо. Написал небольшой алгоритмик для сравнения данных пользователя и автосвязывания, но это все равно не всегда сработает.
Интегрировать расширение с yii-user. В общем случае для регистрации пользователя достаточно добавить в таблицу {{users}} всего два поля: service и identity. Первое поле – название сервиса авторизации (свойство serviceName). Второе – уникальный идентификатор пользователя на этом сервисе (свойство id);
завел отдельную табличку identities(service, id, token, userid). Заодно для вк и фб храню токен для использования их API.
Правда если пользователь сразу не свяжет свой аккаунт с другими сервисами, будет плохо. Написал небольшой алгоритмик для сравнения данных пользователя и автосвязывания, но это все равно не всегда сработает.
+4
Делал аналогично, через таблицу связей.
А еще, например, можно привязывать, если встречаешь email, уже присутствующий в БД.
Т.е. я захожу через Яндекс, расширение берет данные, в том числе мое мыло (допустим test@yandex.ru).
В след. раз я захожу допустим через FB(Твитер, Вконтактик...) и опять же расширение получает инфу.
И если на FB я юзал это же мыло Яндекса, то считаю, что расширение смело может привязаться к уже существующему акку в БД.
А еще, например, можно привязывать, если встречаешь email, уже присутствующий в БД.
Т.е. я захожу через Яндекс, расширение берет данные, в том числе мое мыло (допустим test@yandex.ru).
В след. раз я захожу допустим через FB(Твитер, Вконтактик...) и опять же расширение получает инфу.
И если на FB я юзал это же мыло Яндекса, то считаю, что расширение смело может привязаться к уже существующему акку в БД.
+2
И если на FB я юзал это же мыло Яндекса, то считаю, что расширение смело может привязаться к уже существующему акку в БД.
да, только фб иногда дает «левое» мыло.
У меня получилось сравнение по имени-фамилии, screenname, городу, дате рождения и % пересекающихся друзей.
0
А вообще придерживался простого алгоритма:
Если юзер логинится через внешний сервис в первый раз — показываю 2 формочки — создать новый акк(заполнить поля имя и мыло(которые в большинстве случаев уже заполнены инфой из API)), либо привязать к уже существующему (просьба ввести логин и пароль от обычного акка).
Итого, без ведома юзера акки не плодятся, если конечно он не будет все время жать «создать новый акк».
Если юзер логинится через внешний сервис в первый раз — показываю 2 формочки — создать новый акк(заполнить поля имя и мыло(которые в большинстве случаев уже заполнены инфой из API)), либо привязать к уже существующему (просьба ввести логин и пароль от обычного акка).
Итого, без ведома юзера акки не плодятся, если конечно он не будет все время жать «создать новый акк».
+1
При авторизации, например, через Яндекс можно спокойно указать email другого человека. Если привязываться только к email — то можно получить доступ к чужому аккаунту.
0
Спасибо, не знал.
(хотя немного не понимаю, зачем предоставляется такая возможность)
(хотя немного не понимаю, зачем предоставляется такая возможность)
0
Собственно поэтому чуть ниже и описал логику привязки без использования адреса электронной почты пользователя.
Будете внедрять этот функционал или предоставляете расширение «as is» и поддерживать не планируете?
Будете внедрять этот функционал или предоставляете расширение «as is» и поддерживать не планируете?
0
Считаю, что данный функционал должен быть в модуле управления/регистрации пользователей. В данное расширение внедрять его не планирую.
Как вариант, можно разработать еще одно расширение, которое будет интегрироваться с eauth и, например, с yii-user.
Расширение предоставляется «as is», но планирую фиксить баги, добавлять провайдеров и т.д. С удовольствием буду реализовывать интересные предложения.
Как вариант, можно разработать еще одно расширение, которое будет интегрироваться с eauth и, например, с yii-user.
Расширение предоставляется «as is», но планирую фиксить баги, добавлять провайдеров и т.д. С удовольствием буду реализовывать интересные предложения.
0
НЛО прилетело и опубликовало эту надпись здесь
Вы читали статью? Про логинзу написано в самом начале.
Не конкуренты.
Не конкуренты.
+2
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Я думаю, вам не стоит читать и комментировать такие топики, если вы не занимаетесь веб-программированием.
+4
НЛО прилетело и опубликовало эту надпись здесь
Слишком толсто…
0
Не сразу понял, феномен это или троллинг )
+1
Спасибо, не знал что такое HDL, до конца не понял, но видно классная штука, до этого для построения конечных автоматов пользовался jflap.
И я понял, самые крутые перцы, это те которые:
>> может посчитать физические модели самостоятельно и не имеет практику в Радиоэлектронике.
и им уже не нужны ни mathlab ни языки программирования?
И я понял, самые крутые перцы, это те которые:
>> может посчитать физические модели самостоятельно и не имеет практику в Радиоэлектронике.
и им уже не нужны ни mathlab ни языки программирования?
0
НЛО прилетело и опубликовало эту надпись здесь
а что делать людям, которые какбэ и asm знают, и С, и php (именно знают, а не
0
лох (почему-то только это в голову пришло)
0
В своем проекте сделал аналогичным образом.
В настройках пользователя есть отдельная страница с виджетом eauth и списком уже подключенных аккаунтов. При авторизации на этой странице просто записываю в базу uid, serviceName и identity.
В настройках пользователя есть отдельная страница с виджетом eauth и списком уже подключенных аккаунтов. При авторизации на этой странице просто записываю в базу uid, serviceName и identity.
+1
А если пользователь сначала заходит через сервис, без регистрации, то данные вставляются в таблицу users, а потом в identities с полученным userid?
Или поле userid в таблице identities сначала идет в null, а только потом обновляется обновляется?
Или поле userid в таблице identities сначала идет в null, а только потом обновляется обновляется?
0
а что значит «без регистрации»? мы же получаем данные о нем сразу, создаем юзера и создаем identity с этим юзером.
0
Тогда получается что в users нет email и пароля, которые можно предложить ввести после входа через сервис?
0
Автоматом этого никак не сделать, но как можно связать разные аккаунты одного пользователя?
Первое, что приходит в голову:
1. Пользователь должен пройти аутентификацию под любым из провайдеров.
2. Теперь уже аутентифицированный пользователь должен иметь возможность пройти аутентификацию через других провайдеров — тем самым давая нашему приложению данные о формировании связей.
Таким образом можно обойтись без анализа адреса эл. почты.
Ясно, что в рамках данного расширения это не реализовано. Нужно дописывать.
Первое, что приходит в голову:
1. Пользователь должен пройти аутентификацию под любым из провайдеров.
2. Теперь уже аутентифицированный пользователь должен иметь возможность пройти аутентификацию через других провайдеров — тем самым давая нашему приложению данные о формировании связей.
Таким образом можно обойтись без анализа адреса эл. почты.
Ясно, что в рамках данного расширения это не реализовано. Нужно дописывать.
0
Мне кажется все равно имеет смысл завести в системе свой user id. А вот как этот id будет идентифицироваться — это уже дело самого пользователя.
+1
Я делаю так — в таблице пользователей вообще никакой аутенфикационной информации не содержится, у каждого провайдера своя таблица, связанная по user_id. Обычный логин/пароль такой же провайдер, как и Гугл или ВКонтакте, лишь чисто случайно оказавшийся на том же домене. Пользователь залогинившись хоть раз получает возможность привязать всех остальных провайдеров. Если не привязал и пользуется то ФБ, то Яндексом, то ССЗБ. В крайнем случае ручками в базе можно поправить.
+1
А меня больше вот какой вопрос интересует: жил-был пользователь, который использовал авторизацию через стороннего провайдера. Потом этот сторонний провайдер отпал… Ну например, увели учетку или он забыл про нее… Можно нафантазировать разное.
И как ему теперь быть? На сайте-то много разной важной инфы для него скопилось.
Юзкейс: я на на одном сервисе зарегистрирован через ЖЖ-шный айди. ЖЖ последнее время работает из рук вон плохо и когда он лежит я не могу пользоваться и сервисом. Что делать в конкретном случае — наверное мне стоит спросить у администрации ресурса, но в целом: как можно было бы акую задачу решить?
И как ему теперь быть? На сайте-то много разной важной инфы для него скопилось.
Юзкейс: я на на одном сервисе зарегистрирован через ЖЖ-шный айди. ЖЖ последнее время работает из рук вон плохо и когда он лежит я не могу пользоваться и сервисом. Что делать в конкретном случае — наверное мне стоит спросить у администрации ресурса, но в целом: как можно было бы акую задачу решить?
0
Мы, при разработке последнего интернет магазина выбрали следующее решение. Пользователь авторизовавшись должен ввести эмейл, затем если возникнет описанная ситуация, он запрашивает на эмейл временную ссылку на одноразовую авторизацию под аккаунтом, к которому привязано адрес почты. И далее пользователь может привязать способы авторизации, либо выполнять процедуры, за которыми пришел на сайт.
0
И почему, когда начинаешь писать свой велосипед, его тут же выкладывают :)
+2
НЛО прилетело и опубликовало эту надпись здесь
Спасибо больше за расширение, как раз сами собирались писать такое.
Но почему не GitHub? :(
Но почему не GitHub? :(
0
А мой велосипед дружит с yii-user, который в свою очередь дружит с rights, но в общем-то привязка к пользовательскому модулю осуществляется через адаптер, так что не проблема написать адаптер для интеграции с каким-то другим модулем по управлению пользователями.
Еще модуль позволяет привязывать аккаунты соц. сетей к одному основному и в случае регистрации через акк. соц. сети, позволяет автозаполнять поля профайла данными с соц. сетей.
Поддерживает пока Facebook, Vkontakte (как плагины) и вот недавно мне дописали поддержку Google.
Еще модуль позволяет привязывать аккаунты соц. сетей к одному основному и в случае регистрации через акк. соц. сети, позволяет автозаполнять поля профайла данными с соц. сетей.
Поддерживает пока Facebook, Vkontakte (как плагины) и вот недавно мне дописали поддержку Google.
0
Пробую на демке авторизоваться через ФейсБук:
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
0
а есть ли аналоги без привязки к конкретному движку?
+1
Есть библиотеки для работы с OpenID и OAuth. Некоторые провайдеры, например Facebook, предоставляют собственные библиотеки для работы с api. А вот готовых библиотек для работы с различными провайдерами через единый интерфейс мне не попадалось, к сожалению.
0
Loginza, не?
+1
Вы проделали хорошую работу. Возьму её за основу, при написании подобной библиотеки для CodeIgniter.
+2
Собираетесь ли обновлять проект до текущей версии (1.1.9)?
0
Огромное спасибо за расширение, сэкономило кучу времени!
когда прикручивал авторизацию одноклассников столкнулся с тем что после каждого действия происходил редирект на odnoklassniki.ru. Полез разбираться и оказалось что в методе EOAuth2Service::restoreAccessToken проверка $this->getState('expires', 0) > time() никогда не проходит поскольку для одноклассников вообще не устанавливается expires. Возможно это стоит поправить
когда прикручивал авторизацию одноклассников столкнулся с тем что после каждого действия происходил редирект на odnoklassniki.ru. Полез разбираться и оказалось что в методе EOAuth2Service::restoreAccessToken проверка $this->getState('expires', 0) > time() никогда не проходит поскольку для одноклассников вообще не устанавливается expires. Возможно это стоит поправить
0
А не подскажите, как с помощью вашего расширения получить аватарки с этих соц. сетей?
0
Зависит от 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;
}
0
Спасибо большое за проделанную работу, только никак не выходит авторизация с 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
0
Поправка:
Еще бы посмотреть какие данные уходят в твиттер при запросе…
Еще бы посмотреть какие данные уходят в твиттер при запросе…
0
Еще раз большое спасибо за расширение, разобрался сам. Не указал redirect URI в настройках приложения, прошелся по коду, узнал ответ от Твиттера, это было что-то вроде «Десктопные приложения в redirect URI должны указывать...». Я удивился, что мой запрос считают запросом от десктопного приложения и обнаружил это в настройках.
0
подключил данный модуль, но при вызове выдаёт такую ошибку «curl_setopt(): CURLOPT_FOLLOWLOCATION cannot be activated when safe_mode is enabled or an open_basedir is set» можно решить эту проблему?
0
спасибо, по этому архиву заработало. Но вот мистика, вернулся к той что до этого стояла, тоже заработала. Но это только через 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) в расширении я так понимаю они уже имеются, только нужно где-то прописать их?
Спасибо.
0
1. Google и Яндекс есть в двух вариантах: openid и oauth2.
2. Старые версии библиотеки не будут работать, т.к. API сервисов меняется.
3. Самый полный список сервисов есть в последней версии на github.com. Там же есть краткая инструкция что и как подключать. Демо проект так же есть на github.
2. Старые версии библиотеки не будут работать, т.к. API сервисов меняется.
3. Самый полный список сервисов есть в последней версии на github.com. Там же есть краткая инструкция что и как подключать. Демо проект так же есть на github.
0
разобрался спасибо, я полностью решил подключать только по OAuth. Сейчас пытаюсь подключить Yandex, Google(OAuth) скачал по вашей последней ссыке GoogleOAuthService.php (изменение 8 months ago) и яндекс и гугл при запросе авторизации в попап окне выдаёт сообщение redirect_uri_mismatch. Тоесть как понял API у них время от времени меняется, и возможно адрес мог поменять?
0
Если в демо работает, значит 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 окно для авторизации.0
если можно ещё один вопрос, как можно получить емайл? пытался вывести так $this->email = $this->service->getAttribute('email'); но ни один из провайдеров не выдаёт
0
Заметил такой баг. Все установил и сделал как по инструкиции но при авторизации ВКонтакте выдавало ошибку 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)
0
Суда по всему, вы скачали устаревшую версию. Последнюю всегда можно найти на github.com.
0
Да, вы наверное правы. Но все равно параметр redirect_uri нужен хотя бы для того, чтобы вернуть пользователя на ту страницу, с которой произошла авторизация. Например, мне надо авторизовать пользователя в момент чтения новости (когда для комментирования надо авторизоваться) а плагин перебрасывает все время на индекс.
0
redirect_uri
передается для всех OAuth 2.0 провайдеров.Выдержка с gitbub:
EOAuth2Service.php#L100
...'&redirect_uri='.urlencode($this->getState('redirect_uri'));
0
Спасибо за расширение, очень облегчило жизнь.
Скажите, а можно у вас авторизоваться, если провайдер и access_token уже известны?
Скажите, а можно у вас авторизоваться, если провайдер и access_token уже известны?
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Единая авторизация пользователей с поддержкой нескольких сервисов