Что значит авторизация в контакте

Давно хотелось написать какое-нибудь приложение, используя VK API. Решено было написать некий каркас, добавляя плагины к которому можно было бы реализовать какие-то мелкие задачи, которые нужны в данный момент: от скачивания музыки до банального поддержания аккаунта онлайн. Запускать данное творение планировалось как на сервере, так и на ПК. С проблемами, вставшими на моем пути во время разработки, включая озвученную в заголовке, я и хотел бы вас познакомить.

Шаг 0. Изучение документации

Итак, задача поставлена, теперь необходимо изучить платформу VK API. Ознакомившись с методами было замечено, что многие из них требуют получения access_token , или, проще говоря, авторизации пользователя.
  1. OAuth-авторизация
  2. Прямая авторизация
  3. Авторизация с использованием официального приложения (предоставляется в SDK)
Теперь подробнее о методах в порядке возрастания их полезности:
Авторизация с использованием официального приложения
Приложение состыковывается с официальным приложением для Android или iOS, которое дает ему интерфейс для взаимодействия с API.
Собственно, без комментариев, способ совсем для других платформ и задач.
OAuth-авторизация
Необходимо открыть страницу авторизации в браузере, где пользователь, если он еще не авторизован на сайте, введет свой логин и пароль и разрешит доступ к его аккаунту.
Этот способ не понравился сразу по двум причинам: во-первых, токен таким образом необходимо получать каждые 24 часа, во-вторых, для его получения нужно каждый раз заходить на сервер, открывать lynx, авторизовываться и разрешать доступ. Не очень удобно. Есть, конечно, такой вариант, но всё-таки решено было поискать что-то другое.
Прямая авторизация
Передача логина и пароля непосредственно GET-запросом на определенный URL. Токен в итоге получается бессрочный и без привязки по IP.
Идеально подходящий, казалось бы, способ, если бы не одно «но»:
Внимание! Доступ к этому типу авторизации может быть получен только после предварительного согласования с администрацией ВКонтакте.

Для подачи заявки на получение доступа Вам необходимо обратиться в службу поддержки по адресу vk.com/support , указав ID Вашего приложения.

В настоящий момент эта возможность предоставляется только для платформ, не поддерживающих стандартную авторизацию. В заявке необходимо кратко описать функционал приложения.


Объяснять, что пишу просто каркас для любой своей будущей идеи, думаю, было бессмысленно, поэтому пришлось искать какие-то обходные пути.

Шаг 1. Обходные пути

Расстроившись тем фактом, что простым смертным получить доступ к прямой авторизации достаточно сложно, я уже чуть было не похоронил свою идею.
Однако, в один прекрасный день, во время чтения ленты новостей в официальном приложении VK на планшете под управлением Windows 8, в голову пришла мысль: а почему бы не взять access_token из этого приложения, он ведь бессрочный и без привязки к IP. Ну, или еще круче, перехватить app_id и app_secret во время авторизации официального приложения. Всё бы ничего, если бы не авторизация, конечно же, по https протоколу.
Загоревшись идеей кражи app_id и app_secret пришла в голову еще одна идея — декомпилировать клиент и попробовать поискать там.
Сказано — сделано: наверняка metro-приложение VK написано на C#, значит нужно найти C# декомпилятор. Первым в Google нашёлся JetBrains dotPeek . Хорошо, попробуем.
Далее неплохо было бы найти само приложение VK. После не очень долгого поиска было выяснено, что metro-приложения в Windows 8.1 хранятся в скрытой папке C:\Program Files\WindowsApps.
Отлично! Пытаемся зайти и видим:

Мы, вроде бы, с правами администратора, нажимаем на «Продолжить»:

Весело, зайдём на вкладку «Безопасность», там нам предложат задать особые разрешения в «Дополнительно», зайдем в «Дополнительно»:

Поменяем владельца на себя, щелкнув на «Изменить», введя в диалоге свой email учетной записи microsoft, либо имя локального пользователя и щелнув на «Проверить имена». Сохраним всё это и теперь мы можем зайти в папку с нашими metro-приложениями. Ищем папку с VK, забираем оттуда VK.exe и скармливаем его нашему декомпилятору. Структура приложения видна для нас идеально, все названия функций и классов сохранились, недолгим гулянием по классам находим функцию Authorize, содержащую строку req, в которой есть два замечательных параметра:

Вуаля! client_id и client_secret наши.

client_id и client_secret для копирования

client_id=3697615
client_secret=AlVXZFMUqyrnABp8ncuU


