Mam do zrobienia zarządzanie kontem zewnętrznym, w innym serwisie. Mam moduł login.php i account.php.

W login.php mam taki kod:

  1. $cookieFile = $functions->random(10, 1); //funkcja do generowania losowej nazwy ciasteczka
  2. $curl = curl_init();
  3. curl_setopt($curl, CURLOPT_URL, "http://strona.com/login.php");
  4. curl_setopt($curl, CURLOPT_COOKIESESSION, true);
  5. curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
  6. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  7. curl_setopt($curl, CURLOPT_POST, 1);
  8. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false );
  9. curl_setopt($curl, CURLOPT_POSTFIELDS, "login=user&password=password");
  10. curl_setopt($curl, CURLOPT_ENCODING, "");
  11. curl_setopt($curl, CURLOPT_HEADER, 1);
  12. curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
  13. curl_setopt($curl, CURLOPT_COOKIEJAR, $_SERVER["DOCUMENT_ROOT"].'/web/cookies/'.$cookieFile.'.txt');
  14. curl_setopt($curl, CURLOPT_COOKIEFILE, $_SERVER["DOCUMENT_ROOT"].'/web/cookies/'.$cookieFile.'.txt');
  15. $getCookie = curl_exec($curl);
  16. curl_close($curl);
  17.  
  18. $cookieContainer = file_get_contents($_SERVER["DOCUMENT_ROOT"].'/web/cookies/'.$cookieFile.'.txt');
  19. $cookieIdPos = strpos($cookieContainer, "JSESSIONID");
  20. $setFinalCookie = "JSESSIONID=".substr($cookieContainer, ($cookieIdPos+11), (strlen($cookieContainer)-1));
  21. $setExpireDate = (time() + 1500);


Wszystko jest fajnie, plik z ciasteczkiem się tworzy:

  1. # Netscape HTTP Cookie File
  2. # This file was generated by libcurl! Edit at your own risk.
  3.  
  4. strona.com FALSE / FALSE 1405347742 md5 1389795742074
  5. strona.com FALSE / FALSE 0 JSESSIONID 0F6BCB6D89F2DCD2B3B77AAA33AEA69A


I wszystko byłoby okej, gdyby w account.php, przy kodzie:
  1. $cookie = $functions->get_cookie(); //pobiera nazwe pliku ciasteczka i ciasteczko z bazy danych (w login.php zapisane)
  2. $curl = curl_init();
  3. curl_setopt($curl, CURLOPT_URL, "http://strona.com/account.php");
  4. curl_setopt($curl, CURLOPT_COOKIE, $cookie["cookie"]);
  5. curl_setopt($curl, CURLOPT_COOKIESESSION, true);
  6. curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
  7. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  8. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false );
  9. curl_setopt($curl, CURLOPT_ENCODING, "");
  10. curl_setopt($curl, CURLOPT_COOKIEJAR, $_SERVER["DOCUMENT_ROOT"].'/web/cookies/'.$cookie["cookiefile"].'.txt');
  11. curl_setopt($curl, CURLOPT_COOKIEFILE, $_SERVER["DOCUMENT_ROOT"].'/web/cookies/'.$cookie["cookiefile"].'.txt');
  12. curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
  13. $curlData = curl_exec ( $curl );
  14. echo $curlData;


można było się zalogować. Ale nie można. Nie loguje się, a ciasteczko zmienia się na:

  1. # Netscape HTTP Cookie File
  2. # This file was generated by libcurl! Edit at your own risk.
  3.  
  4. strona.com FALSE / FALSE 1405347742 md5 1389795742074


To są nagłówki, zwracane przy logowaniu w login.php (już z innej sesji ciasteczek). Przy account.php zwracany jest już tylko md5.

  1. HTTP/1.1 302 Found Date: Wed, 15 Jan 2014 14:37:09 GMT Server: Apache/2.2.14 (Ubuntu) Set-Cookie: JSESSIONID=BDC17E49CAE16F876D22BE97C155E573; Path=/; HttpOnly Location: [url="http://strona.com/login.php;jsessionid=BDC17E49CAE16F876D22BE97C155E573"]http://strona.com/login.php;jsessionid=BDC...D22BE97C155E573[/url] Content-Language: en-US Vary: Accept-Encoding Content-Encoding: gzip Content-Length: 20 Connection: close Content-Type: text/html HTTP/1.1 200 OK Date: Wed, 15 Jan 2014 14:37:09 GMT Server: Apache/2.2.14 (Ubuntu) Content-Language: en-US Vary: Accept-Encoding Content-Encoding: gzip Content-Length: 21445 Connection: close Content-Type: text/html;charset=UTF-8


Tym bardziej to dziwne, przecież wszystko jest okej. Plik z ciasteczkiem jest odczytywany, ma dobry chmod - jest okej. W bazie wszystko dobrze zapisywane i odczytywane - debugowałem. Tylko czemu, u licha, nie chce korzystać już z tego ciasteczka w account.php?

Będę wdzięczny za każą podpowiedź, bo nie mam już sił. Nawet curl_error($curl); nic nie pokazuje...

Przy okazji, ten kod LOGUJE bez problemu:
  1. $curl = curl_init();
  2. curl_setopt($curl, CURLOPT_URL, "http://strona.com/login.php");
  3. curl_setopt($curl, CURLOPT_COOKIESESSION, true);
  4. curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
  5. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  6. curl_setopt($curl, CURLOPT_POST, 1);
  7. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false );
  8. curl_setopt($curl, CURLOPT_POSTFIELDS, "login=user&password=password");
  9. curl_setopt($curl, CURLOPT_ENCODING, "");
  10. curl_setopt($curl, CURLOPT_HEADER, 1);
  11. curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
  12. curl_setopt($curl, CURLOPT_COOKIEJAR, $_SERVER["DOCUMENT_ROOT"].'/panel/cookies/cookie.txt');
  13. curl_setopt($curl, CURLOPT_COOKIEFILE, $_SERVER["DOCUMENT_ROOT"].'/panel/cookies/cookie.txt');
  14. $getCookie = curl_exec($curl);
  15. echo $getCookie;


ten kod NIE LOGUJE:

  1. $cookieFile = $this->random(10, 1);
  2. $curl = curl_init();
  3. curl_setopt($curl, CURLOPT_URL, "http://strona.com/login.php");
  4. curl_setopt($curl, CURLOPT_COOKIESESSION, true);
  5. curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
  6. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  7. curl_setopt($curl, CURLOPT_POST, 1);
  8. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false );
  9. curl_setopt($curl, CURLOPT_POSTFIELDS, "login=user&password=password");
  10. curl_setopt($curl, CURLOPT_ENCODING, "");
  11. curl_setopt($curl, CURLOPT_HEADER, 1);
  12. curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
  13. curl_setopt($curl, CURLOPT_COOKIEJAR, $_SERVER["DOCUMENT_ROOT"].'/web/cookies/'.$cookieFile.'.txt');
  14. curl_setopt($curl, CURLOPT_COOKIEFILE, $_SERVER["DOCUMENT_ROOT"].'/web/cookies/'.$cookieFile.'.txt');
  15. $getCookie = curl_exec($curl);
  16. echo $getCookie;


Chociaż w drugim przypadku plik jest tworzony, ciasteczko jest zapisywane i odczytywane. Ale nie loguje.

WTF?!