Поддержка 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.
+99
12 апреля 2011, 17:26
149

комментарии (89)

+10
mark_ablov #
не прошло и года :)
+17
SovGVD #
а мне кажется прошло
0
mark_ablov #
на самом деле вменяемый драфт, по которому можно уже было реализовать этот протокол, появился в середине прошлого года. А финальная версия пару месяцев назад.
Но главное то, что некоторые крупные сайты ввели это в начале этого года, а вконтакте очнулся только спустя 2-3 месяца, что не очень.
0
johny #
Финальная версия так и не появилась.
Постоянно приходится перечитывать протокол и находить в нем изменения.
Последний драфт от 6 апреля, версия 15 (draft-ietf-oauth-v2.0-15)
0
antonsnowy #
Лучше поздно, чем последними. OAUTH это хорошо, теперь остались только Одноклассники (Мой Мир уже поддержал).
0
massbeat #
Одноклассники запустили OAuth 2.0 в начале марта.
+4
ilya_compman #
Они молодцы!
+2
rhangelxs #
Если бы своих костылей в виде OpenAPI не писали, были бы еще большими молодцами)
+3
igrishaev #
Очень хорошо, а то их велосипеды были жалким подобием.
+6
acmer #
Свершилось чудо!!!
+4
sajgak #
Наконец то. Только чувствую, какой то подвох таки будет… они не могут сделать все хорошо
+4
4pcbr #
могут
+1
sajgak #
дай бог если вы правы, если же нет, то это десятки безсонных ночей работы с их велосипедами, а потом полное разочаровние в том, что они опять все поменяют
+1
sonnix #
кстати, вчера только задумался над тем — почему ВК не сделали еще OAuth… бывает же:)
+1
rule #
OAuth != OAuth2
+2
sonnix #
спасибо К.О., я имел ввиду способ авторизации, а не версию протокола :)
+1
devosx #
И что теперь можно через стандартные либы OAuth использовать еще и vk? Интересует пример на питоне.
0
mamantoha #
У меня не получилось получить access_token из примера facebook.
0
lorien #
У меня сегодня получилось работать с oauth v.2 и с facebook и с vkontakte
Я пишу django-приложение для авторизации через социальные сети: bitbucket.org/lorien/django-xauth/src
Вот работа с oauth2: bitbucket.org/lorien/django-xauth/src/fbb5cb33026a/xauth/service/oauth2/views.py
Для работы с oauth v.2 я использовал следующую библиотеку: github.com/ryanhorn/tyoiOAuth2
0
reket #
Ошибка client_secret='+$secret);
0
BiSeTrojanov #
И когда же наконец сделают OpenID?
+6
mezhevikin #
а зачем OpenID если есть oAuth?
0
4pcbr #
У этих протоколов разное назначение: OAuth преимущественно для авторизации клиента, передающего данные. OpenID — для унификации авторизации
0
HeadFore #
Сейчас большинство сайтов, поддерживающих OpenID, сделали поддержку входа через соц. сети, так что OpenID уже не станет таким популярным, как мог быть.
0
4pcbr #
Это правда. OpenID в реализации на порядок сложнее чем простенькая авторизация, а смысл тот же
+1
matiouchkine #
Это вы зачем людей в заблуждение вводите?

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

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

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



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

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

Быть может, вы об авторизации через ява-апплеты какие-нибудь говорите?
0
barker #
Нет, для десктоп-приложений была трёхступенчатая авторизация через перезагрузку страниц, с яваскриптом и куками. Подразумевалось, что мобильное приложение должно просто открыть эту страницу во встроенном браузере и потом им полагалось как-то управлять ещё. Что вообще малореально. В мобилах и правда были большие проблемы с этим. Приходилось выкручиваться или через эмуляцию этих костылей через http-запросы или выносить авторизацию наружу приложения куда-нибудь.
–1
mezhevikin #
еще мне кажется в статье не казан важный момент:

Чтобы упростить доступ к API для Flash/IFrame-приложений мы добавили ключ access_token в набор параметров FlashVars/GET. Его можно использовать для вызова методов API по новой схеме.


Это получается теперь можно использовать в iframe приложениях обращения с сервера к методам которые раньше были доступны только с клиентской стороны.

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

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

