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

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

Спасибо. Давно хотел написать подобное, только(как обычно) руки не доходили.
аааа, где же Вы были месяца три назад) пришлось писать свой экстеншен.
eoauth в расширениях еще 2010 года :)
на его базе в итоге и делал)
Интересно, задавались ли вы следующим концептуальным вопросом. И как решили его для себя.

Когда пользователь приходит на сайт первый раз — всё круто! Он нажимает кнопочку со знакомым логотипом, идентифицируется и сразу пользуется функционалом, доступным для зарегистрированных пользователей.

Но допустим, проходит время, пользователь забывает про сайт на какое-то время. А потом (через год) снова на него наталкивается. И хочет продолжить использование своего аккаунта. Только не помнит с помощью чего он авторизовывался раньше. Его действия в этом случае? Придётся перебирать по очереди провайдеров авторизации? И каждый раз будет заводиться новый аккаунт в вашей системе?

Иными словами можно ли в вашей системе будет как-то связать между собой аккаунты от разных провайдеров с аккаунтом создаваемом в вашей системе?
Как вы сами себе это представляете? Если пользователь использовал для авторизации один аккаунт, не привязывая других — откуда системе знать о других его аккаунтах?
Можно разве что в настройках аккаунта дать возможность подключать другие аккаунты.
НЛО прилетело и опубликовало эту надпись здесь
ну я честно говоря статью бегло смотрел, но самый очевидный и простой способ — таблица authentications, в которую пишем user_id и provider (ну и всякие oauth_token и тп). Ну и ищем по ней когда кто-то логинится через сторонний сервис.
помоему пытаться привязать аккаунты пользователя через OAuth, это вообще не совсем правильно, так как OAuth не идентифицирует пользователя, он только разрешает доступ к определенной его информации. А OpenID идентфицирует пользвателя. Как где то писали мол OpenID — это паспорт человека, а OAuth — это ключи от машины, в бардачке которой лежит паспорт…
НЛО прилетело и опубликовало эту надпись здесь
Допустим, я зашел в систему используя OAuth гугла, для меня создался аккаунт. А в следующий раз я зайду используя свой фейсбук аккаунт, как система узнает, что это тот же человек?
никак. только если вы к примеру в настройках своего аккаунта привяжете свой фб-аккаунт (само собой, если только это реализованио)
Ну, теоретически, если второй провайдер предоставляет адрес мыла, можно сравнить.
Нельзя на 100% доверять никаким данным (пожалуй, кроме id пользователя), полученным от провайдера.
Про email уже писал ниже.
Да, я сразу не прочитал все комменты, потом уже нашёл этот ваш комментарий. Ну а вручную связывать акки можно?
Можно, если пользователь вручную добавит свои аккаунты (например, на странице настроек).
у меня была такая же проблема, в итоге вместо этого:

Интегрировать расширение с yii-user. В общем случае для регистрации пользователя достаточно добавить в таблицу {{users}} всего два поля: service и identity. Первое поле – название сервиса авторизации (свойство serviceName). Второе – уникальный идентификатор пользователя на этом сервисе (свойство id);

завел отдельную табличку identities(service, id, token, userid). Заодно для вк и фб храню токен для использования их API.
Правда если пользователь сразу не свяжет свой аккаунт с другими сервисами, будет плохо. Написал небольшой алгоритмик для сравнения данных пользователя и автосвязывания, но это все равно не всегда сработает.
Делал аналогично, через таблицу связей.
А еще, например, можно привязывать, если встречаешь email, уже присутствующий в БД.
Т.е. я захожу через Яндекс, расширение берет данные, в том числе мое мыло (допустим test@yandex.ru).
В след. раз я захожу допустим через FB(Твитер, Вконтактик...) и опять же расширение получает инфу.
И если на FB я юзал это же мыло Яндекса, то считаю, что расширение смело может привязаться к уже существующему акку в БД.
И если на FB я юзал это же мыло Яндекса, то считаю, что расширение смело может привязаться к уже существующему акку в БД.


да, только фб иногда дает «левое» мыло.
У меня получилось сравнение по имени-фамилии, screenname, городу, дате рождения и % пересекающихся друзей.
А что значит «левое»?
фб предоставляет юзерам возможность отдавать приложениям т.н. proxied email, на тот случай, если юзер боится, что приложение его заспамит. Этакий виртуальный ящик, письма из которого будут сыпаться юзеру в сообщения.
Было бы интересно посмотреть, как происходит сравнение.
А вообще придерживался простого алгоритма:
Если юзер логинится через внешний сервис в первый раз — показываю 2 формочки — создать новый акк(заполнить поля имя и мыло(которые в большинстве случаев уже заполнены инфой из API)), либо привязать к уже существующему (просьба ввести логин и пароль от обычного акка).
Итого, без ведома юзера акки не плодятся, если конечно он не будет все время жать «создать новый акк».
При авторизации, например, через Яндекс можно спокойно указать email другого человека. Если привязываться только к email — то можно получить доступ к чужому аккаунту.
Спасибо, не знал.
(хотя немного не понимаю, зачем предоставляется такая возможность)
Собственно поэтому чуть ниже и описал логику привязки без использования адреса электронной почты пользователя.

