Поддержка 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.

    Similar posts

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 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?
                      • UFO just landed and posted this here
                          0
                          У этих протоколов разное назначение: OAuth преимущественно для авторизации клиента, передающего данные. OpenID — для унификации авторизации
                            0
                            Сейчас большинство сайтов, поддерживающих OpenID, сделали поддержку входа через соц. сети, так что OpenID уже не станет таким популярным, как мог быть.
                              0
                              Это правда. OpenID в реализации на порядок сложнее чем простенькая авторизация, а смысл тот же
                                +1
                                Это вы зачем людей в заблуждение вводите?

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

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

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



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

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

                                  Быть может, вы об авторизации через ява-апплеты какие-нибудь говорите?
                                    0
                                    Нет, для десктоп-приложений была трёхступенчатая авторизация через перезагрузку страниц, с яваскриптом и куками. Подразумевалось, что мобильное приложение должно просто открыть эту страницу во встроенном браузере и потом им полагалось как-то управлять ещё. Что вообще малореально. В мобилах и правда были большие проблемы с этим. Приходилось выкручиваться или через эмуляцию этих костылей через http-запросы или выносить авторизацию наружу приложения куда-нибудь.
                                • UFO just landed and posted this here
                                    0
                                    Нет, имеется в виду, что можно использовать новый формат запросов используя access_token
                                    • UFO just landed and posted this here
                                      +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
                                                                      извините, ошибся топиком

                                                                    Only users with full accounts can post comments. Log in, please.