2017-09-26 12 views
1

J'ai une commande cURL à l'aide de laquelle je suis authentifié sur un site web et il donne un cookie en réponse, puis en utilisant ce cookie je peux faire l'API REST appels à ce servicePHP - Utiliser cURL pour obtenir un cookie à partir d'une URL de redirection mais sans réponse

Voici la commande cURL travail:

curl -v -l -H "Content-Type: application/x-www-form-urlencoded" -H "Referrer:https://mywebsiteurl.com?ticket=unique_ticket_id" -d "_charset_=UTF-8&errorMessage=User+name+and+password+do+not+match&resource=%2F&username=username%40domain.com&password=XXXXXX&nextpage=welcomeCM.jsp&viewInfo=&ticket=unique_ticket_id" -X POST https://mywebsiteurl.com/index.jsp 

Dans le paramètre de ticket de commande ci-dessus contient un identifiant de ticket unique qui est passé avec le site url

maintenant, je suis essayer d'accomplir la même chose en utilisant cURL PHP, voici le code PHP:

$ch = curl_init(); 

curl_setopt($ch, CURLOPT_URL, "https://mywebsiteurl.com/index.jsp"); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, "_charset_=UTF-8&errorMessage=User+name+and+password+do+not+match&resource=%2F&username=username%40domain.com&password=XXXXXX&nextpage=welcomeCM.jsp&viewInfo=&ticket=unique_ticket_id"); 
curl_setopt($ch, CURLOPT_POST, 1); 

$headers = array(
     'Content-Type: application/x-www-form-urlencoded', 
     'Referrer: https://mywebsiteurl.com?ticket=unique_ticket_id' 
     ); 
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 

$result = curl_exec($ch); 
if (curl_errno($ch)) { 
    echo 'Error:' . curl_error($ch); 
} 

echo $result; 

curl_close ($ch); 

Ici echo $result ne montre rien

J'ai ensuite essayé var_dump($result); et donne cette sortie: string(0) "" ce qui signifie que rien ne se retourne dans $response

Après cela, j'essayé curl_getinfo et a ajouté le code suivant:

echo "<pre>"; 
$info = curl_getinfo($ch); 
print_r($info); 
echo "</pre>"; 

Et cela m'a donné le tableau suivant:

Array 
(
    [url] => https://mywebsiteurl.com/index.jsp 
    [content_type] => text/html;charset=UTF-8 
    [http_code] => 302 
    [header_size] => 1306 
    [request_size] => 619 
    [filetime] => -1 
    [ssl_verify_result] => 0 
    [redirect_count] => 0 
    [total_time] => 1.540687 
    [namelookup_time] => 0.028262 
    [connect_time] => 0.171774 
    [pretransfer_time] => 0.462507 
    [size_upload] => 280 
    [size_download] => 0 
    [speed_download] => 0 
    [speed_upload] => 181 
    [download_content_length] => 0 
    [upload_content_length] => 280 
    [starttransfer_time] => 1.54066 
    [redirect_time] => 0 
    [redirect_url] => https://mywebsiteurl.com/[email protected]&locale=en_US 
    [primary_ip] => YY.YYY.YYY.YY 
    [certinfo] => Array 
     (
     ) 

    [primary_port] => 443 
    [local_ip] => XX.XX.XXX.XX 
    [local_port] => 47692 
) 

Maintenant, mon but est d'obtenir le cookie dans $result, mais il est vide & rien ne se retourne en elle

Est-ce que quelque chose manque dans la commande cURL équivalent du code PHP ?

Quelqu'un peut-il s'il vous plaît aidez-moi-moi de & dans la direction pour récupérer le cookie

Merci beaucoup!

MISE À JOUR

J'ajouté curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); à la demande de l'avoir suivi la redirection 302 après la connexion réussie

Mais cette fois après l'exécution de cURL, echo $result réoriente ma page web locale actuelle à /Dashboard?viewInfo= qui évidemment n'existe pas

aussi cette fois-ci var_dump($result); se traduit par: string(1462) " "

Et curl_getinfo($ch) cette fois-ci donne le tableau suivant:

