Как стать автором
Обновить

Авторизация Desktop приложения ВКонтакте

Время на прочтение 2 мин
Количество просмотров 6.8K
Социальная сеть ВКонтакте несколько странным образом заботится о безопасности своих пользователей, что чинит всяческие препятствия для авторизации отличными от браузера способами при этом не предоставляя SSL. Далее представлен скрипт на Ruby, который позволяет быстро подключить Desktop приложение к аккаунту по E-Mail и паролю и далее использовать API.

Данный скрипт не предназначен для «промышленного» использования и метод авторизации не является официальным и может измениться.

require 'net/http'

# Параметры (впишите свои)
app_id = '1234567' # ID приложения, присваивается при создании
email = 'mail@example.com'
password = 'qwerty'
app_rights = 16383 # Права приложения (16383 - полный доступ)

# Залогинивание и получение куки
resp = Net::HTTP.post_form(URI.parse('http://vk.com/login.php'),
                           {'m' => '1', 'email' => email, 'pass' => password})
cookies = resp.response['set-cookie']
remixsid = cookies.split('remixsid=')[1].split(';')[0].split(',')[0]

# Подключаемся снова к http://vk.com
header = { "Cookie" => 'remixsid=' + remixsid }
conn = Net::HTTP.new('vk.com', 80)

# Парсим форму авторизации приложения
resp = conn.get('http://vk.com/login.php?app=' + app_id +
                '&layout=popup&type=browser&settings=32767', header)
auth_hash = resp.body.split('var auth_hash = \'')[1].split('\';')[0]
rights_hash = resp.body.split('var app_settings_hash = \'')[1].split('\';')[0]

# Устанавливаем желаемые права
req = ''
mask = 1
14.times do
  if (app_rights & mask == 0)
    req += ('&app_settings_' + mask.to_s + '=0')
  else
    req += ('&app_settings_' + mask.to_s + '=1')
  end
  mask *= 2
end
resp = conn.get('http://vk.com/apps.php?act=a_save_settings&addMember=1' + req +
                '&hash=' + rights_hash + '&id=' + app_id, header)

# Авторизизуем приложение
resp = conn.get('http://vk.com/login.php?act=a_auth&app=' + app_id +
                '&hash=' + auth_hash + '&permanent=1', header)
auth_json = resp.body

# У нас есть параметры авторизации для API в JSON
puts auth_json  # Можно сделать что-то еще

В результате получаем ответ следующего вида:
{"mid":1000xxxxx,"sid":"xxxx6ed0xxxx2516xxxx49eacd0ec30f9961c01d30d15c3152e459xxxx",
"secret":"335xxxxxxx","expire":0}

Он был написан в один вечер для личных целей и не умеет работать с аккаунтами не привязанными к мобильному телефону, так как требуется ввод капчи. А также не обрабатывает возможные ошибки.
Вы можете его модифицировать под свои нужды как вам угодно, поскольку принцип ясен.
Как работать с API подробно описано здесь: vk.com/developers.php
Про права приложения написано там же. При получении формы авторизации было указано «settings=32767», то есть 2^n-1 такое, что все права заведомо не могут быть получены. На сегодня максимальным правам соответствует 16383, что в будущем может измениться.
P.S. Из заголовка убрано «простая авторизация», так как она относительно простая, но тривиальной ее назвать трудно.
Теги:
Хабы:
+2
Комментарии 5
Комментарии Комментарии 5

Публикации

Истории

Работа

Программист Ruby
15 вакансий
Ruby on Rails
17 вакансий

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн