Установить cookie с помощью cURL - PullRequest
0 голосов
/ 02 октября 2018

Я строю систему входа в php, где мне нужно использовать учетные данные с другого сайта, я использую API для входа на другой сервер, и я делаю это с помощью cURL.Сервер, на котором хранятся учетные данные для входа, создает файл cookie с уникальным толкованием после того, как пользователь правильно вошел в систему, и этот файл cookie важен для просмотра других веб-страниц и опроса этих страниц с использованием других API.Это то, что я сделал до сих пор, и, кажется, работает нормально, в php-файле контроллера входа у меня есть этот код

$km_username = filter_var($_POST['userName'], FILTER_SANITIZE_STRING);
$km_user_password = $_POST['userPassword'];

$cookieFile = "cookies.txt";
if(!file_exists($cookieFile)) {
    $fh = fopen($cookieFile, "w");
    fwrite($fh, "");
    fclose($fh);
}

$url = 'https://www.apiwebsite.com/api/login.jsp?';

$fields = array(
    'userid' => $km_username,
    'password' => $km_user_password
);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($fields));
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieFile); // Cookie aware
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFile); // Cookie aware
$content = curl_exec($ch);
curl_close($ch);

На странице, где я хочу опросить сервер, чтобы получить другиеданные у меня есть

$dates = array(
    'd_inizio' => '01/01/2017',
    'd_fine' => '31/12/2017'
);

$url = "https://www.apiwebsite.com/api/ricevute.jsp?";
$cookie = "../../km-controllers/cookies.txt";

$ch = curl_init ($url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($dates));
curl_setopt ($ch, CURLOPT_COOKIEFILE, $cookie); 
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);
$output = curl_exec ($ch);

Таким образом, в основном после того, как пользователь вошел на сайт, cURL сохраняет текстовый файл cookie на моем сервере, и это позволяет мне использовать этот файл в любое другое время, когда я хочу сделать другой вызов, используянапример, другой API

Теперь вопрос: что произойдет, если в систему войдет несколько пользователей?Нужно ли создавать x количество файлов cookie в зависимости от того, сколько пользователей входит в систему?Не проще ли сохранить куки в браузере пользователя?

1 Ответ

0 голосов
/ 02 октября 2018

Да, вы должны использовать разные файлы для каждого клиента.Что вы можете сделать, это использовать tempnam(), чтобы сгенерировать уникальное имя файла для клиента, и сохранить его в переменной сеанса, а затем использовать его в качестве файла cookie.Контроллер входа может сделать это:

session_start();
if (!isset($_SESSION['cookiefile'])) {
    $cookiefile = tempnam(".", "cookie");
    $_SESSION['cookiefile'] = basename($cookiefile);
}

А затем на более поздней странице можно использовать

$cookie = "../../km-controllers/" . $_SESSION['cookiefile'];

Когда пользователь выходит из системы, вы должны удалить этот файл и удалить переменную сеанса.

Нет ничего, что автоматически передавало бы куки из сеанса curl в браузер клиента или наоборот.Если вы не хотите сохранять файлы cookie в файле, вы можете использовать curl_getinfo($ch, CURLINFO_COOKIELIST) для получения файлов cookie, но затем вам придется самостоятельно проанализировать информацию, а затем использовать CURLOPT_COOKIE для установки каждого файла cookie при создании будущего.звонки.Файл cookie автоматизирует все это.

Полный код для контроллера входа в систему.

session_start(); // This needs to be at the very beginning of your script, before anything that produces output
//...
$km_username = filter_var($_POST['userName'], FILTER_SANITIZE_STRING);
$km_user_password = $_POST['userPassword'];

if (!isset($_SESSION['cookiefile'])) {
    $cookieFile = tempnam(".", "cookie");
    $_SESSION['cookiefile'] = basename($cookiefile);
    file_put_contents($cookieFile, "");
}
$cookieFile = $_SESSION['cookiefile'];


$url = 'https://www.apiwebsite.com/api/login.jsp?';

$fields = array(
    'userid' => $km_username,
    'password' => $km_user_password
);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($fields));
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieFile); // Cookie aware
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFile); // Cookie aware
$content = curl_exec($ch);
curl_close($ch);

И последующий запросчик:

session_start(); // at very beginning
// ...

$dates = array(
    'd_inizio' => '01/01/2017',
    'd_fine' => '31/12/2017'
);

$url = "https://www.apiwebsite.com/api/ricevute.jsp?";
if (!isset($_SESSION['cookiefile'])) {
    die("no cookie file");
}
$cookie = "../../km-controllers/" . $_SESSION['cookiefile'];

$ch = curl_init ($url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($dates));
curl_setopt ($ch, CURLOPT_COOKIEFILE, $cookie); 
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);
$output = curl_exec ($ch);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...