使用cURL设置cookie

时间:2018-10-02 17:31:59

标签: php curl cookies

我正在用php构建登录系统,我需要在其中使用其他网站的凭据,正在使用API​​登录到另一台服务器,并使用cURL进行登录。在用户正确登录后,存储登录凭据的服务器确实会创建一个带有唯一tolken的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 txt文件保存到我的服务器中,这使我可以在其他任何时间使用例如不同的api进行另一个调用时使用该文件

现在的问题是:如果我有多个用户登录系统,该怎么办?我是否需要根据登录系统的用户数创建x个cookie?将Cookie保存到用户的浏览器中会不会更简单?

1 个答案:

答案 0 :(得分:1)

是的,您应该为每个客户端使用不同的文件。您可以使用tempnam()为客户端生成一个唯一的文件名,并将其保存在会话变量中,然后将其用作cookie罐。登录控制器可以执行以下操作:

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

然后下一页可以使用

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

用户注销后,应删除此文件并删除会话变量。

没有任何东西可以自动将cookie从curl会话传递到客户端浏览器,反之亦然。如果您不希望将cookie保存到文件中,则可以使用curl_getinfo($ch, CURLINFO_COOKIELIST)获取cookie,但是随后您必须自己解析信息,然后使用CURLOPT_COOKIE来设置每个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);