2015-09-17 3 views
1

У меня проблема с двухэтапной авторизацией с Oauth в PHP.Параметры зависания курсора Curl Catch - Oauth 2.0 Авторизация PHP-скрипт для запроса API (например, VK)

Первый запрос, как:

$ AUTHORIZE_URL = 'https://oauth.vk.com/authorize?client_id=myID&scope=MyWall&redirect_uri=https://oauth.vk.com/blank.html&response_type=code';

Этот запрос перенаправляет https://oauth.vk.com/blank.html с параметром "# code = Anumber".

После этого у меня есть второй запрос, которому нужен этот код.

Я использую Curl, чтобы выполнить эти запросы и проанализировать результат Json второго, но как я могу получить параметры перенаправления url в curl.

Я попытался разобрать заголовок ответа, но не нашел места.

EDIT:

Пример кода моего запроса:

curl_setopt_array($ch = curl_init(), array(
    CURLOPT_USERAGENT => '', 
    CURLOPT_RETURNTRANSFER => true, 
    CURLOPT_FOLLOWLOCATION => false, 
    CURLINFO_REDIRECT_URL => true, 
    CURLOPT_BINARYTRANSFER => 1, 
    CURLOPT_URL => $url 
)); 
curl_exec($ch); 
$info=curl_getinfo($ch); 
prin_r($info); 
curl_close($ch); 
+0

Можете ли вы разместить код, в котором вы делаете запрос на завивание? – Sinjuice

+0

Да, я просто сделал это –

ответ

0

Хорошо, проблема в том, что вы не вошли в систему, если вы вошли в систему аутентификации OAuth перенаправляет на пустую страницу с ваш код, но если вы этого не сделаете, нет НИКАКОГО REDIRECT и он покажет вам html-страницу с логином.

Для того, чтобы получить этот код, вы должны войти в систему, вы можете войти в систему, используя свой браузер, а затем получить куки-файлы из своего браузера и использовать их в своем коде. Эта опция хороша, если вам нужен только этот код для тестирования.

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

<?php 
$email = "myemailorphone"; 
$pass = "mypassword"; 
$id = "myID"; 
//this url returns a login page 
$url= "https://oauth.vk.com/authorize?".http_build_query(["client_id"=>$id,"scope"=>"MyWall","redirect_uri"=>"https://oauth.vk.com/blank.html","response_type"=>"code"]); 

$b64url = str_replace("==","--",base64_encode($url)); //different base64 code, just to have all parameters 
$ch = curl_init($url); 
curl_setopt($ch, CURLOPT_HEADER, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
//curl_setopt($ch,CURLOPT_NOBODY,true); 
curl_setopt($ch, CURLOPT_USERAGENT,"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.85 Safari/537.36"); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
$result = curl_exec($ch); 
curl_close($ch); 
$cookieString = ""; 
if(strpos($result,"log in")) { 

    //get all the cookies 
    preg_match_all('/^Set-Cookie:\s*([^;]*)/mi', $result, $matches); 
    $cookies = array(); 
    foreach($matches[1] as $item) { 
     parse_str($item, $cookie); 
     $cookies = array_merge($cookies, $cookie); 
    } 
    $cookieString = ""; 
    foreach($cookies as $key=>$val){ 
     $cookieString .= $key."=".$val.";"; 
    } 
    //CREATE LOGIN POST 
    $ip_h = explode("name=\"ip_h\" value=\"",$result); 
    $ip_h = substr($ip_h[1],0,18); // some hidden fields on that page, maybe important 
    $lg_h = explode("name=\"lg_h\" value=\"",$result); 
    $lg_h = substr($lg_h[1],0,18); // some hidden fields on that page, maybe important 
    $fields = [ 
        "origin"=>"https://oauth.vk.com", 
        "to"=>$b64url, // this is where it redirects after login, not used in the php code but, just for the request 
        "email"=>$email,//phone or email of user 
        "expire"=>0, 
        "pass"=>$pass, //your password 
        "ip_h"=>$ip_h, 
        "lg_h"=>$lg_h 
       ]; 

    $post = http_build_query($fields); 

    $login_url = "https://login.vk.com/?act=login&soft=1"; 

    $ch = curl_init($login_url); 
    curl_setopt($ch, CURLOPT_HEADER, true); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post); 
    curl_setopt($ch, CURLOPT_POST, 1); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Cookie: '.$cookieString)); 
    curl_setopt($ch, CURLOPT_USERAGENT,"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.85 Safari/537.36"); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 

    //get the new cookies 
    $result = curl_exec($ch); 
    preg_match_all('/^Set-Cookie:\s*([^;]*)/mi', $result, $matches); 
    $login_cookies = array(); 
    foreach($matches[1] as $item) { 
     parse_str($item, $cookie); 
     $login_cookies = array_merge($login_cookies, $cookie); 
    } 
    foreach($login_cookies as $key=>$val){ 
     $cookieString .= $key."=".$val.";"; 
    } 
    //get next location redirect 
    preg_match_all('/^Location:\s*(.*)/mi', $result, $matches); 
    $first_redirect = str_replace("\"","_",$matches[1][0]); 
    $first_redirect = filter_var($first_redirect,FILTER_SANITIZE_URL); //sanitize url, because it returns unwanted chars 

    //use the second location redirect 
    $ch = curl_init($first_redirect); 
    curl_setopt($ch, CURLOPT_HEADER, true); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_USERAGENT,"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.85 Safari/537.36"); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Cookie: '.$cookieString,"accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8")); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
    $result = curl_exec($ch); 
    curl_close($ch); 


    //last location forward 
    preg_match_all('/^Location:\s*(.*)/mi', $result, $matches); 
    $second_redirect = str_replace("\"","_",$matches[1][0]); 
    $second_redirect = filter_var($second_redirect,FILTER_SANITIZE_URL); 


    $ch = curl_init($second_redirect); 
    curl_setopt($ch, CURLOPT_HEADER, true); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_USERAGENT,"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.85 Safari/537.36"); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Cookie: '.$cookieString,"accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8")); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
    $result = curl_exec($ch); 

    curl_close($ch); 

    preg_match_all('/^Location:\s*(.*)/mi', $result, $matches); 
    $blank = str_replace("\"","_",$matches[1][0]); 
    $blank = filter_var($blank,FILTER_SANITIZE_URL); 


    echo "Blank url: ".$blank; 

} 


?> 
+0

Спасибо за ваш ответ Payn3. Он работает, я могу проанализировать результат и использовать Кодекс. Я не понимаю, как каждый шаг в вашем скрипте ставится. Спасибо. –