Итак, если модуль установлен и настроен, то посетитель в закрытом разделе увидит стандартную форму авторизации. Форма, помимо внутреннего логина и пароля, предлагает выбрать один из внешних сервисов авторизации:
Сервисы можно условно поделить на две группы: одни являются провайдерами OpenID, другие работают по собственным протоколам авторизации.
Если сервис использует OpenID, то выводится форма, куда пользователь может ввести свой openid identity. Для удобства мы предлагаем вводить не полный идентификатор, а только специфичную для сервиса часть. Например:
Для социальных сетей выводится просто кнопка, открывающая диалог авторизации внешнего сервиса:
Внешний вид диалога авторизации зависит от сервиса:
Диалог Facebook.
Диалог Мой Мир@mail.ru.
После успешной аутентификации пользователь возвращается на сайт и авторизуется. Если это первый вход пользователя, то он добавляется в список пользователей сайта (с установленным значением поля "Тип авторизации", равным сервису авторизации).
Давайте посмотрим, что администратор сайта должен настроить, чтобы сервисы авторизации стали доступны посетителям.
После установки обновления модуль уже инсталлирован в системе. Если до обновления в настройках ядра уже был разрешен OpenID или Live ID, то соответствующие сервисы уже доступны.
Управлять сервисами можно в настройках модуля "Социальные сервисы". Там можно включать сервисы, сортировать их, настраивать необходимые параметры. Сервисы OpenID не требуют дополнительных настроек.
Обратите внимание, что для сервисов ВКонтакте, Мой мир@mail.ru, Twitter и Facebook требуется зарегистрировать на этих сервисах приложение (ссылки указаны).
При настройке приложений обращайте внимание на параметры типа "адрес сайта", "домен" - они чрезвычайно важны для правильной работы сервисов. Чаще всего авторизация будет работать и для поддоменов.
Настройки ВКонтакте.
Настройки Мой Мир@mail.ru.
Настройки Twitter.
Настройки Facebook.
На что еще требуется обратить внимание при настройке проекта?
- Некоторые сервисы требуют обращения только по HTTPS. Поэтому крайне желательно, чтобы php был собран с библиотекой openssl.
- Если на проекте используются различного вида редиректы (mod_rewrite), убедитесь, что при редиректе не перекодируются параметры GET.
Обработка и вывод социальных сервисов добавлены в стандартные компоненты system.auth.authorize и system.auth.form. В шаблоне компонента system.auth.authorize блок соцсервисов выводится с помощью компонента socserv.auth.form:
<?if($arResult["AUTH_SERVICES"]):?> <? $APPLICATION->IncludeComponent("bitrix:socserv.auth.form", "", array( "AUTH_SERVICES"=>$arResult["AUTH_SERVICES"], "CURRENT_SERVICE"=>$arResult["CURRENT_SERVICE"], "AUTH_URL"=>$arResult["AUTH_URL"], "POST"=>$arResult["POST"], ), $component, array("HIDE_ICONS"=>"Y") ); ?> <?endif?> |
"Маленькая" форма авторизации.
"Всплывающая" форма авторизации.
Реализован такой подход с помощью двух вызовов компонента socserv.auth.form с разными шаблонами:
<? $APPLICATION->IncludeComponent("bitrix:socserv.auth.form", "icons", array( "AUTH_SERVICES"=>$arResult["AUTH_SERVICES"], "SUFFIX"=>"form", ), $component, array("HIDE_ICONS"=>"Y") ); ?> |
<?if($arResult["AUTH_SERVICES"]):?> <? $APPLICATION->IncludeComponent("bitrix:socserv.auth.form", "", array( "AUTH_SERVICES"=>$arResult["AUTH_SERVICES"], "AUTH_URL"=>$arResult["AUTH_URL"], "POST"=>$arResult["POST"], "POPUP"=>"Y", "SUFFIX"=>"form", ), $component, array("HIDE_ICONS"=>"Y") ); ?> <?endif?> |
Как всегда, вы можете кастомизировать вывод стандартных компонентов. Самое доступное - это переопределить стили CSS в шаблоне сайта. Затем, вы можете кастомизировать шаблоны компонента socserv.auth.form.
Список социальных сервисов является программно-расширяемым. При построении списка сервисов вызывается событие "OnAuthServicesBuildList" модуля "socialservices". Обработчик события должен вернуть массив вида:
AddEventHandler("socialservices", "OnAuthServicesBuildList", array("CSocServFacebook", "GetDescription")); class CSocServFacebook extends CSocServAuth { const ID = "Facebook"; public function GetDescription() { return array( "ID" => self::ID, "CLASS" => "CSocServFacebook", "NAME" => "Facebook", "ICON" => "facebook", ); } } |
public function GetSettings() { //массив опций, как он используется в option.php модулей return array( array("facebook_appid", GetMessage("socserv_fb_id"), "", Array("text", 40)), array("facebook_appsecret", GetMessage("socserv_fb_secret"), "", Array("text", 40)), array("note"=>GetMessage("socserv_fb_sett_note")), ); } public function GetFormHtml($arParams) { return 'Ваш HTML для формы'; } public function Authorize() { //собственно код для авторизации пользователя } |
Таково наше первое знакомство с модулем социальных сервисов. Надеюсь, что использование модуля сделает работу с вашими проектами более удобной для ваших посетителей.
Вопрос: Как сопоставить существующий аккаунт ( традиционная регистрация ) с акками соц сетей?
Сейчас этого нет, но такая функциональность непременно должна появиться!
Ещё предстоит разобраться с тем, как использовать информацию о пользователе, которую предоставляют сервисы после внешней авторизации. Этой информацией должен наполняться профиль пользователя (видел подобное на kinopoisk.ru).
Кстати, в отличие от той же логинзы, судя по всему, всплывающие окна должны работать и в IE6, и в IE7 (bitrix-style всплывающие окна там работают хорошо). Хотя это ещё предстоит проверить
Только с ним будут сложности т.к. выдаваемый им id пользователя привязан к домену и для многосайтовой конфигурации придется попотеть.
Многосайтовость - будем делать разделение настроек по сайтам, можно будет указывать разные приложения для разных доменов.
У меня такое замечание: при авторизации с помощью mail.ru предлагается только ввод аккаунта в домене mail.ru, хотя у них есть еще list.ru, bk.ru и inbox.ru.
Надеюсь[IMG][IMG], что получится через Мой мир
А вот настройки "Запрашивать подтверждение регистрации по E-mail" и "Проверять E-mail на уникальность" игнорируются, поскольку относятся только ко внутренним пользователям.
Примеры: pupkin@yandex.ru, pupkin@ya.ru, pupkin@narod.ru и еще множество алиасов. vasya.pupkin@yandex.ru, vasya-pupkin@yandex.ru, Vasya.Pupkin@yandex.ru и пр. Считаю, что даже при реализации такой возможности пользователю будет гораздо легче авторизоваться с использованием одной и той же социальной сети, чем делать бесконечные привязки.
Во-первых, не все сервисы отдают email по API (если вы готовы к предметному диалогу - перечислите, пожалуйста, те, которые отдают email, проверим, насколько вы владеете вопросом). Как именно вы собираетесь объединить аккаунты, если вы не имеете необходимой для объединения информации? Во-вторых, на softkey.ru я вообще не вижу ничего, кроме openid/liveid/googleid. В-третьих, ещё несколько дней назад этого функционала не было вообще, сейчас он есть - с удобной админкой и большим набором социальных сетей. Неужели первое, что нужно сделать, выкатить свою желчь на разработчиков?
Может быть, если у вас есть интересные идеи, стоит, для начала, их нормально обдумать и предложить в нормальном виде на обсуждение? Не припоминаю, чтобы вы участвовали хоть в одном обсуждении и хоть что-то предлагали. Сами понимаете, когда вылазит "ньюбик" и "негодуэ", это смотрится довольно смешно Действительно смешно, а не грустно.
Если вы настроены на реальное изучение вопроса, начните с сайта kinopoisk.ru. Из русскоязычных сайтов, насколько я могу судить, на этом сайте вопросы взаимодействия с социальными сетями прокачены лучше всего. Импорт/экспорт заметок, поиск фрэндов, заполнение многих полей профиля. Так вот, на kinopoisk.ru никакого объединения аккаунтов нет. Например, сначала я зашёл с mail.ru - заполнился профиль, создался пользователь. Потом я зашёл с Вконтакте - заполнился профиль, создался пользователь, и если я попробую в профиле указать тот еmail, который использовался при входе с mail.ru, мне этого позволено не будет - "К сожалению, данный e-mail уже используется!". Таким образом, разная авторизация = разные аккаунты. Единственная возможность, связанная с объединением аккаунтов, на кинопоиске выглядит так: при прохождении внешней авторизации первый раз спрашивается, существует ли уже внутренний аккаунт на сайте (классический), и если указать существующий внутренний аккаунт, то отдельный пользователь не создаётся, а сразу попадаёшь в свой классический внутренний аккаунт. Но это можно сделать только при первой внешней авторизации (до создания пользователя), по желанию пользователя и через привязку к внутреннему аккаунту.
Покажите хоть один сайт, где автоматически на лету внешние аккаунты объединяются сами (или хотя бы по запросу пользователя, без наличия внутреннего аккаунта), чтобы можно было оценить вашу идею и понять, что это вообще в принципе возможно.
Я говорил только про одно: Про возможность пользователя к своему профилю привязать ВСЕ! способы авторизации, к одному аккаунту. Самостоятельно. Не более того.
1. Если при авторизации через сервис, наша систему уже зает такой е-майл - предлагать, авторизоваться через первичный сервис - тот через который изначально была регистрация.
2. Если е-майл был использован во время локальной регистрации - прелагать связать аккаунты.
- если у вас есть аккаунт на нашем сайте, то не используйте вход через соцсеть
- если вы уже входили через соцсеть, то и продолжайте входить через эту же соцсеть
Иначе вы имеете шанс получить разрозненные аккаунты.
Вадим, на 4-м скриншоте опечатка - "...запрашивает рЕзрешение..."
В шаблоне код:
<?$APPLICATION->IncludeComponent("bitrix:system.auth.form", "auth", Array(
"REGISTER_URL" => "/auth/",
"PROFILE_URL" => "/personal/profile/"
)
);?>
Сам я ничего не трогал, обычно не трогаю то, в чем не разбираюсь.
Защита от фришных пользователей? В каком смысле? При регистрации с внешних сервисов точно так же создаётся пользовательский акк, просто с указанием провайдера, отсутствием пароля и ещё мелочами.
На мой взгляд, внешняя авторизация вполне актуальна для "Экстранета" КП может быть.
Хотя если подумать - ещё интересный момент был бы для интеграции со внешними сервисами типа гуглдокса может или тому подобного.
Я понимаю почему из-за какой технической особенности так сделано, но может стоит приписать, мол "а теперь нажмите туда".
<div id="bx_auth_serv_<?=$arParams["SUFFIX"]?><?=$service["ID"]?>" style="display:none">
<?=$service["FORM_HTML"]?>
</div>
а вот где искать FORM_HTML ? НЕдавно с Битриксом связался) Помогите пожалуйста...
- Яндекс, Blogpost, ВКонтакт, LI не передали e-mail, пользователь создался с пустым e-mail (Яндекс выдал такое
- Рамблер отдал данные не в той кодировке (сайт в CP-1251), возможно и другие тоже сбоят
В каком месте я могу посмотреть, как пользователь авторизовался, где находится поле "Тип авторизации"
yandex, жж и mail сработали нормально, правда мейл отдал ФИО не в той кодировке
Проверьте, что выставленная тайм зона PHP, часовой пояс на сервере соответствуют выставленному времени на сервере.
Может возникнуть так, что часовой пояс у вас (+03 Москва), а время на сервере отличается от московского на час вперёд - при авторизации через вконтакте, в куку будет записываться expire - время жизни сессии. Время жизни сессии - 1 час. А при раскладе, описанном выше, сессия будет всегда просроченной и никакой авторизации осуществляться не будет.
через оперу 11,01 все ок, через мозиллу, ие8 и другие версии опер, к сожалению нет. выдает запрос на логин и пароль, после ввода данных - закрывает окно и баста. при повторном нажатии на иконку вконтакте, окно с запрос проскакивает автоматически и закрывается (т.е. получается, что логин-пасс проходит), но на сайте авторизации нет(
Виталий, как вам удалось забороть этот баг?
Объясните мне может я чего-то не так понимаю. Я опишу ситуацию не отвлеченно а именно на случившемся примере.
На сайте уже зарегистрированы 500 пользователей. Социальная, сеть. У них блоги, посты в форуме. Движуха, всё хорошо. И тут мы включаем новую фичу — авторизация через соцсети. Им хочется попробовать, здорово ведь наверное. Пробуют. И что получают? Правильно: лысый профиль. Объединение с существующим не предусмотрено. Да я дурак и вы мне это доказали и это не нужно. Возникает вопрос тогда зачем его ставить если мои 500 участников уже не смогут им воспользоваться. Это только для вновьприбывающих пользователей. Почему я могу авторизоваться на софткее и введя пароль, и через опенайди и попаду в свою учетку.
Аналогичная ситуация с магазинами. Зарегистрировался, оформил заказ, сформировалась история заказов. А потом один раз авторизовался через социалку и началась катавасия. Письма: куда дели мои заказы, нервы, недовольства клиентов и подрыв репутации. И опять я не вижу практической ценности этого модуля без возможности объединить аккаунты.
Где я не прав? Зачем тогда это всё?
Коллеги, в принципе разумно. Поддерживаю сие.
спасибо!
Я понимаю что сервис новый, только что создан, но прошу рассмотреть возможность такой доработки!
Заранее благодарен! Я думаю меня поддержат!
Хотя бы Имя, емайл, фото
Проверил - работает! Привязываются несколько социальных серсисов к содному аккаунту! Просто супер!
Сюда бы событие тоже... скажем OnBeforeUserExtAuthRegister
В противном случае без реализации этого функционала половина проектов будет обделена, вынуждая просто отключать возможность авторизации с соц.сетей.
Мне нужно в момент регистрации (из соц сетей) отработать одно действие. перелопатил код, не пойму где сам код добавление нового пользователя
------------------------------
Уже разобрался)