Но с «wall.post» проблема пока актуальна. :)
+1
sha1dy #
Имя то хоть можно вытащить?
0
stand_up #
Да, значения uid, first_name и last_name возвращаются всегда, вне зависимости от выбранных полей и их количества. Для вытягивания остальных значений необходим access_token и список полей, которые хочешь вытянуть. В другой ветке я описал, что это был мой бок, нужно всегда передавать список полей, которые тебя интересуют.
0
CrashMax #
А вы не знаете, можно получить ленту новостей для стороннего сайта?
0
seriyPS #
что получить?
0
CrashMax #
Ну ленту, ту которую мы видим нажав на ссылку «Новости».
0
seriyPS #
Вообще это метод 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
CrashMax #
Спасибо за ответ. Я хочу выводить ленту у себя на сайте. Когда я смотрел, и если я правильно понял (это было прим. месяц назад), то этот метод может использовать или программа или моб. клиент, но не сторонний сайт. Вот тут и хотелось бы уточнить, ошибаюсь ли я?
Может быть у вас по опыту работы с api vk есть какой то свой способ вытащить новости друзей, если официальным методом этого сделать нельзя?
0
seriyPS #
Да, есть загвоздка, что токен API привязан к IP адресу с которого происходит авторизация (с которого открывается браузер и нажимается кнопка «разрешить» в веб-интерфейсе).
Так что с сервера, как я понял, без хаков этого не сделать…
Так что либо пишем проксик и запускаем на сервере чтоб IP совпадали либо парсим форму авторизации (но я этого не пробовал ибо у меня десктоп-клиент)
Но я могу и ошибаться на самом деле…
0
CrashMax #
Хорошо спасибо большое.

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


А с остальными нормально
0
seriyPS #
У меня вот такие параметры:
      "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
dezo #
То, чего так долго ждали, наконец-то!
0
darkolorin #
Слава богам, наконец-то смогу использовать без проблем в мобильных приложениях.
+1
KiriKiri #
А можно ли как-то через OAuth разлогинить пользователя?
–4
matiouchkine #
Это противоречит идеям монетизации.
0
KiriKiri #
Извините, я не в курсе. Почему это противоречит идеям монетизации?
–5
matiouchkine #
А зачем давать разлогинить пользователя без нужды? Чтобы он более ничего купить не мог?
0
KiriKiri #
Например если данным приложением будет пользоваться большое количество человек.
0
matiouchkine #
Я как бы отвечаю, почему метода нет в API. Все претензии — в администрацию вконтакта.
0
seriyPS #
В смысле разлогинить? На своем сайте или сайте-провайдере?
0
XProger #
Я прошёл через полгода ожидания в страхе того, что html/js код страниц авторизации может измениться в любой момент. Господа веб-разработчики реально верят в то, что неотъемлемой частью любого desktop/mobile приложения является веб-браузер? >_<
0
KiriKiri #
При работе в AIR к сожалению, выхода другого не вижу (. Приходится плясать с бубном и боятся изменений формы авторизации.
0
UksusoFF #
У них бы еще саппорт нормальный появился, в который раз отклоняют приложение с формулировкой «Приложение не соответствует уровню в контакте» без объяснения причин, и на комментарии не отвечают… Плюс к этому еще и голоса не вернули, которые:
Размещение приложений и их одобрение бесплатны. Однако, в связи с большим количеством заявок на проверку приложений, взятых со сторонних сайтов, для отправки приложения на проверку необходимо внести залог в 10 голосов.
–1
Enrey #
Наконец-то можно будет сделать нормальную внебраузерную авторизацию, ура!
–1
XProger #
Это каким таким образом?
+1
mamantoha #
Браузер все равно нужен что бы вводить логин/пароль и давать права для приложения. Так что нет, не получится…
+1
seriyPS #
Вот. Только что перенес код плагина VKontakte для Gwibber на новую ваторизацию. Получилось довольно мало изменений. Кому интересно — вот DIFF.
По впечатлениям — вроде проще стало и аккуратнее и логичнее чтоли. Хотя на пару недочетов наткнулся + документация запутанная. Так, например, страница для редиректа по-умолчанию для десктоп-приложений api.vkontakte.ru/blank.html не имеет title и в python-webkit не срабатывает событие «title-changed». Приходится эту vkontakte.ru/api/login_success.html использовать пока.
0
bulbazaur #
а кроме как title-changed никак нельзя прослушать, что страница изменена?
0
seriyPS #
Ох… Может и можно, но это самый простой вариант и в Gwibber везде именно он используется. Я, честно говоря, не помню)))

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

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

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

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