Reputation: 33
I'm trying to log in a drupal via curl. I got message: 'logged' with a command: echo "logged"; which is in a if statement that tells me how everything was fine.
After running a script I open my homepage and unfortunately I wasn't logged in.
I think that I have a problems with a cookies.
<?php
ob_start(); // Initiate the output buffer
function mymodule_get_csrf_header() {
$curl_get = curl_init();
curl_setopt_array($curl_get, array(
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_URL => 'http://will.sx/services/session/token',
));
$csrf_token = curl_exec($curl_get);
curl_close($curl_get);
return 'X-CSRF-Token: ' . $csrf_token;
}
$username = 'test';
$password = 'TEST';
$request_url = 'http://will.sx/rests/user/login';
$user_data = array(
'username' => $username,
'password' => $password,
);
$user_data = http_build_query($user_data);
$curl = curl_init($request_url);
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Accept: application/json')); // Accept JSON response
curl_setopt($curl, CURLOPT_POST, 1); // Do a regular HTTP POST
curl_setopt($curl, CURLOPT_POSTFIELDS, $user_data); // Set POST data
curl_setopt($curl, CURLOPT_HEADER, FALSE); // Ask to not return Header
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curl, CURLOPT_FAILONERROR, TRUE);
curl_setopt($curl, CURLOPT_COOKIESESSION, true);
curl_setopt($curl, CURLOPT_COOKIEFILE, "cookie.txt");
curl_setopt($curl, CURLOPT_COOKIEJAR, "cookie.txt");
$response = curl_exec($curl);
$http_code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
if ($http_code == 200) {
$logged_user = json_decode($response);
echo 'logged';
}
else {
$http_message = curl_error($curl);
die('Unable to connect to Basic CMS Engine!
Username or password incorrect!
Please enter valid username and password!');
}
//setcookie(name,value,expire,path,domain,secure)
setcookie($logged_user->session_name,$logged_user->sessid,time() + 10000,'/');
ob_end_flush(); // Flush the output from the buffer
?>
Every kind of help is welcome. Thanks in advance.
Upvotes: 2
Views: 2944
Reputation: 166667
Here is the example using Bash shell which reads address IP from /admin/reports/status/php
page retrieved from Drupal 7:
#!/usr/bin/env bash
url="https://www.example.com"
uri_php="/admin/reports/status/php"
user=admin
pass=admin
form_build_id=$(curl -s $url/user | grep -o 'form-[^" ]\{40,\}')
cookie=$(curl -sX POST -d "name=$user&pass=$pass&form_id=user_login&op=Log+in&form_build_id=$form_build_id" $url -D- | grep -o "SESS[^;]\{60,\}")
content=$(curl -s -H "Cookie: $cookie" ${url}${uri_php})
read key server_ip < <(grep -o "SERVER_ADDR[ <][^.]\+\.[^.]\+\.[^.]\+\.[^ <]\+" <<<$content | sed -e 's/<[^>]*>//g');
echo $server_ip
Upvotes: 0
Reputation: 872
Firstly, code 200 mustn't mean that you were really logged in. Response code 200 means that the webserver is telling you that your request succeeded but webserver has no idea whether you logged in to drupal or not.
Second thing is I open my homepage and unfortunately I wasn't logged in
. You mean that you open your browser? Does your browser share cookies that you specified in cURL params?
Upvotes: 1
Reputation: 107
Make sure you choose correct Response formatters and Request Parsing for your resource. You will check it at http://example.com/admin/structure/services/list/Your_resource/server
<?php
/**
* Create a token for non-safe REST calls.
**/
function mymodule_get_csrf_header() {
$curl_get = curl_init();
curl_setopt_array($curl_get, array(
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_URL => 'http://example.com/services/session/token',
));
$csrf_token = curl_exec($curl_get);
curl_close($curl_get);
return 'X-CSRF-Token: ' . $csrf_token;
}
$service_url = 'http://example.com/rest/user/login';
$post_data = array(
'username' => 'admin',
'password' => 'pass',
);
// We format post data as application/x-www-form-urlencoded so make
// sure that you tick it under the rest server parser options.
$post_data = http_build_query($post_data, '', '&');
// cURL
$curl = curl_init($service_url);
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Accept: application/json', mymodule_get_csrf_header()));
// We want curl to return a string
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
// Choose method POST
curl_setopt($curl, CURLOPT_POST, true);
// Feed the data to POST to curl
curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);
// Make it verbose for debugging.
curl_setopt($curl, CURLOPT_VERBOSE, true);
// Go!
$response = curl_exec($curl);
$logged_user = json_decode($response);
$http_code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
if ($http_code == 200) {
$logged_user = json_decode($response);
echo 'logged';
}
else {
$http_message = curl_error($curl);
die('Unable to connect to Basic CMS Engine!
Username or password incorrect!
Please enter valid username and password!');
}
setcookie($logged_user->session_name,$logged_user->sessid,time() + 10000,'/');
ob_end_flush();
?>
Upvotes: 0