Array 
(
    [url] => https://mywebsiteurl.com/[email protected]&locale=en_US 
    [content_type] => text/html;charset=UTF-8 
    [http_code] => 200 
    [header_size] => 1821 
    [request_size] => 956 
    [filetime] => -1 
    [ssl_verify_result] => 0 
    [redirect_count] => 1 
    [total_time] => 1.746911 
    [namelookup_time] => 1.5E-5 
    [connect_time] => 1.5E-5 
    [pretransfer_time] => 6.2E-5 
    [size_upload] => 0 
    [size_download] => 1462 
    [speed_download] => 836 
    [speed_upload] => 0 
    [download_content_length] => 1462 
    [upload_content_length] => 0 
    [starttransfer_time] => 0.146587 
    [redirect_time] => 1.6003 
    [redirect_url] => 
    [primary_ip] => YY.YYY.YYY.YY 
    [certinfo] => Array 
     (
     ) 

    [primary_port] => 443 
    [local_ip] => YY.YY.YYY.YY 
    [local_port] => 47705 
) 

ne peut toujours pas obtenir le cookie requis ici, S'il vous plaît aider!

+0

Une note qui ne sera probablement pas résoudre votre problème, mais faut savoir: « Référent » est mal orthographié, il devrait être « Referer » (oui, c'est l'orthographe anglaise incorrecte, mais c'est juste la façon dont il est en HTTP). –

+0

Vous devez ajouter 'curl_setopt ($ ch, CURLOPT_FOLLOWLOCATION, 1);' à la demande de le faire suivre la redirection 302 après la connexion réussie. – drew010

+0

@HaydenSchiff Oui vous avez raison, en effet c'est une faute d'orthographe, mais voici comment c'est en HTTP :) – dreamcoder007

Répondre

0

Si vous souhaitez utiliser les fonctions de boucles données, vous pouvez essayer d'utiliser CURLOPT_COOKIEJAR/CURLOPT_COOKIEFILE pour stocker et récupérer votre cookie. Ce si le fichier est basé. Dans ce cas, curl écrira toutes les informations relatives aux cookies dans un fichier.

Vous pouvez définir l'emplacement de ce fichier.En utilisant CURLOPT_COOKIEJAR, vous indiquerez à curl qu'il doit capturer les données de cookie.

// create cookie file 
$cookie = __DIR__ . "/where/you/want/to/store/your/cookie/mycookie.txt"; 
fopen($cookie, "w"); 
// you may want to use some random identicator in your cookie file 
// to make sure it does not get overwritten by some action 

// prepare login 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, "https://mywebsiteurl.com/index.jsp"); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
// tell curl to follow redirects 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt($ch, CURlOPT_POSTFIELDS, "username=usernam&password=XXXXXX"); 
curl_setopt($ch, CURLOPT_POST, 1); 
// set a jar, to store your cookie 
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie); 
$headers = array(
     'Content-Type: application/x-www-form-urlencoded', 
     'Referrer: https://mywebsiteurl.com?ticket=unique_ticket_id' 
     ); 
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
// do login 
$loginResult = curl_exec($ch); 

// check if your login has worked according to the given result by any method you want 
if (preg_match("/Welcome/", $loginResult)) { 
    // simple regex for demonstration purpose 
} 

// now you could load your cookie out of the file, or just use the file for future requests 

Si votre connexion a fonctionné, toutes les informations seront stockées dans votre fichier cookie.

Maintenant, vous pouvez utiliser ce cookie à nouveau avec le curlopt CURLOPT_COOKIEFILE pour les demandes futures.

// do other request, with your cookie 
curl_setopt($ch, CURLOPT_URL, "https://mywebsiteurl.com/api/rest.php"); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, "your new post data"); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
// set a jar to update your cookie if needed 
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie); 
// give curl the location of your cookie file, so it can send it 
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie); 
+0

Merci pour votre réponse! J'ai essayé CURLOPT_COOKIEJAR comme suggéré par vous. Mais quand je lance la page .php avec ce code - au lieu de me connecter, il montre la page de connexion de https://mywebsiteurl.com/index.jsp, maintenant il semble que le code gratte la page de connexion du site et puis l'a affiché. Toujours pas en mesure d'obtenir le cookie nécessaire, pouvez-vous s'il vous plaît aider – dreamcoder007