【发布时间】:2018-03-07 21:40:21
【问题描述】:
我有一个 cURL 命令,我使用该命令对网站进行身份验证,它会提供一个 cookie 作为响应,然后使用此 cookie 我可以对该服务进行 REST API 调用
这是有效的 cURL 命令:
curl -v -l -H "Content-Type: application/x-www-form-urlencoded" -H "Referrer:https://mywebsiteurl.com?ticket=unique_ticket_id" -d "_charset_=UTF-8&errorMessage=User+name+and+password+do+not+match&resource=%2F&username=username%40domain.com&password=XXXXXX&nextpage=welcomeCM.jsp&viewInfo=&ticket=unique_ticket_id" -X POST https://mywebsiteurl.com/index.jsp
在上述命令中,ticket 参数包含一个唯一的ticket id,它与网站url 一起传递
现在,我正在尝试使用 cURL PHP 来完成同样的任务,这里是 PHP 代码:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://mywebsiteurl.com/index.jsp");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "_charset_=UTF-8&errorMessage=User+name+and+password+do+not+match&resource=%2F&username=username%40domain.com&password=XXXXXX&nextpage=welcomeCM.jsp&viewInfo=&ticket=unique_ticket_id");
curl_setopt($ch, CURLOPT_POST, 1);
$headers = array(
'Content-Type: application/x-www-form-urlencoded',
'Referrer: https://mywebsiteurl.com?ticket=unique_ticket_id'
);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$result = curl_exec($ch);
if (curl_errno($ch)) {
echo 'Error:' . curl_error($ch);
}
echo $result;
curl_close ($ch);
这里echo $result 什么都没有显示
然后我尝试了var_dump($result);,它给出了以下输出:string(0) "",这意味着在$response 中没有返回任何内容
在此之后我尝试了curl_getinfo 并添加了以下代码:
echo "<pre>";
$info = curl_getinfo($ch);
print_r($info);
echo "</pre>";
这给了我以下数组:
Array
(
[url] => https://mywebsiteurl.com/index.jsp
[content_type] => text/html;charset=UTF-8
[http_code] => 302
[header_size] => 1306
[request_size] => 619
[filetime] => -1
[ssl_verify_result] => 0
[redirect_count] => 0
[total_time] => 1.540687
[namelookup_time] => 0.028262
[connect_time] => 0.171774
[pretransfer_time] => 0.462507
[size_upload] => 280
[size_download] => 0
[speed_download] => 0
[speed_upload] => 181
[download_content_length] => 0
[upload_content_length] => 280
[starttransfer_time] => 1.54066
[redirect_time] => 0
[redirect_url] => https://mywebsiteurl.com/welcomeCM.jsp?username=username@domain.com&locale=en_US
[primary_ip] => YY.YYY.YYY.YY
[certinfo] => Array
(
)
[primary_port] => 443
[local_ip] => XX.XX.XXX.XX
[local_port] => 47692
)
现在我的目标是获取 $result 中的 cookie,但它是空的,并且没有返回任何内容
是不是 cURL 命令等效的 PHP 代码中缺少某些东西?
谁能帮助我并指出检索 cookie 的方向
非常感谢!
更新
我在请求中添加了curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);,让它在成功登录后跟随302重定向
但是这次cURL执行后,echo $result将我当前的本地网页重定向到/Dashboard?viewInfo=显然不存在
这一次var_dump($result); 的结果是:string(1462) " "
而curl_getinfo($ch) 这次给出了以下数组:
Array
(
[url] => https://mywebsiteurl.com/welcomeCM.jsp?username=username@domain.com&locale=en_US
[content_type] => text/html;charset=UTF-8
[http_code] => 200
[header_size] => 1821
[request_size] => 956
[filetime] => -1
[ssl_verify_result] => 0
[redirect_count] => 1
[total_time] => 1.746911
[namelookup_time] => 1.5E-5
[connect_time] => 1.5E-5
[pretransfer_time] => 6.2E-5
[size_upload] => 0
[size_download] => 1462
[speed_download] => 836
[speed_upload] => 0
[download_content_length] => 1462
[upload_content_length] => 0
[starttransfer_time] => 0.146587
[redirect_time] => 1.6003
[redirect_url] =>
[primary_ip] => YY.YYY.YYY.YY
[certinfo] => Array
(
)
[primary_port] => 443
[local_ip] => YY.YY.YYY.YY
[local_port] => 47705
)
这里仍然无法获取所需的cookie, 请帮忙!
【问题讨论】:
-
一个可能无法解决您的问题但值得了解的注释:“Referrer”拼写错误,应该是“Referer”(是的,这是不正确的英文拼写,但事实就是这样在 HTTP 中)。
-
您需要在请求中添加
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);,以便在成功登录后跟随302重定向。 -
@HaydenSchiff 是的,你是对的,确实是拼写错误,但在 HTTP 中就是这样 :)
-
@natheriel 在发布我的问题之前,我尝试了您共享的链接上给出的答案,但它对我不起作用,因为我的 URL 在执行时重定向,我将问题标题更改为强调相同
-
@dreamcoder007 好吧,只是为了确定。您的主要目标是使用 curl,在某个站点登录/验证自己 + 存储 cookie。之后您想使用 cookie 保持身份验证?