Будете внедрять этот функционал или предоставляете расширение «as is» и поддерживать не планируете?
Считаю, что данный функционал должен быть в модуле управления/регистрации пользователей. В данное расширение внедрять его не планирую.
Как вариант, можно разработать еще одно расширение, которое будет интегрироваться с eauth и, например, с yii-user.

Расширение предоставляется «as is», но планирую фиксить баги, добавлять провайдеров и т.д. С удовольствием буду реализовывать интересные предложения.
НЛО прилетело и опубликовало эту надпись здесь
Вы читали статью? Про логинзу написано в самом начале.
Не конкуренты.
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Я думаю, вам не стоит читать и комментировать такие топики, если вы не занимаетесь веб-программированием.
НЛО прилетело и опубликовало эту надпись здесь
Слишком толсто…
Не сразу понял, феномен это или троллинг )
НЛО прилетело и опубликовало эту надпись здесь
Удивительно, как человек может за несколько часов прокачать карму до -15, причём ведь старался, продолжал троллить в полный рост из последних сил :)

Добровольный readonly, так сказать :)
НЛО прилетело и опубликовало эту надпись здесь
Спасибо, не знал что такое HDL, до конца не понял, но видно классная штука, до этого для построения конечных автоматов пользовался jflap.
И я понял, самые крутые перцы, это те которые:
>> может посчитать физические модели самостоятельно и не имеет практику в Радиоэлектронике.
и им уже не нужны ни mathlab ни языки программирования?

НЛО прилетело и опубликовало эту надпись здесь
… ага, а на этой планете живут те, кто не улетел с остальными… )))
НЛО прилетело и опубликовало эту надпись здесь
Запутали вы меня, тем не менее спасибо, узнал много новых слов o_0 :)
И еще «Сверхпроводниковая АЗС», гугл выдает ссылку на этот ваш комментарий, т.е теперь даже не знаю что и думать.

Это вы так шутите? или серьезно пишите?
НЛО прилетело и опубликовало эту надпись здесь
а что делать людям, которые какбэ и asm знают, и С, и php (именно знают, а не
лох (почему-то только это в голову пришло)
В своем проекте сделал аналогичным образом.
В настройках пользователя есть отдельная страница с виджетом eauth и списком уже подключенных аккаунтов. При авторизации на этой странице просто записываю в базу uid, serviceName и identity.
А если пользователь сначала заходит через сервис, без регистрации, то данные вставляются в таблицу users, а потом в identities с полученным userid?

Или поле userid в таблице identities сначала идет в null, а только потом обновляется обновляется?
а что значит «без регистрации»? мы же получаем данные о нем сразу, создаем юзера и создаем identity с этим юзером.
Тогда получается что в users нет email и пароля, которые можно предложить ввести после входа через сервис?
пароля нет, он, имхо, не нужен (если пользователь утратил контроль над своей учеткой в соцсети, высылаем ему one-time login ссылку, и он перепривязывает другой аккаунт).
А почту просим после входа, или в другой момент, по дефолту она пуста.
Автоматом этого никак не сделать, но как можно связать разные аккаунты одного пользователя?

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

Таким образом можно обойтись без анализа адреса эл. почты.

Ясно, что в рамках данного расширения это не реализовано. Нужно дописывать.
Мне кажется все равно имеет смысл завести в системе свой user id. А вот как этот id будет идентифицироваться — это уже дело самого пользователя.
Я делаю так — в таблице пользователей вообще никакой аутенфикационной информации не содержится, у каждого провайдера своя таблица, связанная по user_id. Обычный логин/пароль такой же провайдер, как и Гугл или ВКонтакте, лишь чисто случайно оказавшийся на том же домене. Пользователь залогинившись хоть раз получает возможность привязать всех остальных провайдеров. Если не привязал и пользуется то ФБ, то Яндексом, то ССЗБ. В крайнем случае ручками в базе можно поправить.
А меня больше вот какой вопрос интересует: жил-был пользователь, который использовал авторизацию через стороннего провайдера. Потом этот сторонний провайдер отпал… Ну например, увели учетку или он забыл про нее… Можно нафантазировать разное.

И как ему теперь быть? На сайте-то много разной важной инфы для него скопилось.

Юзкейс: я на на одном сервисе зарегистрирован через ЖЖ-шный айди. ЖЖ последнее время работает из рук вон плохо и когда он лежит я не могу пользоваться и сервисом. Что делать в конкретном случае — наверное мне стоит спросить у администрации ресурса, но в целом: как можно было бы акую задачу решить?
Мой ответ выше прочитайте.
В своих проектах я даю пользователю возможность не только привязать несколько аккаунтов на разных сервисах, но и указать логин/пароль для обычной авторизации.
Мы, при разработке последнего интернет магазина выбрали следующее решение. Пользователь авторизовавшись должен ввести эмейл, затем если возникнет описанная ситуация, он запрашивает на эмейл временную ссылку на одноразовую авторизацию под аккаунтом, к которому привязано адрес почты. И далее пользователь может привязать способы авторизации, либо выполнять процедуры, за которыми пришел на сайт.
И почему, когда начинаешь писать свой велосипед, его тут же выкладывают :)
НЛО прилетело и опубликовало эту надпись здесь
Спасибо больше за расширение, как раз сами собирались писать такое.

