Пользователь
0,0
рейтинг
12 апреля 2011 в 17:26

Поддержка 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.
brainfucker @brainfucker
карма
53,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое

Комментарии (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 в реализации на порядок сложнее чем простенькая авторизация



                    • +1
                      А. Виджет. Ясно.
  • НЛО прилетело и опубликовало эту надпись здесь
    • 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
      извините, ошибся топиком

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