Теперь мы можем авторизовываться, используя прямую авторизацию!
Попользовавшись данными client_id и client_secret мне все-таки стало интересно, что ответит поддержка на возможность их использования. После небольшой дискуссии был получен следующий ответ:

Интересная, конечно, позиция. Хорошо, расслабляемся и пользуемся.

Шаг 2. Собственно каркас

Желаемый каркас всё-таки был написан. В качестве языка программирования был выбран Python.
Состоит он из ядра и подключаемых плагинов. Ядро осуществляет авторизацию, работу с sqlite базой данных, импорт плагинов, опрос longpoll-сервера.
Плагины гибко взаимодействуют с ядром. О структуре плагина:
Чтобы ядро восприняло файл как плагин, в нем должна быть объявлена переменная:

Vkbuddyplugin__ = True
Для того, чтобы добавить параметры в конфиг-файл, плагину необходимо объявить переменную config_parameters :

Config_parameters = [ {"name": "parameter_name", # имя параметра "required": False, # bool, является ли параметр обязательным "description": "parameter_description", # описание параметра "default": "parameter_value", # значение параметра по умолчанию "typ": str}, # тип параметра... ]
Чтобы создать таблицы в БД (если они еще не существуют), необходимо объявить переменную sql_tables :

Sql_tables = [ {"name": "table_name", # имя таблицы "structure":(# структура таблицы: пары (имя столбца, тип столбца) ("id", int), ("column_name", float))}, ... ]
Также реализован набор стандартных хендлеров (добавить новые хендлеры можно и в плагинах, так уже реализован хендлер текстовых команд).

Стандартные хендлеры:

  • before_auth_handlers — функции вызываются перед авторизацией, с единственным параметром — основным объектом, в котором можно получить доступ к VK API, хоть это и бесполезно перед авторизацией
  • after_auth_handlers — функции вызываются после авторизации, с тем же единственным параметром
  • exit_handlers — функции вызываются перед выходом, так же с единственным параметром
  • longpoll_handlers — функции вызываются при получении сообщения от longpoll-сервера, параметров здесь много, что они значат можно посмотреть в документации по VK API: (vkbuddy, code, msgid, flags, from_id, ts, subj, text, attachments)
На github можно ознакомиться с результатом, примерами плагинов и прочим, а также поучаствовать в разработке.

Спасибо за внимание!

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


Заходим на сайт сервиса VKApi: vkapi.zf-projects.ru и проходим авторизацию через любой аккаунт ВКонтакте, от которого у вас имеется логин или пароль. Как только закончили, открываем Cookie Manager. Справа в окне Domains ищем сайт vkapi.zf-projects.ru и кликаем на него. Затем в центре в окне Cookies находим строку с заголовком token и кликаем, после чего справа, ищем поле Value , удаляем из него токен от текущего аккаунта (с которого авторизовались) и вставляем токен от аккаунта, на который нужно зайти. Сохраняем изменения кнопкой Save (дискетка). Готово! После обновления страницы на VKApi произойдёт переавторизация на новый аккаунт!
Заключение
В заключение хочу добавить, что для авторизации в самом ВКонтакте одного лишь акцесса недостаточно. Но его более чем достаточно, чтобы читать и отправлять сообщения, просматривать и оценивать фотографии, прослушивать музыку и много другое при помощи сервисов APIdog и VKApi.

Продолжаем просвещать новичков. На этот раз затронем тему программирования. Программировать будем на php авторизацию вконтакте .

Рассмотрим возможные способы авторизации вконтакте на php .
Зачем может понадобиться авторизация вконтакте? Впринципе каждый решает сам. Для тех, кто совсем не может предположить зачем входит вконтакт с помощью php, подскажу – можно, к примеру отправить сообщение, вставить рисунок вместо графити или добавить кучу фоток в свой аккаунт.
Хватит лишних слов, переходим непосредственно к способам авторизации .

Способ 1. Отправляем обычный http get-запрос к серверу авторизации контакта login.vk.com и получаем в ответ идентификатор сессии:

$login = "ваше@мыло"; $pass = "password"; $ans = file_get_contents("http://login.vk.com/?email={$login}&pass={$pass}" . "&act=login&to=&from_host=m.vkontakte.ru&pda=1"); $sid = substr($ans, strpos($ans, ""s" value="")+11, 60); echo $sid;

Теперь, чтобы получить страницу, доступную только авторизованным пользователям можно воспользоваться этим кодом:

$cookie = "remixsid=" . $sid; $ch = curl_init("http://m.vkontakte.ru/"); curl_setopt($ch, CURLOPT_COOKIE, $cookie); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $answer = curl_exec($ch); curl_close($ch);

В итоге в переменной $answer будет содержимое страницы. Можете делать с ним все что нужно

Здесь будет немного больше кода, но эффект будет аналогичным – мы получим версию страницы, доступную после авторизации вконтакте.

Привожу сразу код с пояснениями:

$user_agent = "Mozilla/5.0 (Windows; U; Windows NT 6.0; ru; rv:1.9.2.13) " . "Gecko/20101203 Firefox/3.6.13 (.NET CLR 3.5.30729)"; $cookie = ""; $login = "ваше@мыло"; $password = "пароль"; $ch = curl_init(); // true т.к. мы будем отправлять post запрос: curl_setopt($ch, CURLOPT_POST, true); // чтобы сайт думал, что мы - браузер: curl_setopt($ch, CURLOPT_USERAGENT, $user_agent); // ответ сервера будем записывать в переменную curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 10); // по редиректам будем переходить автоматически. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_URL, "http://login.vk.com/?act=login"); //Формирование запроса таким образом, я счел более наглядным $post = array("act" => "login", "q" => "", "al_frame" => "1", "expire" => "", "captcha_sid" => "", "captcha_key" => "", "from_host" => "vkontakte.ru", "email" => $login, "pass" => $password); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post)); $answer = curl_exec($ch); /* В $answer нам приходит javascript, который и устанавливает куки с названием: remixsid Нам нужно cпарсить эти 60 символов, идентификатора сессии. с помощью них vkontakte поймет, что мы авторизировались.*/ $sid = substr($answer, strpos($answer, "setCookieEx("sid", "") + 20, 60); $cookie = "remixsid=" . $sid; curl_setopt($ch, CURLOPT_POST, false); curl_setopt($ch, CURLOPT_COOKIE, $cookie); // укажем страницу, с которой мы получим данные для проверки curl_setopt($ch, CURLOPT_URL, "http://vkontakte.ru/"); $answer = curl_exec($ch); echo $answer; curl_close($ch);

В переменной $answer окажется содержимое страницы. С ним также вы можете делать все что вам угодно

Для чего этого необходимо? Для вызова некоторых функций Вконтакте, которые не доступны через API Вконтакте, или из-за существующий ограничений.

Раньше достаточно было отправить GET запрос на http://login.vk.com/?act=login передав параметры &email=*** (логин) и &pass=*** (пароль). С недавних пор авторизация не происходит, вместо этого производится переадрессация по адресу:

Http://vk.com/login.php?&to=&s=0&m=1&email=

Решение

Для того, чтобы произвести авторизацию необходимо отправить запрос на авторизацию по адресу https://login.vk.com/?act=login . Для этого нужно использовать POST запрос, в котором кроме логина и пароля необходимо указать следующие параметры:

Act: login role: al_frame ip_h: lg_h: email: <логин> pass: <пароль> expire: captcha_sid: captcha_key: _origin: http://vk.com q: 1

1. С помощью CURL открываем http://vk.com и парсим значения ip_h и lg_h . Простенькие регулярки будут иметь вид:

Preg_match("//i", $vk_html, $ip_h); preg_match("//i", $vk_html, $lg_h)

2. Передаем полученные значения вместе с остальными параметрами POST запросом на url https://login.vk.com/?act=login . В итоге запрос будет иметь приблезительно такой вид:

Https://login.vk.com/?act=login&ip_h=***&lg_h=***&role=al_frame&email=***&pass=***&expire=&captcha_sid=&captcha_key=&_origin=http://vk.com&q=1

3. Сохраняем куки в файл и вызываем необходимую страницу Вконтакте для парсинга, например https://vk.com/feed?section=photos

Curl_setopt($ch, CURLOPT_COOKIEJAR, "cookies.txt"); curl_setopt($ch, CURLOPT_COOKIEFILE, "cookies.txt");

Проделайте предварительно п.1 и п.2 вручную чтоб убедится что все работает, получив предварительно значения ip_h и lg_h через исходный код страницы (комбинация Ctrl+U в браузере). В результате вас должно перенаправить на пустую страницу, а в адресной строке должно содержатся некое значение __q_hash .

Здравствуйте, дорогие друзья! Как-то недавно мне потребовалось сделать на одном из своих сайтов вход через «вконтакте». Это очень удобно, так как нет необходимости в регистрации на самом сайте, а сразу же пользоваться всеми его возможностями со своего аккаунта «вконтакте». Пришлось вникать в тонкости для осуществления этой задачи. Кстати, к слову сказать, в самой официальной документации по ВК API написано немного, да и всё очень запутано.

Итак, для того чтобы начать пользовать ВК API, нам нужно создать новое приложение «Вконтакте». Делаем это так: переходим по ссылке: http://vk.com/editapp?act=create , выбираем «веб-сайт», вводим имя нашего приложения, а также адрес сайта, к которому оно привязано и базовый домен нашего сайта.

После создания, нам стали известны ID нашего созданного приложения, а также секретный код, который потому и «секретный» что не стоит его публиковать, следовательно ниже написанный id и secret code вымышленные.:)

ID: 3328234
Secret Code: Q5f2PSwkiFw23TysdDgr

Теперь начинаем «кодить». Создаём файл «vklogin.php», например, в корне сайта. А шаблон или код вставляем следующую ссылку:

https://oauth.vk.com/authorize?client_id=3328234&scope=1&redirect_uri=http://www.mydomain.ru/vklogin.php&response_type=code

Это может быть текстовая ссылка на сайте, ссылка-картинка или даже переадресация из js скрипта. Главное, что нажав на неё, пользователь перешёл по этом адресу. Теперь о передаваемых параметрах: client_id – это идентификатор нашего приложения ВК, redirect_uri – адрес на нашем сайте, куда будет переадресован пользователь, после получения прав «Вконтакте», response_type – это тип авторизации, который в нашем случае с использование кода. После перехода по данной ссылки, пользователь увидит следующую страницу сайта «Вконтакте»:


После того как пользователь нажмёт «Разрешить», тем самым делегирует права вашему сайту, он будет переадресован на наш скрипт «vklogin.php». Далее привожу сам скрипт, пояснение позже.

‹?php $VK_APP_ID = "3328234"; $VK_SECRET_CODE = " Q5f2PSwkiFw23TysdDgr "; if(!empty($_GET["code"])) { $vk_grand_url = "https://api.vk.com/oauth/access_token?client_id=".$VK_APP_ID."&client_secret=".$VK_SECRET_CODE."&code=".$_GET["code"]."&redirect_uri=http://www.mydomain.ru/vklogin.php"; // отправляем запрос на получения access token $resp = file_get_contents($vk_grand_url); $data = json_decode($resp, true); $vk_access_token = $data["access_token"]; $vk_uid = $data["user_id"]; // обращаемся к ВК Api, получаем имя, фамилию и ID пользователя вконтакте // метод users.get $res = file_get_contents("https://api.vk.com/method/users.get?uids=".$vk_uid."&access_token=".$vk_access_token."&fields=uid,first_name,last_name,nickname,photo"); $data = json_decode($res, true); $user_info = $data["response"]; echo $user_info["first_name"]." ".$user_info["last_name"]."
"; echo "‹img .$user_info["photo"]."" border="0" /›"; } ?›

Итак, с переменными ID и Sercet Code думаю всё ясно. Далее проверяем, передали ли нам ВК при редиректе параметр «code», который мы добавляем во вновь созданный url и опять обращаемся к «контакту», но уже напрямую из нашего скрипта. Для этого используем функцию «file_get_contents».

На данном этапе, следует заострить внимание на нескольких важных замечаниях:

1. Данный код врят-ли получится тестировать на локальном сервере(например, на «Дервере»), а также, на используемом сервере, в настройка php.ini, директива «allow_url_fopen» должна быть установлена в «1».
2. На используемом сервере должен быть установлено расширение json для PHP.
3. И самое коварное, на чём я споткнулся. Параметры «redirect_uri» в обоих запросах к API, должны быть абсолютно одинаковыми.

Осталось только упомянуть о самой работе с ВК API. Как вы заметили, после второго запроса к ВК, мы получили параметры «access_token» и «user_id». На данном этапе мы уже авторизированны на ВК и можем обращаться к API, используя 2 эти переменные.

В последнем запросе к ВК API, мы используя метод «users.get», получаем имя пользователя ВК, фамилию, а также ID пользователя и просто выводим их. Для конкретной реализации логина на сайте через ВК, всё зависит от используемой CMS. Если у Вас собственноручно написанная CMS, вы может поступить следующий образом. Например, сохранять ID пользователя в сессионных переменных $_SESSION[‘vk_id’] и $_SESSION[‘vk_login’] предварительно обнулив первую. И проверят авторизацию пользователя по значению «vk_id».

Более подробно, о работе с ВК API вы сможете прочитать, по следующим ссылкам:

Официальная документация по ВК API.