Авторизация через ВКонтакте

    Сколько процентов пользователей вашего сайта являются также пользователями ВКонтакте? Как по вашему, сколько человек ничего не пишут / комментируют / добавляют (нужное подчеркнуть), лишь потому, что им лень регистрироваться на еще одном непонятном сайте в 100й раз? Предлагаю ответить для себя на эти 2 вопроса, прежде, чем ругать ВКонтакте и Open API.

    В моем случае на сайт из ВКонтакте каждый день приходят около 1500 человек и обеспечить им простой и удобный способ регистрации, как мне кажется, является моим долгом.

    Вряд ли я открою что то новое, но если, хотя бы еще 1 сайт станет немного удобнее после этой статьи — значит я не зря потратил свое время на написание этого текста.

    Я писал модуль Open API авторизации для сайта на PHP, поэтому весь код будет на нем. Для Django также была статья.

    Исходный код простейшего примера доступен на github'е. Здесь его перепечатывать не буду, лишь вкратце расскажу, как это работает.

    Основную работу выполняет класс Auth_Vkontakte, содержащий 3 метода:
    • is_auth — Возвращает ID пользователя ВКонтакте, в случае, если пользователь не авторизован через Open API — возвращает false
    • logout — Разлогинивает пользователя, очищая куку, которую добавляет ВКонтакте. Лучшего способа я не нашел. Есть у Open API метод logout, но у меня он работал через раз.
    • render_login_form — Возвращает HTML код для отображения кнопки «Войти ВКонтакте», включая все необходимые script'ы.

    Вам, конечно, придется также добавить поддержку vkontakte в ваш движок сайта, например, добавить в табличку пользователя поле «vk_id», в котором будет хранится ID пользователя ВКонтакте.

    Алгоритм работы в реальных условиях примерно такой:
    1. После входа пользователя вконтакте перекидываем его на отдельную страницу (в моем случае это vk.php), где проверяем, зарегистрирован ли уже пользователь с таким vk_id. Если нет — показываем ему упрощенную форму регистрации (например, только логин и email). После чего создаем пользователя и перекидываем только что зарегистрированного посетителя на главную страницу.
    2. Создаем backend, который будет проверять куку ВКонтакте через Auth_Vkontakte::is_auth, в случае, когда посетитель не вошел на ваш сайт никаким способом. Если is_auth возвращает значение, отличное от false и пользователь с таким id зарегистирован на вашем сайте — авторизируем через вашу систему пользователей. Если вдруг так оказалось, что он не зарегистирован — вновь показываем форму регистрации.
    3. При logout удаляем кроме вашей куки также куку из ВКонтакте (метод Auth_Vkontakte::logout)

    Вообще, как мне кажется, подобными примерами должна начинаться любая документация по любому API. Разработчики ВКонтакте, однако, так не думают и понять Open API по их документации невозможно. Фактически, я ей и не пользовался — все прочитал лишь в исходниках на durov.at.
    Неужто компания ВКонтакте не может позволить себе нанять нормального технического писателя, который бы писал примеры и нормальные мануалы, а не сухие списки функций с кратким описанием параметров, которые она принимает?

    Для того, что попробовать тестовый пример в работе (который, правда, ничего кроме вашего ID не покажет) достаточно скачать исходники, и настроить локальный веб-сервер на адрес: openapi.lc (добавить в hosts: 127.0.0.1 openapi.lc).

    Если кому то понравилось и стало полезным — напишу также статью про FacebookConnect.
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама
    Комментарии 79
    • 0
      А возможно ли таким образом получить имя пользователя хотя бы?
      • +1
        Можно, но через Javascript API лишь (прошу поправить, если я не прав, но в документации про это ни слова).
        Т.е., видимо, если хочется сохранить Имя пользователя Вконтакте — нужно сначала получить его через Javascript, а после — отправить результат в свое приложение.
        • 0
          ссылку не подскажете где посмотреть про этот Javascript API?
          • +1
            vkontakte.ru/pages.php?o=-1&p=getProfiles
            Например, тут.
            А также, в исходниках сайта durov.at.
          • +7
            У меня в голове возникает только один вопрос: Почему документация по технологиям разбросана по всему интернету? То userapi.com / userapi.ru / durov.at и т.д. Что нельзя это в один раздел запихнуть?? например dev.vkontakte.ru
            • +1
              Хороший вопрос. Качество документации и ее разброс по всему инет, а также отсутствие не то что поддержки, а даже пути баг репорта — наводит на плохие мысли.
              • НЛО прилетело и опубликовало эту надпись здесь
                • 0
                  Зачем это разработчикам сайтов? Вход через вконтакте — это гораздо понятее для пользователя, чем вход через OpenID, и это большой шаг вперед по сравнению со стандартной «email-пароль-активация» схемой.

                  Зачем это разработчикам vkontakte? Думаю, что вот за этим.
                  • +1
                    Извините, но OpenID это уже более высокий уровень универсальности, чем некая социальная сеть.
                    • 0
                      Извините, а сколько пользователей целевой аудитории Вашего сайта хотя бы слышали что такое openID? И у скольки он есть?
            • 0
              Например, вот так — ссылка на статью в моем блоге
            • 0
              т.е в теории доверять этой информации смысла нет?
              • +1
                id пользователя точно получишь достоверный, это главное, а данные которые попадут в бд через js — не принципиально вбиты они пользователем через форму или попали автоматически через интеграцию с вконтактом. Дело удобства.
              • +1
                Кстати, все таки есть адрес api.vkontakte.ru/api.php, на который можно посылать команды для совершения внутренних действий, например перевести голоса от приложения пользователю и получить результат операции, возможно поддерживаются и другие методы, например, для получения информации о пользователе (уже авторизовавшемся на вашем сайте через open api).

                vkontakte.ru/pages.php?o=-1&p=%C7%E0%F9%E8%F9%E5%ED%ED%EE%E5%20%E2%E7%E0%E8%EC%EE%E4%E5%E9%F1%F2%E2%E8%E5%20%EF%F0%E8%EB%EE%E6%E5%ED%E8%FF%20%F1%20API
                • 0
                  К сожалению это только для secure методов. Данные о пользователе вы таким образом получить не сможете.
                  Хотя, может в последних версиях API что-то поменялось.
                  • +2
                    с помощью getProfiles через secure тоже можно получить данные о пользователе.
                    • +1
                      Спасибо, сегодня попробую добавить в код получение данных о пользователе.
                      • 0
                        Получилось? Потому что я сейчас тоже столкнулся с той же проблемой.
                        • 0
                          Решил такой логикой:
                          пользователь жмет «авторизация», идет авторизация через попап, коллбеком авторизации идет получение данных о пользователе через execute code getvariable, коллбеком экзекьюта идет ajax post запрос к login.php, где принимаются и обрабатываются данные, коллбеком к аджаксу идет обновление текущей страницы.
                • 0
                  А вот тут вопрос о безопастрости такого решения: я почитал документацию OpenAPI, и не нашел никаких данных о подписи ответных данных от API. Иными словами любой может подделать информацию о себе, которая будет получаться через Javascript (например подделать результат запроса getProfiles).

                  Если я не прав, поправьте меня.
            • –17
              Да, это твой долг…
              • 0
                Сказать можно много в ответ. Но я лишь спрошу — как с получением email?
                • +1
                  Судя по всему, никак. Да и слишком большой дырой в безопасности было бы давать email пользователей сторонним сайтам.
                  • 0
                    Для блога например авторизация нафиг не нужна. Нужна идентификация и мыло.
                    А насчет дыры — поясните, если не трудно.
                    • +2
                      Назвав это «дырой», я конечно, немного преувичил, но вряд ли вконтакте будет отдавать всем кому попало email'ы своих пользователей. Если я не прав и вконтакте уже это делает — пожалуйста, поправьте, кто может =)
                      • 0
                        Что значить кому попало?

                        Человек хочет авторизоваться на сайте. Он может это сделать вручную введя вся данные, подтвердив мыло и так далее. Либо подтвердив свои данные через сторонний сервис в два клика.

                        Проблема в том что мне надо знать 1. Имя 2. Мыло — так уж устроен сайт ( да и большинство сайтов в инете ). Мне даже пофиг будет ли мыло настоящее :)
                        • +2
                          записывайте к себе в базу email для пользователей, которые авторизуются через вконтакт, например: id@vkontakte.ru. Ну а на будущее — у каждого пользователя вконтакте будет свой email вида: nickname@vkontakte.ru. Думаю nickname можно будет узнать через api.
                          • 0
                            Думаю nickname можно будет узнать через api.
                            уже можно
                        • 0
                          Facebook например предоставляет «кому попало» и е-мейл и даже место жительства, конечно же из соглашения пользователя для каждого отдельного веб-сайта
                        • 0
                          Ну, фактически, вы получаете доступ к id пользователя, что (после приложения минимума усилий) позволяет вам связаться с ним прямо на vkontakte.
                    • +1
                      После входа пользователя вконтакте перекидываем его на отдельную страницу (в моем случае это vk.php), где проверяем, зарегистрирован ли уже пользователь с таким vk_id. Если нет — показываем ему упрощенную форму регистрации (например, только логин и email). После чего создаем пользователя и перекидываем только что зарегистрированного посетителя на главную страницу.

                      Достаточно большая вероятность того, что введенный e-mail совпадет с контактовским. Я бы сказал о 80-90 процентах. Впрочем это имхо.
                      • 0
                        программными методами с вашей стороны есть возможность реализовать слияние двух акканутов на вашем сайте ( вконтакте + пользователь вашего сайта ), если это один пользователь. Плюс возможность из личного кабинета пользователя привязать аккаунт вконтакте и авторизоваться в последующем через него. Главное — каким образом вы реализуете удобные и понятные для пользователя интерфейсы взаимодействия с вконтактом.
                    • +1
                      Поддерживаю насчёт документации. Не сразу въехал что к чему и тоже смог разобраться только по сайту durov.at
                      • 0
                        а можно обойтись как то без создания приложения? и вообще чего там за приложение надо? уж больно геморойно это всё =( а сделать надо
                        • 0
                          Приложение создать придется в любом случае, сделать это можно здесь: vkontakte.ru/apps.php?act=add&site=1
                          В целом — ничего сложного. Заполняете адрес сайта, получается id и password и заменяете ими те, что указаны в моем коде.
                          • 0
                            наверно чего то не так делаю: Open API security breach =((
                            • +1
                              Это вы уже с собственным приложением?
                              Если да, то вот тут еще нужно поменять ID: github.com/Kolger/open-api/blob/master/lib/login_form.html, заменить «apiId: 1868779,» на ваш apiId.
                              • 0
                                спасибо =) теперь кука появилась, осталось прикрутить это всё добро к своей авторизировалки
                              • 0
                                Эта ошибка возникает, когда заданный в настройках URL отличается от фактического.
                            • +1
                              Приложение нужно для того, чтобы вы приняли условия соглашения от ВКонтакте. В частности, на сайтах, на которых используется вход через контакт, нельзя пользоваться никакой платежной системой, кроме контактовской.
                              • +1
                                Надеюсь, они поменяют такое нелепое правило.
                                • +1
                                  Думаю, что для них это не нелепое правило, а основная причина, по которой стали городить весь этот огород с OpenAPI и не реализовали стандартный OpenID. Буду рад, если ошибаюсь. Но ни одной другой разумной причины найти не могу.
                                  • 0
                                    Я пока вижу причину в том, что это правило осталось от приложений, встроенных вконтакте. Такое ограничение для приложения, встроенного в эту соц сеть выглядит разумно.
                            • 0
                              М-м-м…

                              define ('VK_APP_ID', 'vk_app_1868779');
                              define ('VK_APP_PASSWORD', 'q2L3DWlLse0Wtah6nMTR');

                              А мож не стоит так вот делать, особенно в репозитории?
                              • 0
                                Это специальное приложение, которое я сделал именно для этого примера.
                                Приложение это настроено на URL openapi.lc, дабы упростить процесс настройки примера.
                                • 0
                                  Думаю, это надо было засунуть в конструктор Auth_Vkontakte. Заодно и в примере было бы сразу видно, куда втыкать ИД и Пароль аппсы.

                                  Также, если вы хотите вдальнейшем сделать из этого библиотеку, я бы порекомендовал убрать
                                  public function render_login_form() {
                                  return file_get_contents(«lib/login_form.html»);
                                  }

                                  Как-то уж совсем нехорошо. По сути ПХП только проверяет, залогинен пользователь или нет, а логин сам по себе происходит через хтмл форму. Для примера сойдет и так, хотя если будет отдельная библиотека, то как выглядит хтмл форма — уже не ее дело =)
                                  • 0
                                    Этот код был написан исключительно и специально для примера.
                                    Форму тоже туда воткнул лишь для большей ясности, дабы собрать все в одном месте )
                              • +2
                                Самое сложное в этом вопросе — распознать оригинальную форму Контакта от подложки для кражи паролей. Потому как они тем самым открыли мегабрешь в безопастности. Я бы сказал, из стен укреплений, деликатно отодвинули 2 из 4-х. Две оставшиеся — для лохов.
                                • +2
                                  Пользователей gmail в разы больше, чем вконтакта, однако они не торопятся авторизоваться на моем болге через свой мэйл. Вопрос доверия к ресурсу, а не удобстве пользования.
                                  • +4
                                    И чем их OpenID не устроил? Городят свою проприетарщину (еще Open API называют, вот в каком извините месте оно Open?), как будто пытаются завязать весь Интернет на себе. Не получится это у VKontakte, максимум что выйдет — отгородиться от Интернета толстой стенкой из пуленепробиваемых велосипедов.

                                    Или может я просто чего-то не понимаю?..
                                    • +2
                                      OpenID это для аутентификации, а Open API для авторизации, но люди заодно используют это и как средство для аутентификации. Различается это всё тем что по идее после авторизации по Open API вы разрешаете сайту творить с вашим эккаунтом определённые действия, например изменять статус за вас или ещё какие то действия. Здесь больше уместно сравнение с технологией OAuth, чем с OpenID.

                                      Но то что у них велосипед… Я бы не сказал, велосипед сделал FaceBook у которого они его и взяли, так что получается они не городили своё, а взяли уже готовую вещь (теоретически готовую).
                                      • +2
                                        Это сделано для того, чтобы каждый сайт, который подключает вход через vkontakte, согласовывал это действие с vkontakte. В процессе согласования на сайты накладываются некоторые ограничение: например, нельзя использовать сторонние платежные системы, можно только контактовскую. Т.е. если у вас прикручена робокасса или WebMoney, то вход через vkontakte вам не сделать (или сделать, но потом по правилам приложение отрубят и это будет epic fail — пользователи потеряют возможность входить в свои аккаунты). Можно еще сказать так: если у вас прикручен вход через вконтакте, то платежи через WebMoney в дальнейшем принимать на сайте будет нельзя, можно будет только через их собственную платежную систему. В случае OpenID так ограничить сайтовладельцев сложно.

                                        habrahabr.ru/blogs/social_networks/92523/
                                      • +1
                                        Спасибо, всё работает! про мордокнигу конечно же пишите!
                                        • 0
                                          Я так понял, приложение одобрять не обязательно?
                                          • +1
                                            Не обязательно, главное просто создать.
                                          • +2
                                            eien.farm.lv

                                            Вот настроенное приложение… Это если лень или не охота настраивать просто чтобы глянуть.

                                            * Также заметил глюк: если не было куки для авторизации, то после ввода всех данных, в первый раз возвращает Auth error — но если нажать заново на кнопку (войти Вконтакте), тогда все в порядке, с чем это связано?

                                            PS. Юзаю хром, также, чтобы проверить глюк можно использовать режим «инкогнито» в Вашем браузере.
                                            • 0
                                              Это глюк, я вчера пытался с ним бороться часа 3, даже репорты написал куда смог — не ответили. У меня в данном случае sig была undefined.
                                              Решилась это проблема только когда перерегистировал приложение.
                                              • 0
                                                Странно, я попробую тоже…

                                                Но, в ФФ все отлично работает… (либо глюк пропал)
                                                • 0
                                                  Расскажите потом о результатах. Главное — создавайте новое приложение, выбрав тип «сайт».
                                            • +1
                                              сделал бы кто-нибудь плагин к wordpress для авторизации/возможности оставления комментариев под id вконтакте. полезная вещь была бы тоже, я думаю.
                                              • +1
                                                Если добрый системный администратор закроет в корпоративной сети доступ к Контакту, то офисные работники не смогут получить доступ к сервисам Вашего сайта… ))) Так что у этой медали далеко не одна сторона…
                                                • 0
                                                  Могу ошибаться, но что стоит связываться с ВК только в момент регистрации? Т.е. использовать систему только для упрощения регистрации.
                                                • 0
                                                  Да, документация Вконтакте оставляет желать…… документации. Что же касается Facebook Connect — то у этих ребят, к счастью, документация на высоте — сложно остаться в неведении. Но статейка на хабре будет не лишней, опыт никогда не бывает лишним.
                                                  • НЛО прилетело и опубликовало эту надпись здесь
                                                  • 0
                                                    Как раз недавно бранился на «доки» ихние. Благодарю за разъяснения. =)

                                                    Подобное описание FB Connect тоже не помешает, ибо в рунете практически ничего толкового на эту тему нет.
                                                    • +1
                                                      Ещё стоит упомянуть про особенность параметра nameTransportPath. Пару часов убил на то, чтобы определить почему авторизация не работает и какие значения он кушает, а какие нет.
                                                      Авторизация работает, только если в нем указан relative path!
                                                      Т.е ни «xd_receiver.htm», ни «httр://domain.com/vk/xd_receiver.htm» не прокатывает. Только "/vk/xd_receiver.htm".
                                                      В php лечится миксом из функций parse_url() и pathinfo() в случае, если домен-каталог веб-приложения задаётся через конфиги.
                                                      • 0
                                                        Огромное спасибо за пример.
                                                        А Open API можно добавить к текущему рабочему приложению или надо создавать новое? Я бы не спрашивал, но что-то при тестовых попытках это сделать всё работает через раз.
                                                        • 0
                                                          Полностью согласен с автором! Сам с этим столкнулся!
                                                          • 0
                                                            Прицепил регистрацию через Open API на сайт. Скрипты асинхронные. В опере через раз JS выбивает такую ошибку

                                                            i10.fastpic.ru/big/2010/0926/8e/c4e71ec2f725c...

                                                            т.е. не может обратиться к какой-то защищенной переменной «closed».

                                                            То сразу выбивает и не входит. То пару раз нормально, на третий раз ошибка. Замечано только в Опере на разных компах. С чем это может быть связано?
                                                          • 0
                                                            Не известно, как скоро появится нормальная система авторизации для сайтов от Вконтакте?
                                                            • 0
                                                              Работал работал, да в последние недели чтото перестал работать скрипт этот(
                                                              • 0
                                                                По этому алгоритму хакер может авторизоваться на Вашем сайте под любым пользователем просто зная его ID в контакте (публичен) и подделав данные в запросе авторизации на Ваш сервер.

                                                                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.