Но почему не GitHub? :(
Честно говоря, пока не довелось поработать с git, зато есть опыт работы с svn. Пока что разбираться с новой системой нет возможности. :(
НЛО прилетело и опубликовало эту надпись здесь
Жаль… искренне советую познакомиться с этой VCS, после git'а возвращаться на SVN уже не захочется :)

Да и коллективная работа в GitHub'е невероятно удобная, с гуглокодом не сравнить.
Проект перебрался таки на github.
А мой велосипед дружит с yii-user, который в свою очередь дружит с rights, но в общем-то привязка к пользовательскому модулю осуществляется через адаптер, так что не проблема написать адаптер для интеграции с каким-то другим модулем по управлению пользователями.

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

Поддерживает пока Facebook, Vkontakte (как плагины) и вот недавно мне дописали поддержку Google.
А где можно почитать/посмотреть про Ваше расширение?
Могу закинуть в svn, я его планировал публиковать в yii extensions после дополнительного рефакторинга и тестирования.
Как у вас успехи с расширением?
Если нужно, могу скинуть сорцы, т. к. на допиливание времени все еще не нашлось.
Сейчас это расширение еще находится в закрытом корпоративном репозитории и документации к нему еще совсем нет.
Пробую на демке авторизоваться через ФейсБук:

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
Я тоже получил ошибку, но другую. Написал в личку Nodge.
НЛО прилетело и опубликовало эту надпись здесь
Починил и обновил пост.
а есть ли аналоги без привязки к конкретному движку?
Есть библиотеки для работы с OpenID и OAuth. Некоторые провайдеры, например Facebook, предоставляют собственные библиотеки для работы с api. А вот готовых библиотек для работы с различными провайдерами через единый интерфейс мне не попадалось, к сожалению.
Loginza, не?
Не, Loginza это сервис, а либа иногда может оказаться полезнее и приятнее
Вы проделали хорошую работу. Возьму её за основу, при написании подобной библиотеки для CodeIgniter.
Для CodeIgniter да, надо! И еще желательно чтобы данные хранились в redis.
Связь с БД будет через Doctrine 2, надеюсь она поддерживает redis и вы сможете легко всё подключить.
Собираетесь ли обновлять проект до текущей версии (1.1.9)?
На следующей неделе буду обновлять свои проекты с 1.1.8 до 1.1.9. Если что-то сломается — буду фиксить. Но судя по changelog, все должно работать и так.
Огромное спасибо за расширение, сэкономило кучу времени!

когда прикручивал авторизацию одноклассников столкнулся с тем что после каждого действия происходил редирект на 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. Почему на получении токена
$token = EOAuthUtils::GetRequestToken($consumer, $scope, $this->provider->request_token_endpoint, $applicationName, $callbackUrl);
в вызываемой GetRequestToken функции GetTokenFromUrl мне выдается 401 ошибка в полученных от Твиттера заголовках. Не подскажите в чем может быть дело? Часть конфигурации можно глянуть тут pastebin.com/5wY8jG25
Лучше оформить issue на гитхаб. Что-нибудь кроме 401 кода приходит в теле ответа? Еще бы посмотреть какие уходят в твиттер при запросе…
Поправка:
Еще бы посмотреть какие данные уходят в твиттер при запросе…
Еще раз большое спасибо за расширение, разобрался сам. Не указал redirect URI в настройках приложения, прошелся по коду, узнал ответ от Твиттера, это было что-то вроде «Десктопные приложения в redirect URI должны указывать...». Я удивился, что мой запрос считают запросом от десктопного приложения и обнаружил это в настройках.
подключил данный модуль, но при вызове выдаёт такую ошибку «curl_setopt(): CURLOPT_FOLLOWLOCATION cannot be activated when safe_mode is enabled or an open_basedir is set» можно решить эту проблему?
Промахнулся и ответил вам ниже.
Решение зависит от того, в каком расширении происходит ошибка.
Если в зависимостях (loid или EOAuth), то найдите и закомментируйте строки с curl параметром CURLOPT_FOLLOWLOCATION .
Если в EAuth — то скачайте последнюю версию, в ней решена эта проблема.
спасибо, по этому архиву заработало. Но вот мистика, вернулся к той что до этого стояла, тоже заработала. Но это только через mail.ru другие площадки не подключал. Подключил вконтакт, но во конце авторизации выдало сообщение:
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.
разобрался спасибо, я полностью решил подключать только по 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 уже известны?
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации