【问题标题】:Keeping session alive with Curl and PHP使用 Curl 和 PHP 保持会话活跃
【发布时间】:2012-10-22 21:46:15
【问题描述】:

我正在尝试连接到 API,对用户进行身份验证,然后查看用户详细信息。这是通过首先访问登录端点来完成的

http://api.example.com/login/<username>/<password>

登录,然后如下查看用户详细信息:

http://api.example.com/user/

这一切都在网络浏览器中工作。但是,一旦我尝试使用 Curl,登录就可以正常工作,但是在尝试查看用户详细信息时,我会返回 401,未经授权的错误。我相信这是因为 Curl 没有正确保存会话 cookie?有人可以指出为什么它不起作用以及如何解决它?我尝试过搜索堆栈交换,但是,我尝试过的解决方案都不适用于我的情况。我用来卷曲端点的代码如下所示。谢谢!

define("COOKIE_FILE", "cookie.txt");

// Login the user
$ch = curl_init('http://api.example.com/login/joe/smith');
curl_setopt ($ch, CURLOPT_COOKIEJAR, COOKIE_FILE); 
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, true);
echo curl_exec ($ch);

// Read the session saved in the cookie file
echo "<br/><br/>";
$file = fopen("cookie.txt", 'r');
echo fread($file, 100000000);   
echo "<br/><br/>";

// Get the users details
$ch = curl_init('http://api.example.com/user');
curl_setopt ($ch, CURLOPT_COOKIEJAR, COOKIE_FILE); 
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, true);
echo curl_exec ($ch);

这段代码将输出:

HTTP/1.1 200 OK Date: Mon, 22 Oct 2012 21:23:57 GMT Server: LiteSpeed Connection: close X-Powered-By: PHP/5.3.14 Set-Cookie: cfapi=f481129c9616b8f69cc36afe16466545; path=/ Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Content-Type: application/json X-Powered-By: CFWAPI 0.1a Content-Length: 46 {"status":200,"msg":"Successfully Logged In."}

# Netscape HTTP Cookie File # http://curl.haxx.se/rfc/cookie_spec.html # This file was generated by libcurl! Edit at your own risk. api.example.com FALSE   /   FALSE   0   cfapi 94f63b07ccf7e34358c1c922341c020f 

HTTP/1.1 401 Unauthorized Date: Mon, 22 Oct 2012 21:23:57 GMT Server: LiteSpeed Connection: close X-Powered-By: PHP/5.3.14 Set-Cookie: cfapi=a8eb015a7c423dde95aa01579c4729a4; path=/ Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Content-Type: application/json X-Powered-By: CFWAPI 0.1a Content-Length: 49 {"status":401, "msg":"You need to login first!"}

【问题讨论】:

    标签: php session curl


    【解决方案1】:

    您还需要设置选项CURLOPT_COOKIEFILE

    手册将其描述为

    包含 cookie 数据的文件的名称。 cookie文件可以 采用 Netscape 格式,或者只是简单的 HTTP 样式的标头转储到 文件。如果名称为空字符串,则不加载任何 cookie,但 cookie 处理仍处于启用状态。

    由于您使用的是 cookie jar,因此您最终会在请求完成时保存 cookie,但由于未给出 CURLOPT_COOKIEFILE,cURL 不会在后续请求中发送任何已保存的 cookie。

    【讨论】:

    • 噢!不敢相信我错过了那个选项,这很有意义。谢谢!
    • 是否可以将cookie设置为变量(我不想每次都传递文件)?
    • @trainoasis 见选项CURLOPT_COOKIE
    • 但是,如果我需要保存会话呢?
    【解决方案2】:

    您已正确使用“CURLOPT_COOKIEJAR”(写入)但您还需要设置“CURLOPT_COOKIEFILE”(读取)

    curl_setopt ($ch, CURLOPT_COOKIEJAR, COOKIE_FILE); 
    curl_setopt ($ch, CURLOPT_COOKIEFILE, COOKIE_FILE); 
    

    【讨论】:

      【解决方案3】:

      这就是你在会话中使用 CURL 的方式

      //initial request with login data
      
      $ch = curl_init();
      curl_setopt($ch, CURLOPT_URL, 'http://www.example.com/login.php');
      curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/32.0.1700.107 Chrome/32.0.1700.107 Safari/537.36');
      curl_setopt($ch, CURLOPT_POST, true);
      curl_setopt($ch, CURLOPT_POSTFIELDS, "username=XXXXX&password=XXXXX");
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
      curl_setopt($ch, CURLOPT_COOKIESESSION, true);
      curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie-name');  //could be empty, but cause problems on some hosts
      curl_setopt($ch, CURLOPT_COOKIEFILE, '/var/www/ip4.x/file/tmp');  //could be empty, but cause problems on some hosts
      $answer = curl_exec($ch);
      if (curl_error($ch)) {
          echo curl_error($ch);
      }
      
      //another request preserving the session
      
      curl_setopt($ch, CURLOPT_URL, 'http://www.example.com/profile');
      curl_setopt($ch, CURLOPT_POST, false);
      curl_setopt($ch, CURLOPT_POSTFIELDS, "");
      $answer = curl_exec($ch);
      if (curl_error($ch)) {
          echo curl_error($ch);
      }
      

      我在 ImpressPages 上看到过这个

      【讨论】:

      • 这里你没有创建一个新的连接。您正在使用相同的连接。
      • 谢谢。为我工作
      【解决方案4】:

      是的,通常被称为“cookie jar”,Google 应该提供很多示例:

      http://devzone.zend.com/16/php-101-part-10-a-session-in-the-cookie-jar/

      http://curl.haxx.se/libcurl/php/examples/cookiejar.html

      把最后一个复制到这里,这样它就不会消失了……

      登录到一个页面,然后获取另一个页面,将所有 cookie 从第一页沿 Written by Mitchell 传递

      <?php
      /*
      This script is an example of using curl in php to log into on one page and 
      then get another page passing all cookies from the first page along with you.
      If this script was a bit more advanced it might trick the server into 
      thinking its netscape and even pass a fake referer, yo look like it surfed 
      from a local page.
      */
      
      $ch = curl_init();
      curl_setopt($ch, CURLOPT_COOKIEJAR, "/tmp/cookieFileName");
      curl_setopt($ch, CURLOPT_URL,"http://www.myterminal.com/checkpwd.asp");
      curl_setopt($ch, CURLOPT_POST, 1);
      curl_setopt($ch, CURLOPT_POSTFIELDS, "UserID=username&password=passwd");
      
      ob_start();      // prevent any output
      curl_exec ($ch); // execute the curl command
      ob_end_clean();  // stop preventing output
      
      curl_close ($ch);
      unset($ch);
      
      $ch = curl_init();
      curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
      curl_setopt($ch, CURLOPT_COOKIEFILE, "/tmp/cookieFileName");
      curl_setopt($ch, CURLOPT_URL,"http://www.myterminal.com/list.asp");
      
      $buf2 = curl_exec ($ch);
      
      curl_close ($ch);
      
      echo "<PRE>".htmlentities($buf2);
      ?>  
      

      【讨论】:

      • 我遇到了 CURLOPT_COOKIEJAR 和 CURLOPT_COOKIEFILE 的问题。我以为我必须始终使用两者。一旦我遵循了您的代码,我正在尝试做的事情就奏效了!谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多