Авторизация на Drupal-сайте с помощью аккаунта ВКонтакте
Ромка — Пнд, 05/17/2010 - 00:26
Разработчики ВКонтакте.ру не так давно открыли доступ к OpenAPI — интерфейсу, позволяющему обычным пользователям авторизоваться на сторонних сайтах с использованием своих учетных записей ВКонтакте.ру.
Я выкладываю первую версию модуля vk_openapi, который интегрирует Drupal 6 с Open API. Демонстрацию работы модуля вы можете увидеть на этом сайте. Кнопка для авторизации с помощью учетной записи вКонтакте находится в форме авторизации (в правой колонке внизу) и на странице с формой входа.
Особенности модуля
- из учетной записи ВКонтакте выбираются все доступные поля и сохраняются в объекте $user;
- каждому созданному модулем пользователю автоматически может быть назначена роль;
- в качестве аватара нового пользователя может быть использован автар из профиля пользователя ВКонтакте;
- созданный модулем пользователь может быть связан с существующим на сайте аккаунтом.
В ближайших планах: обновление статуса пользователя на основе данных из профиля ВКонтакте.
Скачать модуль можно на drupal.org. В продолжении более подробное описание модуля и инструкция по его установке.
Работа модуля
Это пока первая и очень простая реализация модуля, работает он так:
- после нажатия пользователем кнопки "войти вКонтакте" модуль получает необходимые данные от сервера вКонтакте.
- Далее модуль проверяет есть ли в базе данных Друпала пользователь, связанный с именем, полученным от вКонтакте:
- если его нет, то создается новый пользователь и связывается с id пользователя ВКонтакте. Внимание! Важная деталь. Если в базе данных есть пользователь с именем не связанным с учетной записью вКонтакте и из вКонтакте приходит пользователь с таким же именем, то такие две учетные записи не будут связаны, для имени нового пользователя будет просто добавлен суффикс _N, где вместо N будет подставлено число.
- если связанный с учетной записью ВКонтакте пользователь есть, то будет использована найденная учетная запись.
- Выбранный пользователь авторизуется в системе.
- ВКонтакте не отдает адрес электронной почты, по этому модуль предлагает новому пользователю указать свой e-mail в настройках своего нового аккаунта.
Установка и настройка модуля
- Первым делом во ВКонтакте нужно создать приложение типа "Веб-сайт", для этого нужно перейти по ссылке: http://vkontakte.ru/pages.php?act=developers и нажать на кнопку "Подключить сайт".
- В настройках созданного приложения нужно указать адрес сайта (http://example.com/) и базовый домен (example.com), а также получить ID приложения и защищенный ключ, все эти четыре параметра нужно будет указать в настройках модуля vk_openapi.
- Теперь нужно скачать модуль, если вы этого еще не сделали, распаковать в папку sites/all/modules и включить его стандартными средствами Друпала.
- После активации модуля, на странице admin/settings/vk_openapi вы должны указать параметры созданного ранее приложения ВКонтакте.
Все, после выполнения этих действий к формам авторизации будет добавлена кнопка "войти вКонтакте" и пользователи смогут авторизоваться на вашем сайте с помощью учетных записей вКонтакте. При желании вы можете отключить вывод этой кнопки в формах авторизации, тогда в произвольное место страницы сайта нужно будет вставить код:
- <div id="vk_login" class="vk_login" style="margin: 0 auto 20px auto;" onclick="doLogin();"></div>
который будет заменен на кнопку.
Я старался сделать этот модуль максимально простым для посетителей сайта — авторизоваться в системе можно всего одним кликом. Мне, например, сильно не нравится реализация Facebook Connect для Друпла тем, что после нажатия кнопки "Connect" пользователя заставляют еще заполнить некоторые поля в форме регистрации. По этому данные от ВКонтакте получаются только один раз, при первом входе в систему, и используются только имя и фамилия пользователя. Теоретически, эти данные можно периодически обновлять, также есть возможность получить данные о фотографиях пользователя и его аватарке, его друзьях изменениях статусов, связать логаут на Друпал-сайте с логаутом из ВКонтакте и т.п. Интересно знать нужен ли кому-нибудь подобный функционал или достаточно того, что уже есть сейчас?
Кнопка в Opera 10.53 —
xandeadx (не проверено) → Пнд, 05/17/2010 - 01:56Кнопка в Opera 10.53 — http://img97.imageshack.us/img97/6723/20100517014838.png
Хмм... удивительно, у меня в
Ромка → Пнд, 05/17/2010 - 07:52Хмм... удивительно, у меня в Опере такого глюка нет...
Роман, проверте кодировку. У
RagnarR (не проверено) → Пнд, 05/17/2010 - 09:25Роман, проверте кодировку. У кнопки кодировка - cp1251, а у страницы - utf8.
Аналогично :(
Сергей Demin → Пнд, 05/17/2010 - 09:33Подтверждаю. Аналогичный глюк выскочил в Опере и у меня.
А развить модуль было бы неплохо
надо!
Евгений Корнеев → Пнд, 05/17/2010 - 09:55Да, модуль надо расширять. За реализацию - огромное спасибо :) думал уже платить фрилэнсерам за написание.
Загрузка аватара была бы кстати, ну и по юзабилити кое-какие мелочи...
«В Контакте» а не вКонтакте
Anonymous (не проверено) → Пнд, 05/17/2010 - 09:56«В Контакте» а не вКонтакте
Кнопка в Opera 10.53 —
Ромка → Пнд, 05/17/2010 - 10:23Кнопка в Opera 10.53 — http://img97.imageshack.us/img97/6723/20100517014838.png
Подтверждаю. Аналогичный глюк выскочил в Опере и у меня.
Роман, проверте кодировку. У кнопки кодировка - cp1251, а у страницы - utf8.
Тут проблема в том, что кнопку отдает сам вконтакт вот этим скриптом: http://vkontakte.ru/js/api/openapi.js. Сейчас попробую разобраться как конвертнуть в utf8 полученный код кнопки.
Кажется исправил, должна
Ромка → Пнд, 05/17/2010 - 10:56Кажется исправил, должна сейчас корректно кнопка отображаться.
Да, теперь все отлично!
RagnarR (не проверено) → Пнд, 05/17/2010 - 12:29Да, теперь все отлично!
Спасибо, своевременная реализация
Алексей Тарасов → Пнд, 05/17/2010 - 12:36Роман, спасибо
Спасибо!
Кузьмин Степан → Пнд, 05/17/2010 - 13:58Работает :)
Было бы замечательно -
Кузьмин Степан → Пнд, 05/17/2010 - 14:02Было бы замечательно - получать аватар пользователя Вконтакте и присваивать его новому пользователю. Так же хорошо сделать двухсторонний logout.
Ок, учту пожелание.
Ромка → Пнд, 05/17/2010 - 14:18Ок, учту пожелание.
После нажатия на кнопку
Anonymous (не проверено) → Пнд, 05/17/2010 - 14:41После нажатия на кнопку авторизация не происходит. Кроме того идет зацикленное соединение с вконтакте.
Какой браузер и ОС? Включен
Ромка → Пнд, 05/17/2010 - 14:47Какой браузер и ОС? Включен ли java-script (хотя похоже что включен)? Может какие-то еще данные сообщите, по которым проблему можно будет локализовать?
Имя пользователя
Андрей Постников → Пнд, 05/17/2010 - 14:46Ром, "контакт" недавно добавил ники, вероятно до них можно достучаться через данное АПИ.
А так получается что name = ФИО которые могут меняться ...
<?php$account->name = check_plain($first_name . ' ' . $last_name);?>
Сие очень плохо! check_plain нужно использовать только при выводе информации, а полученные данные сохранять в исходном виде.
С нетерпением жду анонса на d.org
Сие очень плохо! check_plain
Ромка → Пнд, 05/17/2010 - 15:57Сие очень плохо! check_plain нужно использовать только при выводе информации, а полученные данные сохранять в исходном виде.
Ыэх, согласен, я эту функцию использовал, чтобы отрезать лишние символы из имен. Попробую поэкспериментировать с никами... В модуле еще один косяк есть... хотя может он и не косяк вовсе. Данные забираются через java-sctipt, хотя я уверен, что их можно получить и из PHP, я сейчас в этом направлении двигаюсь.
"Лишние" символы
Андрей Постников → Пнд, 05/17/2010 - 22:04Полагаю, что лучше пользоваться
http://api.drupal.org/api/function/drupal_substr/6 или
http://api.drupal.org/api/function/truncate_utf8/6
C JS засада... разве они не передают информацию стандартным POST GET?
- иначе придется конвертить данные из 1251...
Видимо cыроват их api
Тут должна бить тема комментария.
qwertyman → Пнд, 05/17/2010 - 17:56Здравствуй Ромка
из Евросоюза.
По счастливой случайности нагуглил твой модуль - молодца. Теперь благодаря тебе у нас будет авторизация через всесоюзную социальную сеть. Сам пока толком не знаю, как понимать этот OpenAPI - победа амбиций Павлика Дурова & Co над здравым разумом или наш ответ западу на них OpenID, OAuth и FacebookConnect.
Так вот, о модуле, работает безупречно, но хотелось бы как в twitter обновлять свой статус вконтакте. Заходишь в «My account», кликаешь по закладке «Вконтакте», прописываешь e-mail, пароль и даже при помощи элементарного microblog обновляешь свой статус.
Начал изучать OpenAPI и наткнулся на http://habrahabr.ru/blogs/php/93037/ «как оказалось, сессия при авторизации выдается всего на час, что для задачи явно не подходит. В итоге решено было пойти путем эмуляции и сделать логин и авторизацию через cookies». Значит или делать при помощи OpenAPI с перелогиниванием (филологи меня простят) каждый час или авторизацию через cookies. Какой метод ты считаешь наиболее подходящим для этой задачи.
Полезная ссылка...
Андрей Постников → Пнд, 05/17/2010 - 22:10Видать контакт таки страдает отечественным "сделаем-все-по-своему"
но сыровато мля...
PS: Ромка, поставь http://drupal.org/project/comment_notify авторизованным то пользователям-то удобнее на мыл получать оповещения о коментах!
Не могли бы Вы подсказать:
Максим Соколов → Втр, 05/18/2010 - 11:43Не могли бы Вы подсказать: как вывести кнопку "Войти Вконтакте" обособленно без формы авторизации.. ? Хотелось бы её добавить в футер страницы в виде "блока", но без объёмной друпаловской формы.
А у вас не сработал вариант
Ромка → Втр, 05/18/2010 - 12:28А у вас не сработал вариант со вставкой в нужное место страницы кода:
?
Я просто невнимательно
Максим Соколов → Втр, 05/18/2010 - 14:37Я просто невнимательно прочитал инструкцию... спасибо!
Интеграция вперед!!
Виктор Богуцкий → Втр, 05/18/2010 - 14:17Интеграция вперед!!
После авторизации через API
Максим Соколов → Втр, 05/18/2010 - 15:45После авторизации через API упорно посылает на страницу "профиля", где требует ввести e-mail. Приэтом в настройках стоит переадресовывать совсем на другую страницу.
Ну да, это так и задумано. На
Ромка → Втр, 05/18/2010 - 16:47Ну да, это так и задумано. На ту страницу, которая указана в настройках, будет осуществляться переадресация только в том случае, если пользователь указал свой e-mail. В новой версии сделаю доп параметр в настройках, которым можно будет отключить эту фичу.
Выложить на d.o
Андрей Постников → Втр, 05/18/2010 - 17:34когда планируешь выложить? дабы дорабатывать в традиционной для дру манере? Ж)
На д.о уже лежит:
Ромка → Втр, 05/18/2010 - 17:42На д.о уже лежит: http://drupal.org/project/vk_openapi, сейчас занимаюсь прикручиванием доп фишек.
спасибо, попробуем
Василий Карпюк → Втр, 05/18/2010 - 19:25спасибо, попробуем (=
присоединяюсь к просьбе об аватарке и есть ещё предложение о добавлении веб-сайта пользователю его страницы вконтакте
страница вКонтакте
Андрей Постников → Втр, 05/18/2010 - 20:59Аватар и прочие данные важнее не разово вытаскивать, а иметь возможность синхронизировать, при каких-нить условиях
А вот насчет ссылки на страницу профиля ... что-то вроде было, типа списка своих профайлов в других социалках
Quote:Аватар и прочие данные
Ромка → Втр, 05/18/2010 - 22:08Я думаю таким условием сделать авторизацию. То есть при каждой авторизации будут обновляться все данные кроме статуса. Обновление статуса будет отслеживаться постоянно.
Статус
Андрей Постников → Втр, 05/18/2010 - 22:11Обновления статуса лучше делать по хрону, на хабре было обсуждение сего в купе с твитером.
Там фигня в том, что
Ромка → Втр, 05/18/2010 - 22:29Там фигня в том, что обращение к вконтактовскому АПИ идет через java-скрипт, пока, из PHP дергать его я не научился. Так что в любом случае инициировать процесс получения статуса может только залогиненый через вконтакт юзер.
Думаю сделать так: на hook_user повесить проверку, когда в последний раз синхронизировались данные с вконтактом если это делалось более определенного времени назад, то в тело страницы, будет добавляться java-скрипт, забирающий обновления и яаксом пишущий их в БД.
Ну и головняк они изобрели...
Андрей Постников → Втр, 05/18/2010 - 22:38Ром, что-то нифика я не могу найти ссылок на то, что именно через js все таскается.
Ткни плиз носом...
На хабре видел реализацию через curl - как раз статья про синхронизацию статусов
Может таки нативно http://api.drupal.org/api/function/drupal_http_request/6 что-то можно?
http://vkontakte.ru/pages.php
Ромка → Втр, 05/18/2010 - 22:46http://vkontakte.ru/pages.php?o=-1&p=Open%20API. А ты меня можешь ткнуть носом в пример с curl?
проверка
Concept Audio → Чт, 05/20/2010 - 18:27хочу написать что-нибудь, чтобы проверить модуль и сказать автору спасибо.
Пожалуйста, жду от вас
Ромка → Чт, 05/20/2010 - 18:43Пожалуйста, жду от вас фидбэка от использования модуля. Кстати, вот и одна недоработка видна: в случае если во вконтакте не указан никнейм, то выводится пара пустых кавычек, надо будет это побороть как-нибудь.
Хмм
Concept Audio → Чт, 05/20/2010 - 19:10Кстати, у меня не получилось заставить его работать пока.
Не появляется кнопка.
Должно ли пройти время с момента регистрации приложения 'В Контакте' ?
Т.е. пройти проверку оно должно?
Указал ключ, секретный код, site url (http://www.example.com), base url (example.com).
Еще бажик: когда впервый раз зашел в настройку модуля, Site Url был указан как "http://http://www.example..." т.е. с лишними 'http://'
Вообще модуль в эти поля
Ромка → Чт, 05/20/2010 - 19:35Вообще модуль в эти поля никакие значения не должен прописывать...
Про скорость реакции вконтакта сказать могу только на своем примере: у меня приложение заработало сразу. Косяки возможны из-за того что неправильно в админке заданы параметры приложения.
Роли
Concept Audio → Чт, 05/20/2010 - 19:16Еще момент:
если на сайте несколько ролей, модуль присваивает к этой авторизации "минимальную, базовую" роль?
или как? у меня на сайте анонимы, к примеру, не имеют права оставлять комментарии.
Присваивается стандартная
Ромка → Чт, 05/20/2010 - 19:18Присваивается стандартная друпальская роль "авторизованный пользователь".
что-то непонятное
Concept Audio → Сб, 05/22/2010 - 23:41Попробовал установить модуль заново и вспомнил, что при первом заупске (активации модуля) у меня возник белый экран с адресом "http://www.сайт.ru/admin/build/modules/list/confirm"
после обновления страницы, модуль как-бы активируется, но работать, походу, отказывается.
и так каждый раз (если удалить модуль и попробовать заново), белый экран при первой активации модуля.
огромное спасибо за модуль,
Пашка Родионов → Пт, 05/21/2010 - 17:00огромное спасибо за модуль, давно ждал...
можно было бы сделать, чтоб аватарка с вконтакте сразу привязывалась к профилю - было бы отлично
Добавил этот функционал в
Ромка → Сб, 05/22/2010 - 23:39Добавил этот функционал в четвертой альфе модуля.
респектую 2-мя руками=)
Пашка Родионов → Ср, 05/26/2010 - 00:28респектую 2-мя руками=)
Модуль не работает на связке
Lark (не проверено) → Вс, 05/23/2010 - 17:21Модуль не работает на связке nginx + php-fpm. :(
Какие ошибки выдаются?
Ромка → Вс, 05/23/2010 - 23:42Какие ошибки выдаются?
Проблема была со страницей
Lark (не проверено) → Пнд, 05/24/2010 - 02:16Проблема была со страницей /vk/xd_receiver.html
Поправил правила для nginx - все заработало!
А какая проблема была? И
Ромка → Пнд, 05/24/2010 - 09:52А какая проблема была? И какое у нее решение? Может быть я смогу ее в самом модуле предотвратить? Или опишу в документации к модулю, чтобы другие пользователи знали как ее исправить.
Проблема была в том, что у
Anonymous (не проверено) → Пнд, 05/24/2010 - 12:55Проблема была в том, что у меня в настройках .html файлы обрабатывались особым образом, пришлось сделать специальное правило для /vk/xd_receiver.html :
<?php
location /vk/xd_receiver.html {
try_files $uri @drupal;
}
location @drupal {
index index.php;
if (!-e $request_filename) {
rewrite ^/(.*)$ /index.php?q=$1 last;
}
}
?>
(Использовал для настройки nginx - http://github.com/yhager/nginx_drupal