Поддержка OAuth 2.0 платформой ВКонтакте

    Вчера во ВКонтакте появилась поддержка открытого стандарта авторизации OAuth 2.0. Теперь интегрировать сайты и клиентские приложения с социальной сетью стало значительно проще.



    На странице с документацией новой системы авторизации написано, что поддерживаются два типа авторизации: серверная и клиентская.

    После прохождения процедуры авторизации внешнего сайта, сервер разработчика сможет в любое время выполнять запросы к API ВКонтакте без участия пользователя. Для того, чтобы получить “вечную” сессию, достаточно просто добавить параметр scope=offline при открытии диалога авторизации.

    Также поддерживается клиентская авторизация для Desktop и мобильных приложений. Несмотря на новизну протокола OAuth 2.0, уже сейчас на его сайте можно найти библиотеки на большинстве популярных языков программирования.

    Помимо появления поддержки OAuth во ВКонтакте изменился способ взаимодействия с API. Теперь все запросы отправляются по безопасному протоколу HTTPS, в результате чего пропала необходимость подписывать каждый запрос.

    Например, для того, чтобы получить публичные статусы со стены пользователя, достаточно обратиться по адресу:

    https://api.vk.com/method/wall.get?owner_id=1

    Для получения приватных данных пользователя необходимо выполнить авторизованный запрос, просто добавив параметр access_token. Это стандартный ключ доступа, получаемый в результате прохождения процедуры авторизации.

    Многие методы, такие как wall.get, стали открытыми и не требуют авторизации, поэтому я подготовил небольшой пример, демонстрирующий, как это может работать:

    http://skdy.org/illarionov (в адресе Вы можете указать короткое имя или id любого пользователя.)

    Простой пример авторизации ВКонтакте:


    1) При клике на кнопку «Войти во ВКонтакте» нужно переадресовать на адрес вида:

    http://api.vk.com/oauth/authorize?client_id=2271023&redirect_uri=http://skdy.org/illarionov&display=page

    <button onclick="location.href='http://api.vk.com/oauth/authorize?client_id=2271023&redirect_uri=http://skdy.org/illarionov&display=page';">Войти ВКонтакте</button>

    2) После того, как пользователь произвёл необходимое действие, он будет переадресован на указанный callback с параметром code или error и error_desc, если произошла ошибка.

    3) После получения code, уже с серверной стороны Вы можете получить access_token, обратившись по адресу:

    https://api.vk.com/oauth/token?client_id=2271023&code=xxx&client_secret=xxx, где в качестве client_secret нужно указать защищённый ключ, который Вы можете получить в форме редактирования приложения.

    $code = $_GET['code'];
    $secret = 'xxx';
    $resp = file_get_contents('https://api.vk.com/oauth/token?client_id=2271023&code='.$code.'&client_secret='.$secret);
    $data = json_encode($resp, true);
    if ($data['access_token']) {
       // работа с API
    }

    * This source code was highlighted with Source Code Highlighter.

    На этом всё, полученный access_token позволяет работать с API.
    Поделиться публикацией
    Похожие публикации
    Реклама помогает поддерживать и развивать наши сервисы

    Подробнее
    Реклама
    Комментарии 89
    • +10
      не прошло и года :)
      • +17
        а мне кажется прошло
        • 0
          на самом деле вменяемый драфт, по которому можно уже было реализовать этот протокол, появился в середине прошлого года. А финальная версия пару месяцев назад.
          Но главное то, что некоторые крупные сайты ввели это в начале этого года, а вконтакте очнулся только спустя 2-3 месяца, что не очень.
          • 0
            Финальная версия так и не появилась.
            Постоянно приходится перечитывать протокол и находить в нем изменения.
            Последний драфт от 6 апреля, версия 15 (draft-ietf-oauth-v2.0-15)
        • 0
          Лучше поздно, чем последними. OAUTH это хорошо, теперь остались только Одноклассники (Мой Мир уже поддержал).
          • 0
            Одноклассники запустили OAuth 2.0 в начале марта.
        • +4
          Они молодцы!
          • +2
            Если бы своих костылей в виде OpenAPI не писали, были бы еще большими молодцами)
          • +3
            Очень хорошо, а то их велосипеды были жалким подобием.
            • +6
              Свершилось чудо!!!
              • +4
                Наконец то. Только чувствую, какой то подвох таки будет… они не могут сделать все хорошо
                • +4
                  могут
                  • +1
                    дай бог если вы правы, если же нет, то это десятки безсонных ночей работы с их велосипедами, а потом полное разочаровние в том, что они опять все поменяют
                • +1
                  кстати, вчера только задумался над тем — почему ВК не сделали еще OAuth… бывает же:)
                  • +1
                    OAuth != OAuth2
                    • +2
                      спасибо К.О., я имел ввиду способ авторизации, а не версию протокола :)
                  • +1
                    И что теперь можно через стандартные либы OAuth использовать еще и vk? Интересует пример на питоне.
                  • 0
                    Ошибка client_secret='+$secret);
                    • 0
                      И когда же наконец сделают OpenID?
                      • НЛО прилетело и опубликовало эту надпись здесь
                        • 0
                          У этих протоколов разное назначение: OAuth преимущественно для авторизации клиента, передающего данные. OpenID — для унификации авторизации
                          • 0
                            Сейчас большинство сайтов, поддерживающих OpenID, сделали поддержку входа через соц. сети, так что OpenID уже не станет таким популярным, как мог быть.
                            • 0
                              Это правда. OpenID в реализации на порядок сложнее чем простенькая авторизация, а смысл тот же
                              • +1
                                Это вы зачем людей в заблуждение вводите?

                                Сходите, изучите значение слов «сложнее» и «порядок», пожалуйста.
                                • 0
                                  сами идите
                                  • –2
                                    О, тролль.

                                    Ну расскажите мне, чем это OpenID сложнее, чем OAuth. И заодно софистику «OAuth преимущественно для авторизации клиента, передающего данные. OpenID — для унификации авторизации» проясните.

                                    А то пацаны в лице автора протокола пока-то и не в курсе.
                                    • +3
                                      OpenID в реализации на порядок сложнее чем простенькая авторизация



                    • НЛО прилетело и опубликовало эту надпись здесь
                      • 0
                        По прежнему 3 запроса в секунду на одного пользователя
                        • НЛО прилетело и опубликовало эту надпись здесь
                          • 0
                            особые квоты в зависимости от популярности приложения
                          • 0
                            Это в сочетании с OAuth — прямая дорога к монетизации, кстати. OAuth ведь обычно нужен приложениям.
                        • +1
                          Сделали бы еще, чтобы email отдавался, как у гугли и того же фейсбука.
                          • 0
                            И не как у твиттера. Они защищаются от лишних нападок.
                            • +4
                              А смысл? Вот представте ситуацию — у нас есть некий ресурс, предположим docme.ru, и есть на нем авторизация с помощью VK, Yandex, Mail.ru и пр. Допустим, упал вконтакт, такое уже бывало, и наши пользователи не могут получить доступ к своему аккаунту. Но, имея мыла на руках, можно сделать восстановление доступа, временное или постоянное. А так мыло приходится спрашивать дополнительно при регистрации, и не факт, что оно будет «правильное».

                              Это кстати из реальной жизни, мы на ДокМи с этим столкнулись, когда Mail.ru упал, и благо, что пользователей от него не так много в настоящий момент. Однако письма в тех.поддержку посыпались моментально. Так что я считаю — мыло крайне необходимо, если даешь oauth|openid|etc. Вопрос даст ли его пользователь — дело второе. Все-таки сеть — штука нестабильная
                              • НЛО прилетело и опубликовало эту надпись здесь
                                • 0
                                  Я имел в виду нападки от параноиков ;-)
                                  • +1
                                    Ну гугль и фейсбук не боятся, в сумме думаю акков у них поболее будет, и ничего, не параноят.
                                    А для параноиков — все просто — галка с выбранным пунктом «дать доступ к мылу» в окошке подтверждения, параноики эту галку снимут.
                            • 0
                              Для десктопных прог нет ограничений? А то сейчас у нас весьма ядреная авторизация используется и она не срабатывает на мобилках((
                              • 0
                                OAuth построена на http. Если у десктопной проги нет ограничений на использование http-протокола, то и ограничений для авторизации быть не должно.

                                Быть может, вы об авторизации через ява-апплеты какие-нибудь говорите?
                                • 0
                                  Нет, для десктоп-приложений была трёхступенчатая авторизация через перезагрузку страниц, с яваскриптом и куками. Подразумевалось, что мобильное приложение должно просто открыть эту страницу во встроенном браузере и потом им полагалось как-то управлять ещё. Что вообще малореально. В мобилах и правда были большие проблемы с этим. Приходилось выкручиваться или через эмуляцию этих костылей через http-запросы или выносить авторизацию наружу приложения куда-нибудь.
                              • НЛО прилетело и опубликовало эту надпись здесь
                                • 0
                                  Нет, имеется в виду, что можно использовать новый формат запросов используя access_token
                                  • НЛО прилетело и опубликовало эту надпись здесь
                                  • +1
                                    IFrame приложения могут использовать OpenAPI. Схема авторизации аналогична сайтам.
                                  • 0
                                    Было вообще круто, если б они хорошенько протестировали основной функционал перед запуском. Залогинеться у меня получилось, а вот насрать на свою же стенку или вытащить полную инфу о себе уже не могу, errorы возвращает. Конечно допускаю, что я что-то не верно сделал, но access_token получил валидный, могу достать список своих друзей.
                                    • +1
                                      Писать на стену можно по прежнему только desktop приложениям, либо приложениям отправившим запрос на apps@vkontakte.ru. Каким образом Вы пытаетесь получить полную информацию?
                                      • +1
                                        Ну собственно через «getProfiles».
                                        У них на странице Выполнение запросов к API написано, что «METHOD_NAME – название метода из списка функций API». А в этом списке есть как «getProfiles», так и «wall.post».

                                        Выходит сделали коннект, а сделать «больше» ничего пока нельзя. Так хотя бы написали б об этом, а то непонятно.
                                        • +1
                                          getProfiles работает, только что проверил, можно пожалуйста код запроса (access_token можно затереть).
                                          • +1
                                            Сори, с getProfiles мой бок. Я не передавал в запрос «fields». Как-то подумал, что если его не передать, товернется вся доступная инфа по пользователю. По мойму это логично :)

                                            Но с «wall.post» проблема пока актуальна. :)
                                      • +1
                                        Имя то хоть можно вытащить?
                                        • 0
                                          Да, значения uid, first_name и last_name возвращаются всегда, вне зависимости от выбранных полей и их количества. Для вытягивания остальных значений необходим access_token и список полей, которые хочешь вытянуть. В другой ветке я описал, что это был мой бок, нужно всегда передавать список полей, которые тебя интересуют.
                                        • 0
                                          А вы не знаете, можно получить ленту новостей для стороннего сайта?
                                          • 0
                                            что получить?
                                            • 0
                                              Ну ленту, ту которую мы видим нажав на ссылку «Новости».
                                              • 0
                                                Вообще это метод newsfeed.get (http://vkontakte.ru/developers.php?o=-1&p=newsfeed.get). Но что вы с этими данными хотите сделать я не совсем понял))

                                                Я например для Gwibber (микроблог-клиент в Linux) плагин через него написал. Если нужен пример кода — можете поглядеть code.launchpad.net/~seriy-pr/gwibber/vkontakte-ru-plugin (Python)
                                                • 0
                                                  Спасибо за ответ. Я хочу выводить ленту у себя на сайте. Когда я смотрел, и если я правильно понял (это было прим. месяц назад), то этот метод может использовать или программа или моб. клиент, но не сторонний сайт. Вот тут и хотелось бы уточнить, ошибаюсь ли я?
                                                  Может быть у вас по опыту работы с api vk есть какой то свой способ вытащить новости друзей, если официальным методом этого сделать нельзя?
                                                  • 0
                                                    Да, есть загвоздка, что токен API привязан к IP адресу с которого происходит авторизация (с которого открывается браузер и нажимается кнопка «разрешить» в веб-интерфейсе).
                                                    Так что с сервера, как я понял, без хаков этого не сделать…
                                                    Так что либо пишем проксик и запускаем на сервере чтоб IP совпадали либо парсим форму авторизации (но я этого не пробовал ибо у меня десктоп-клиент)
                                                    Но я могу и ошибаться на самом деле…
                                                    • 0
                                                      Хорошо спасибо большое.

                                                      Вот еще бы этот метод сделали для сторонних сайтов, было бы вообще хорошо)
                                                      • 0
                                                        О! Кстати! Только что нашел параметр авторизации «offline» вот тут последний. В фейсбуке есть одноименный параметр который позволял как-раз обращаться к API с сервера. Попробуйте его. Я сейчас тоже попробую))
                                                        • 0
                                                          Сергей, а у Вас сейчас работает этот параметр? У меня почему-то именно с ним при авторизации выдается ошибка
                                                          {
                                                             error: "invalid_grant"
                                                             error_description: "Code is invalid or expired."
                                                          }


                                                          А с остальными нормально
                                                          • 0
                                                            У меня вот такие параметры:
                                                                  "client_id": VK_APP_ID,
                                                                  "redirect_uri": "http://vkontakte.ru/api/login_success.html", #FIXME: http://api.vkontakte.ru/blank.html don't fire "title-changed"
                                                                  "response_type": "token",
                                                                  "display": "popup",
                                                                  "scope": ",".join(("video", "offline", "wall"))
                                                            Все работает ок, хотя вчера почему-то глючило.
                                        • 0
                                          То, чего так долго ждали, наконец-то!
                                          • 0
                                            Слава богам, наконец-то смогу использовать без проблем в мобильных приложениях.
                                            • +1
                                              А можно ли как-то через OAuth разлогинить пользователя?
                                              • –4
                                                Это противоречит идеям монетизации.
                                                • 0
                                                  Извините, я не в курсе. Почему это противоречит идеям монетизации?
                                                  • –5
                                                    А зачем давать разлогинить пользователя без нужды? Чтобы он более ничего купить не мог?
                                                    • 0
                                                      Например если данным приложением будет пользоваться большое количество человек.
                                                      • 0
                                                        Я как бы отвечаю, почему метода нет в API. Все претензии — в администрацию вконтакта.
                                                • 0
                                                  В смысле разлогинить? На своем сайте или сайте-провайдере?
                                                • 0
                                                  Я прошёл через полгода ожидания в страхе того, что html/js код страниц авторизации может измениться в любой момент. Господа веб-разработчики реально верят в то, что неотъемлемой частью любого desktop/mobile приложения является веб-браузер? >_<
                                                  • 0
                                                    При работе в AIR к сожалению, выхода другого не вижу (. Приходится плясать с бубном и боятся изменений формы авторизации.
                                                  • 0
                                                    У них бы еще саппорт нормальный появился, в который раз отклоняют приложение с формулировкой «Приложение не соответствует уровню в контакте» без объяснения причин, и на комментарии не отвечают… Плюс к этому еще и голоса не вернули, которые:
                                                    Размещение приложений и их одобрение бесплатны. Однако, в связи с большим количеством заявок на проверку приложений, взятых со сторонних сайтов, для отправки приложения на проверку необходимо внести залог в 10 голосов.
                                                    • –1
                                                      Наконец-то можно будет сделать нормальную внебраузерную авторизацию, ура!
                                                      • –1
                                                        Это каким таким образом?
                                                        • +1
                                                          Браузер все равно нужен что бы вводить логин/пароль и давать права для приложения. Так что нет, не получится…
                                                        • +1
                                                          Вот. Только что перенес код плагина VKontakte для Gwibber на новую ваторизацию. Получилось довольно мало изменений. Кому интересно — вот DIFF.
                                                          По впечатлениям — вроде проще стало и аккуратнее и логичнее чтоли. Хотя на пару недочетов наткнулся + документация запутанная. Так, например, страница для редиректа по-умолчанию для десктоп-приложений api.vkontakte.ru/blank.html не имеет title и в python-webkit не срабатывает событие «title-changed». Приходится эту vkontakte.ru/api/login_success.html использовать пока.
                                                          • 0
                                                            а кроме как title-changed никак нельзя прослушать, что страница изменена?
                                                            • 0
                                                              Ох… Может и можно, но это самый простой вариант и в Gwibber везде именно он используется. Я, честно говоря, не помню)))

                                                              Но, как уже сказал, решилось использованием страницы-заглушки от старого API у которой title есть vkontakte.ru/api/login_success.html
                                                          • 0
                                                            А безбраузерная авторизация для десктоп\мобильных приложений все так же почти (кроме как сильно через жо) невозможна?

                                                            Под WP7 у меня авторизироваться через браузер так и не получилось (категорически отказывались подгружаться поля для логина и пароля).
                                                            • 0
                                                              Насколько мне лично известно, OAuth не предусматривает безбраузерной авторизации впринципе. Это все для того чтобы злой создатель программы не смог украсть ваш логин и пароль (хотя для десктоп-программ это по-прежнему не проблема)
                                                            • 0
                                                              в примере должно быть
                                                              $data = json_decode($resp, true);
                                                              • 0
                                                                Добавил поддержку OAuth2 для ВКонтакте в django-social-auth: Довольно просто получилось. Единственный небольшой минус по сравнению с OpenAPI — 1 дополнительный вопрос к пользователю. Но как его избежать представляется с трудом.
                                                                • 0
                                                                  уже отключили

                                                                  Permission to perform this action is denied for non-standalone applications
                                                                  • 0
                                                                    извините, ошибся топиком

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