我需要通过curl脚本验证用户身份
session_start();
$_POST["username"]= "user";
$_POST["password"]= "password";
$ch = curl_init();
$url = 'signin.php';
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_POST, count($_POST));
curl_setopt($ch,CURLOPT_POSTFIELDS, $_POST);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
$result = json_decode(curl_exec($ch),true);
curl_close($ch);
signin.php对API进行了另一个curl调用,我确保signin.php返回所有必需的信息,设置所有必需的会话变量,返回一个数组:
echo json_encode(array(
'success' => true,
'ALLSESSION' => $_SESSION,
'error'=> ""
));
ALLSESSION返回正确的会话变量,但是不能直接访问它们,我的意思是我不能使用$ _SESSION [“ userid”],它在会话数组中不存在。
如何保留两个页面之间的会话?
谢谢
问题在于客户端无法记住/传输PHP会话ID。
当HTTP客户端(通过HTTP服务器)向php脚本发出请求时,如果它希望继续先前启动的会话,则必须在请求中包含会话ID。可以在HTTP标头中以cookie或URL参数(默认情况下命名为PHPSESSID)完成此操作。如果您不想使用PHP的默认会话变量名称,或者您想使用POST变量而不是URL参数,则可以使用所需的任何请求变量或URL参数(无论是GET,POST还是COOKIE ),但是您将需要在服务器端手动解释此变量。
以下是三种解决方案,按照推荐程度从高到低的顺序排列。
每当您从该客户端发出请求时,PHP都会使用cookie中的会话ID重新加载您的会话数据。
在这种情况下,客户端是cUrl。您需要设置您的cUrl请求以允许/使用cookie。这可以通过设置CURLOPT_COOKIEJAR和CURLOPT_COOKIEFILE选项来完成。
session_start();
$_POST["username"]= "user";
$_POST["password"]= "password";
$ch = curl_init();
$url = 'signin.php';
//Name of a file to store cookie data in.
//If the file does not exist, it will be created.
//cUrl (or your web server) needs to have write permissions to the folder.
$cookieFile = "/some/writable/folder/filename";
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_POST, count($_POST));
curl_setopt($ch,CURLOPT_POSTFIELDS, $_POST);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
//Tell cUrl about the cookie file
curl_setopt($ch,CURLOPT_COOKIEJAR, $cookieFile); //tell cUrl where to write cookie data
curl_setopt($ch,CURLOPT_COOKIEFILE, $cookieFile); //tell cUrl where to read cookie data from
$result = json_decode(curl_exec($ch),true);
curl_close($ch);
使用$ cookieFile进行CURLOPT_COOKIEJAR和CURLOPT_COOKIEFILE的任何后续cUrl调用将具有与先前调用相同的会话数据。
您可以像这样将会话ID附加到所有URL:somepage.php?PHPSESSID = sessionidgoeshere
“ PHPSESSID”是PHP默认使用的变量名。如果服务器设置为使用非默认名称,则需要使用该变量名称。
使用解决方案2,您仍然需要以某种方式将会话ID存储在客户端。
在正常情况下,不建议使用此解决方案。与以前的解决方案不同,此解决方案需要更改服务器端脚本和客户端(cUrl)。仅当您特别希望将会话ID作为URL参数或Cookie以外的其他内容发送,或者要使用服务器期望使用的变量名以外的其他变量名时,此解决方案才有用。在开始会话之前,将以下代码放入正在处理请求的服务器端PHP中:session_id($_POST[<param_name>]);
或session_id($_GET[<param_name>]);
或session_id($_COOKIE[<param_name>]);
我建议使用解决方案#1,除非您有令人信服的理由不这样做。
同样,PHP不在乎请求是GET还是POST或任何其他HTTP请求方法。无论使用哪种HTTP请求方法,如果将会话ID作为URL参数或在cookie中传递,则相关会话将在服务器端保留。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句