CURL commando "omzetten" om in PHP te gebruiken
Van een website heb ik deze 2 stukjes code gehaald:
Code (php)
1
curl -X POST https://192.168.1.2/api/auth/login -H "Content-Type: application/json" --insecure -d '{"username":"YOURUSER", "password":"YOURPASS"}' -c /tmp/cookies.txt 2>&1 -k --silent > /dev/null
en:
Code (php)
1
curl "https://192.168.1.2/proxy/protect/api/bootstrap" -H 'Cookie: TOKEN=' --cookie /tmp/cookies.txt --cookie-jar /tmp/cookies.txt -H 'Upgrade-Insecure-Requests: 1' 2>&1 -k --silent
Dit lijkt me op CURL code die je op de een of andere manier in een soort "Command line" moet uitvoeren?
Ik zou dit echter graag in PHP doen, maar ik weet helaas niet hoe ik dit moet "omzetten" zodat ik er standaard "PHP CURL" van kan maken.
Normaal gebruik ik daar bijvoorbeeld iets zoals onderstaand voor:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?php
$handle = curl_init();
$url = "https://localhost/curl/theForm.php";
// Array with the fields names and values.
// The field names should match the field names in the form.
$postData = array(
'firstName' => 'Lady',
'lastName' => 'Gaga',
'submit' => 'ok'
);
curl_setopt_array($handle,
array(
CURLOPT_URL => $url,
// Enable the post response.
CURLOPT_POST => true,
// The data to transfer with the response.
CURLOPT_POSTFIELDS => $postData,
CURLOPT_RETURNTRANSFER => true,
)
);
$data = curl_exec($handle);
curl_close($handle);
echo $data;
[/code]
Weet iemand hoe ik dit moet aanpakken?
Alvast vriendelijk bedankt!
Grtz,
Sjef
$handle = curl_init();
$url = "https://localhost/curl/theForm.php";
// Array with the fields names and values.
// The field names should match the field names in the form.
$postData = array(
'firstName' => 'Lady',
'lastName' => 'Gaga',
'submit' => 'ok'
);
curl_setopt_array($handle,
array(
CURLOPT_URL => $url,
// Enable the post response.
CURLOPT_POST => true,
// The data to transfer with the response.
CURLOPT_POSTFIELDS => $postData,
CURLOPT_RETURNTRANSFER => true,
)
);
$data = curl_exec($handle);
curl_close($handle);
echo $data;
[/code]
Weet iemand hoe ik dit moet aanpakken?
Alvast vriendelijk bedankt!
Grtz,
Sjef
Je zit al aardig in de buurt. Als je nog nog even je content-type in meegeeft als header.
Rob Doemaarwat op 17/03/2021 12:32:38:
Wow! Das een mooie/handige hulp tool! Thanks.
Hij werkt in dit geval alleen niet helemaal, want het hele "cookie-gedeelte" wordt niet meegenomen...
Dit is namelijk de "uitkomst" van de tool:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// Generated by curl-to-PHP: http://incarnate.github.io/curl-to-php/
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://192.168.1.3/api/auth/login');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "{\"username\":\"YOURUSER\", \"password\":\"YOURPASS\"}");
$headers = array();
$headers[] = 'Content-Type: application/json';
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$result = curl_exec($ch);
if (curl_errno($ch)) {
echo 'Error:' . curl_error($ch);
}
curl_close($ch);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://192.168.1.3/api/auth/login');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "{\"username\":\"YOURUSER\", \"password\":\"YOURPASS\"}");
$headers = array();
$headers[] = 'Content-Type: application/json';
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$result = curl_exec($ch);
if (curl_errno($ch)) {
echo 'Error:' . curl_error($ch);
}
curl_close($ch);
@Ariën:
Thanks! Dat gaat gelukkig wel goed bij het omzet-script uit de link van Rob :-)
Klopt het dat ik beide CURL-commando's achter elkaar moet uitvoeren om het werkend te krijgen?
Dus eerst de bovenste (om in te loggen) en meteen daarna (gebruik makende van de cookies die zojuist zijn aangemaakt) om de data uit "proxy/protect/api/bootstrap" te halen?
Mvg,
Sjef
Alle headers die in één request gaan, kun je in de header-array stoppen.
Toevoeging op 17/03/2021 20:56:10:
Inmiddels (al letterlijk de hele dag ermee bezig :-P) ben ik alweer iets verder...
Met onderstaand PHP-script krijg ik data terug waarvan ik zéker weet dat het inloggen is gelukt:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php
$ch = curl_init();
$data = json_encode(array(
"username" => "testUser",
"password" => "wachtwoord"
));
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_URL, 'https://192.168.1.100:7443/api/auth');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_COOKIESESSION, true );
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookies.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookies.txt');
$headers = array();
$headers[] = 'Content-Type: application/json';
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$result = curl_exec($ch);
if (curl_errno($ch)) {
echo 'Error:' . curl_error($ch);
}
curl_close($ch);
?>
$ch = curl_init();
$data = json_encode(array(
"username" => "testUser",
"password" => "wachtwoord"
));
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_URL, 'https://192.168.1.100:7443/api/auth');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_COOKIESESSION, true );
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookies.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookies.txt');
$headers = array();
$headers[] = 'Content-Type: application/json';
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$result = curl_exec($ch);
if (curl_errno($ch)) {
echo 'Error:' . curl_error($ch);
}
curl_close($ch);
?>
Het grote probleem is alleen dat ik nergens de cookies (cookies.txt) kan terugvinden?!
En deze heb ik volgens mij wel nodig bij de volgende stap, namelijk het ophalen van de data uit https://192.168.1.100/proxy/protect/api/bootstrap
Weet kan me helpen om te achterhalen waarom de cookies nergens te vinden zijn?
Ik gebruik PHP op een Synology NAS.
Alvast bedankt.
Gr,
Sjef
Er zouden toch cookies moeten worden aangemaakt als het CURL-request goed gaat, of niet?
Ik ben hier niet echt in thuis, dus alle hulp is van harte welkom.
Gr,
Sjef
heb je het bestand wel aangemaakt?
Ik heb 't PHP-script aangemaakt, en zodra ik dat run komt er data terug waardoor ik met 100% zekerheid weet dat ik in de goede richting zit. Er komt namelijk data terug die je normaal alleen kunt zien als je ingelogd bent (persoonlijke gegevens, etc...)
Dus daarmee is het eerste CURL-commando uit de TS al redelijk klaar. Ik mis alleen nog het cookie verhaal. Na het runnen van dit script zouden er cookies moeten komen: /tmp/cookies.txt maar die kan ik nergens vinden... ook niet als ik alleen "cookies.txt" gebruik. Ik zou verwachten dat deze dan in dezelfde directory als het PHP-script staat komen, maar klopt dat wel? Of komen die cookies TOTAAL ergens anders? Bijvoorbeeld in de directory waar PHP zich zelf bevind ofzo? (ik heb geen idee waar dat is, maar zoiets zou ik me kunnen voorstellen!)
Hoe dan ook: ik kan cookies.text nergens vinden, en daardoor kan ik dus ook het 2e commando niet uitvoeren, want dat maakt gebruik van die cookies...
Dus ik ben echt zeer benieuwd hoe jullie zit zouden oplossen? :-)
Thanks!
Gr,
Sjef
Gewijzigd op 18/03/2021 19:54:41 door sjef dresen
Misschien dat bestand zelf aanmaken?
Het heeft geen nut om dit eerst zelf aan te maken helaas...
Nu word het relatief aan het uitvoerpad opgeslagen (waarschijnlijk je index.php).
Als je een absoluut pad gebruikt (bijv. /tmp/cookiejar.txt) heb je meer controle over de permissies op die directory en kun je controleren of PHP daar mag schrijven.
Houd ook rekening met het volgende:
Quote:
The name of a file to save all internal cookies to when the handle is closed, e.g. after a call to curl_close.
https://www.php.net/manual/en/function.curl-setopt.php
Ik heb ook relatieve paden geprobeerd. Maar ook dan zie ik geen cookies...
Of moet ik écht in die /volume1/www/ (etc...) directory's gaan zitten rommelen? (dus met Putty op de NAS inloggen enzo?)
Wat betreft de curl_close: die doe ik netjes helemaal achteraan, dus dat zou geen probleem moeten zijn...
Het klinkt alsof er óf geen cookies zijn om weg te schrijven óf PHP niet de benodigde permissies heeft om het in die folder te zetten óf het bestand ergens komt waar je het niet verwacht.
In het geval van een permissie probleem verwacht ik wel een error of warning in het PHP log, staat daar wellicht iets nuttigs in?
De cookies worden gewoon netjes in dezelfde directory opgeslagen.
Het lijkt erop dat er dus bij de aanroep iets mis gaat... Ik gebruik een verkeerde URL, of weet ik wat.
Maar het is denk ik niet iets dat hier op dit forum kan worden opgelost, maar meer op het forum van de fabrikant van het apparaat waarop in probeer in te loggen...
Thanks voor de hulp!
Mvg,
Sjef
Thanks!