2015-04-24 27 views
7

Ich arbeitete mit HttpFox und habe die Werte (URL und Post-Daten) mit denen, die mein Code generiert hat, verglichen. Sie sind völlig gleich, aber ich sehe immer die Meldung "Login fehlgeschlagen" auf der Webseite. Ich habe keine Ahnung, was das Problem sein könnte.PHP cURL Authentifizierung Problem

Code:

require 'domparser_1_5/simple_html_dom.php'; 

$username = "username"; 
$password = "password"; 

function login($url,$data){ 
    $fp = fopen("cookie.txt", "w"); 
    fclose($fp); 
    $login = curl_init(); 
    curl_setopt($login, CURLOPT_URL, $url); 
    curl_setopt($login, CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($login, CURLOPT_COOKIEJAR, "cookie.txt"); 
    curl_setopt($login, CURLOPT_COOKIEFILE, "cookie.txt"); 
    curl_setopt($login, CURLOPT_TIMEOUT, 40000); 
    curl_setopt($login, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($login, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); 
    curl_setopt($login, CURLOPT_FOLLOWLOCATION, true); 
    curl_setopt($login, CURLOPT_POST, true); 
    curl_setopt($login, CURLOPT_POSTFIELDS, $data); 
    ob_start(); 
    $result = curl_exec($login); 
    ob_end_clean(); 
    curl_close($login); 
    unset($login); 
    return $result; 
} 

function generate_pass($user, $password, $token) { 
    if ($password) { 
     $enc_pass = md5($password); 
     $pass = $user.':'.$enc_pass.':'.$token; 
     return md5($pass); 
    } 
} 

function get_token() { 
    $html = file_get_html('https://www.foo.com/'); 
    $token = ""; 
    foreach($html->find('input') as $element) { 
     if($element->name == "token") { 
      $token = $element->value; 
     } 
    } 
    if (!$token) { 
     die('No token found'); 
    } 
    return $token; 
} 

$token = get_token(); 

echo login("https://www.foo.com/login/start.html", "user=".$username."&password=".$password."&submit=Anmelden&logintype=login&pid=4%2C93%2C1828&pass=".generate_pass($username, $password, $token)."&redirect_url=login%2Fstart.html&tx_felogin_pi1%5Bnoredirect%5D=0&token=".$token.""); 
+0

Versuchen Sie, Guzzle lib zu verwenden, es ist benutzerfreundlicher. https://github.com/guzzle/guzzle – vanadium23

+0

Oder Sie können Postman Plugin hinzufügen (https://chrome.google.com/webstore/detail/postman-rest-client/fdmmgilgnpjigdojojpjoooidkmcomcm), senden Sie Ihre Anfrage und sehen, ob es wirklich funktioniert ... –

+0

Warum hast du Code nach 'return curl_exec ($ login);'? Die Funktion endet, wenn Sie 'return' verwenden. – Barmar

Antwort

1

Authentifizierung schlägt fehl, aufgrund der Nichtübereinstimmung zwischen token und Cookie (s) geben.

Wenn Sie die Seite laden, um das Token mit get_token() abzurufen, sendet der Server Ihnen einen Cookie, den Sie nicht speichern.

Später, wenn Sie versuchen, sich anzumelden, erwartet der Server, dass er den gleichen Cookie erhält, den er Ihnen gesendet hat, als Sie die token erhalten haben. Aber du schickst es nicht.

Ich empfehle Ihnen, die get_token() mit Curl und Speichern von Cookies in umschreiben. Auf diese Weise können Sie sie später passieren, wenn Sie login()

Wie dies nennen werde:

function get_token() { 
    $url = 'https://www.foo.com/'; 
    $curl = curl_init(); 
    curl_setopt($curl, CURLOPT_URL, $url); 
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($curl, CURLOPT_COOKIEJAR, "cookie.txt"); 
    curl_setopt($curl, CURLOPT_COOKIEFILE, "cookie.txt"); 
    curl_setopt($curl, CURLOPT_TIMEOUT, 40000); 
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); 
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); 
    $result = curl_exec($curl); 
    curl_close($curl); 
    unset($curl); 

    $html = str_get_html($result); 
    $token = ""; 
    foreach($html->find('input') as $element) { 
     if($element->name == "token") { 
      $token = $element->value; 
     } 
    } 
    if (!$token) { 
     die('No token found'); 
    } 
    return $token; 
} 

Wichtig:

$fp = fopen("cookie.txt", "w"); 
fclose($fp); 

Von login() entfernen wie kürzt auf Null Bytes die cookie.txt Datei, und Sie möchten den Cookie nicht gerade ret löschen geraubt.

Beachten Sie, dass curl_exec() die angegebene Cookie-Datei erstellt, wenn sie nicht existiert.

+0

Okay, das klingt logisch. Können Sie mir einen Code-Ausschnitt geben, wie Sie das tun würden? – user289520

+0

Im Grunde genommen führen Sie die 'login'-Funktion zusammen, ohne Post-Daten und das ursprüngliche' get_token' mit 'str_get_html' zu initialisieren, um HTML-Parsing zu initiieren. Ich habe einen Ausschnitt gepostet. Natürlich nehme ich an, dass der Rest Ihres Codes (wie Sie das Token von der HTM erhalten, wie Sie die Anmeldung weitergeben und an die Website weitergeben) korrekt ist.** Imprortant ** nicht "cookie.txt" in "login()" abschneiden 'siehe Antwort – Paolo

+0

Auch ... bekomme das Token. In Variable speichern. Dann erzeuge das Passwort. Dann logge dich ein. Dies verhindert, dass die Homepage zweimal geladen wird. – Paolo