Параметры URL-адреса Curl Catch Redirect - PHP-скрипт авторизации Oauth 2.0 для запроса API (например, ВКонтакте)

У меня проблема с двухэтапной авторизацией с помощью Oauth в PHP.

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

$ 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.

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

РЕДАКТИРОВАТЬ:

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

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);

person Richard S.    schedule 17.09.2015    source источник
comment
Можете ли вы разместить код там, где делаете запрос на завиток?   -  person Sinjuice    schedule 17.09.2015


Ответы (1)


Хорошо, проблема в том, что вы не вошли в систему, если вы вошли в систему, проверка подлинности OAuth перенаправляет вас на пустую страницу с вашим кодом, но если вы этого не сделаете, ПЕРЕНАПРАВЛЕНИЯ НЕТ, и он показывает вам html-страницу с логином.

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

Второй вариант более сложный: вы должны выполнить вход программно, что подразумевает более одного завитка, сохранение файлов 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;

}


 ?>
person Sinjuice    schedule 17.09.2015
comment
Спасибо за ответ Payn3. Это работает, я могу разобрать результат и использовать Код. Я не понимаю каждый шаг в вашем сценарии, я буду. Спасибо. - person Richard S.; 18.09.2015