Схема авторизации вконтакте

Discussion in 'Социальные сети' started by Kairos, 25 May 2011.

  1. Kairos

    Kairos Elder - Старейшина

    Joined:
    5 Oct 2009
    Messages:
    37
    Likes Received:
    21
    Reputations:
    21
    Относительно недавно контакт обновил схему авторизации на более приличную. Сейчас расскажу как она устроена :)

    Первым делом мы отправлем запрос:
    Code:
    http://login.vk.com/?act=login&q=1&al_frame=1&from_host=vkontakte.ru&[B]email=мыло@mail.ru&pass=пароль[/B]
    В ответ мы всегда получаем редирект (заголовок Location). Дальше возможны несколько вариантов:


    1. Логин успешен
    В ответ получаем куки l и p для домена login.vk.com (дальше объясню что это) + редирект (заголовок Location) на vkontakte.ru с параметром hash
    Code:
    http://vkontakte.ru/login.php?act=slogin&al_frame=1&[B]hash=96d63a936733f13fe286b0cd5114873d[/B]&s=1
    при переходе по редиректу в ответе контакт установит куки remixsid.


    2. Контакт хочет капчи
    Если в ответе есть параметр sid, значит контакт требует капчу.
    Code:
    http://vkontakte.ru/login.php?act=slogin&al_frame=1&[B]sid=237888803913[/B]&dif=0&email=мыло@mail.ru
    Дальнейшие действия такие:

    a. качаем картинку
    Code:
    http://vkontakte.ru/captcha.php?s=1&sid=237888803913
    b. пытаемся залогиниться с дополнительными параметрами captcha_sid и captcha_key
    Code:
    http://login.vk.com/?act=login&q=1&al_frame=1&from_host=vkontakte.ru&email=мыло@mail.ru&pass=пароль&[B]captcha_sid=237888803913&captcha_key=буквы[/B] 
    3. Аккаунт невалидный
    В этом случае мы получаем редирект типа
    Code:
    http://vkontakte.ru/login.php?m=1&email=мыло%40mail.ru
    В нем нет ни hash ни sid.


    Куки remixsid, l и p.
    Давайте посмотрим какая между ними разница. Куки remixsid ставятся для домена vkontakte.ru и используются для всех действий с ВК. Но у них есть один минус – при смене ip они становятся недействительны. В этом случае при любом запросе вместо ожидаемого ответа вы получите редирект
    Code:
    http://login.vk.com/?fast=1&from_host=vkontakte.ru&to=bG9jYWpob3N0
    При переходе по этому редиректу login.vkontakte.ru проверяет наличие куков l и p. Они, в отличие от remixsid, не привязаны к ip адресу, они привязаны только к логину и паролю (отсюда и название). Дальше все происходит так как описано выше, но с одной особенностью – при попытке логина по кукам l и p никогда не бывает капчи, то есть возможны только варианты 1 и 3. Так что рекомендую их запоминать и авторизоваться всегда по кукам.



    Бонус
    У контакта все еще работает старый способ авторизации в 1 запрос:
    Code:
    http://vkontakte.ru/login.php?act=login&email=мыло@mail.ru&pass=пароль
    Этот способ проще, но с ним сложнее отличить невалидный акк от запроса на капчу. Более детально можете изучить сами.
     
    #1 Kairos, 25 May 2011
    Last edited: 25 May 2011
  2. CyberStorm

    CyberStorm Member

    Joined:
    25 Feb 2006
    Messages:
    4
    Likes Received:
    11
    Reputations:
    -4
    делаем перед авторизацией запрос
    Code:
    http://vkontakte.ru/login.php?op=a_login_attempt
    если в ответе есть упоминанием капчи -- парсим айди капчи,скачиваем, и отправляем этот же запрос с captcha_sid и captcha_key,а потом уже производим авторизацию ;)



    вроде как уже несколько месяцев.. :D
     
  3. Kairos

    Kairos Elder - Старейшина

    Joined:
    5 Oct 2009
    Messages:
    37
    Likes Received:
    21
    Reputations:
    21
    Проблема с многопоточностью:
    1 поток сделал a_login_attempt и получил добро (vklogin)
    2 поток быстренько почекал невалидов и схлопотал капчу
    1 поток пытается залогиниться, ничего не выходит, и он решает что акк невалидный.


    Несколько месяцев назад вроде вариант с капчей был как раньше - через a_login_attempt и только потом login.vk.com.
     
    #3 Kairos, 25 May 2011
    Last edited: 25 May 2011
  4. CyberStorm

    CyberStorm Member

    Joined:
    25 Feb 2006
    Messages:
    4
    Likes Received:
    11
    Reputations:
    -4
    ну дак, a_login_attempt надо делать перед каждой авторизацией,а не при старте потока (или я чего то не понял? :) )
     
  5. Kairos

    Kairos Elder - Старейшина

    Joined:
    5 Oct 2009
    Messages:
    37
    Likes Received:
    21
    Reputations:
    21
    Потоки работают неравномерно. Каждый поток делает
    Code:
    цикл
    {
      1. a_login_attempt
      2. авторизация
    }
    
    но может случиться так, что второй поток почекает невалидный акк между этими действиями первого потока.
     
  6. CyberStorm

    CyberStorm Member

    Joined:
    25 Feb 2006
    Messages:
    4
    Likes Received:
    11
    Reputations:
    -4

    аааа, вот о чём ты :)
    да, теоретически такая ситуация может случиться.
     
  7. Kairos

    Kairos Elder - Старейшина

    Joined:
    5 Oct 2009
    Messages:
    37
    Likes Received:
    21
    Reputations:
    21
    Если потоков много, то очень часто происходит на практике. Причем с этим сложно что-то сделать. Если поток между этими действиями будет блокировать остальные то получится фактически однопоточно (самое долгое это делать запросы к сети). Чекать невалидные по 2 раза плохо - расход капчи сильно увеличится. Раньше чтобы такой фигни не случалось приходилось durov.ru использовать.
     
  8. voxtel

    voxtel New Member

    Joined:
    22 Apr 2010
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    жалко что когда залогинен.нет возможности перелогиниться
     
  9. Kairos

    Kairos Elder - Старейшина

    Joined:
    5 Oct 2009
    Messages:
    37
    Likes Received:
    21
    Reputations:
    21
    Как это нет?
     
  10. slva2000

    slva2000 New Member

    Joined:
    20 Nov 2009
    Messages:
    42
    Likes Received:
    2
    Reputations:
    0
    Вариант запроса когда ВК просит проверку по номеру телефона (четыре посл. цифры):

    PHP:
        if(stristr($response"телефона, к которому привязана"))
        {
            
    $tel_code 'xxxx' // 4 посл. цифры телефона
            
    preg_match("#to: '(.+?)'.*?hash: '(.+?)'#is",$response,$match);
            
    $post_d = array('al'=>'1','act'=>'security_check','code'=>$tel_code,'to'=>"$match[1]",'al_page'=>'2','hash'=>"$match[2]");
            echo 
    sendPost"http://vkontakte.ru/login.php"$post_d);
        }
    Это проверка вылазит когда регион в профиле не соответствует "гео IP".

    ЗЫ: для ленивых можно просто в CURL использовать опцию:
    PHP:
    curl_setopt($chCURLOPT_INTERFACE'ANY_YOUR_REGION_IP'); 
     
  11. Flashlight

    Flashlight Member

    Joined:
    26 Jun 2009
    Messages:
    0
    Likes Received:
    7
    Reputations:
    0
    Интересная инфа, спасибо.
     
  12. -=Oleg@t0r=-

    -=Oleg@t0r=- New Member

    Joined:
    23 Nov 2011
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    Доброго времени суток!
    Скажите, этот вариант еще актуален?

    Я использую ViKing.Engine, отправляю запрос
    Code:
    http://login.vk.com/?act=login&q=1&al_frame=1&from_host=vkontakte.ru&email=мыло@mail.ru&pass=пароль
    В ответ получаю
    (*** - хэш)

    Далее при переходе по редиректу
    Вроде всё ок, но при следующих запросах на страницы контакта получаю редирект
    Что это значит? Переход по этому редиректу ничего не меняет..
     
  13. azzzi

    azzzi New Member

    Joined:
    18 Aug 2010
    Messages:
    0
    Likes Received:
    3
    Reputations:
    1
    теперь до 4 редиректов выдает домен, при авторизации. надо просто проходить по редиректу по успешной авторизации :)

    ставь в цикл проверку на 302
     
  14. -=Oleg@t0r=-

    -=Oleg@t0r=- New Member

    Joined:
    23 Nov 2011
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    4 раза прошел по редиректу на https://login.vk.com и все равно на 5 опять Location на https://login.vk.com/?fast=1&from_host=vk.com&from_protocol=http&ip_h=
     
    #14 -=Oleg@t0r=-, 5 Mar 2012
    Last edited: 5 Mar 2012
  15. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,581
    Likes Received:
    1,317
    Reputations:
    1,557
    Совсем не ок
    Set-Cookie: remixsid=***; expires=Sat, 09-Mar-2013 04:56:45 GMT; path=/; domain=.vkontakte.ru
     
  16. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,581
    Likes Received:
    1,317
    Reputations:
    1,557
    Не забывайте про переезд ВК на vk.com

    Как минимум
    http://login.vk.com/?act=login&q=1&al_frame=1&from_host=vk.com&email=мыло@mail.ru&pass=пароль

    Но желательно еще ip_h (он же ip_hash) парсить.
     
    #16 M_script, 5 Mar 2012
    Last edited: 5 Mar 2012
  17. -=Oleg@t0r=-

    -=Oleg@t0r=- New Member

    Joined:
    23 Nov 2011
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    Вроде получилось! Я просто уже туплю к вечеру.. Переходил по редиректу на логин а потом снова слал запрос на страничку вместо перехода по редиректу от login.vk.com... :mad:
    Всем большое спасибо за ответы!
    P.S: а зачем парсить? Могут еще какие то проблемы возникнуть?
     
  18. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,581
    Likes Received:
    1,317
    Reputations:
    1,557
    Ничего серьезного. Максимум, что может случиться - бан всех аккаунтов.
     
  19. -=Oleg@t0r=-

    -=Oleg@t0r=- New Member

    Joined:
    23 Nov 2011
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    Можно про это подробнее узнать где нибудь?
     
  20. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,581
    Likes Received:
    1,317
    Reputations:
    1,557
    При авторизации пользователя через браузер отправляется запрос A. При авторизации аккаунта через программу отправляется запрос B, отличающийся от запроса A.
    Логично, что все пользователи, авторизовавшиеся с помощью запроса B используют программы (что запрещено правилами ВК) или аккаунты были взломаны. Ничто не мешает забанить сразу все аккаунты, авторизующиеся запросом B, честным юзерам это не повредит.