【问题标题】:Sending Cookie via cURL (CURLOPT_COOKIEFILE) not working - Salesforce streaming API通过 cURL (CURLOPT_COOKIEFILE) 发送 Cookie 不起作用 - Salesforce 流 API
【发布时间】:2020-08-25 18:54:44
【问题描述】:

我在尝试通过 cURL 发送 Cookie 时遇到问题。具体案例场景与 Salesforce 流 API 有关,但我认为它适用于类似的 PHP 情况。

这就是问题所在,完成了2个请求,第一个接收到一个名为BAYEUX_BROWSER的cookie并使用CURLOPT_COOKIEJAR将cookie存储在服务器中;第二个请求使用存储的 cookie 来设置会话。

这是第一个请求的sn-p:

$cookie_filename = '/some/patch/cookies.txt';

$ch = curl_init();
// cURL cookie options being set
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_COOKIEJAR, $filename);

请求发出后,文件cookies.txt创建成功,里面还包含BAYEUX_BROWSER cookie,下面是返回cookie的例子:

# Netscape HTTP Cookie File
# https://curl.haxx.se/docs/http-cookies.html
# This file was generated by libcurl! Edit at your own risk.

xxx.my.salesforce.com   FALSE   /cometd/    TRUE    0   BAYEUX_BROWSER  e38bvb418bj8bztzkeaan2wx18y3
#HttpOnly_xxx.my.salesforce.com FALSE   /cometd/    FALSE   0   t   !0vaFlJER5UsrfIGrfKp9YI2pARkJi5YS8O/yCf8GE+6HiX+CvWWacnC3MzF+OXsuC3USJWIP3jamDQ==
.salesforce.com TRUE    /   FALSE   1629832267  BrowserId   kGpyG-Y9EeqF7jOgs3LDaA
xxx.my.salesforce.com   FALSE   /   FALSE   1598388400  sfdc-stream !jH2NPGTjjg64odBoo4aJz7403s94D3xXnkFrzyha9kaRQGVKxQfnpfplyv8vwVzqy4p9godcH/z7O1A=

第二个请求使用CURLOPT_COOKIEFILE 设置cookies文件的位置并使用它们发出请求:

$cookie_filename = '/some/patch/cookies.txt';

$ch = curl_init();
// cURL cookie options being set
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_COOKIEFILE, $filename);

这里的问题是来自 Salesforce 的响应是请求中不存在 BAYEUX_BROWSER cookie,这是确切的响应:

400::Client xxxx has established a session, but no BAYEUX_BROWSER cookie present

我已经尝试了几个小时来更改和使用不同的 cURL 选项,看看我是否可以启用 cookie,但没有运气。

我不确定是否需要更改 COOKIE 格式,或者我是否遗漏了什么,老实说,我现在不知道。

有人遇到过类似问题或知道我的代码有什么问题吗?

【问题讨论】:

  • 所以,为了让显而易见的事情摆脱困境,您对xxx.my.salesforce.com 的第二个请求是在/cometd/ 路径上吗?
  • 另外,在打开第二个连接之前,您是否在第一次运行时调用curl_close?我相信在完成之前不会写入 cookie。
  • 是的,请求之间的连接正在关闭,cookie是在第二个请求之前创建的,我已经验证了这一点。

标签: php curl cookies salesforce


【解决方案1】:

使用 Guzzle 包 (https://github.com/guzzle/guzzle) 而不是 cURL 解决了这个问题。

$cookie_filename = '/some/patch/cookies.json';
$jar = new \GuzzleHttp\Cookie\FileCookieJar( $filename, true );
$client = new \GuzzleHttp\Client();

// First response
$response = $client->request( 'POST', $url1, [
    'headers' => [...],
    'cookies' => $jar,
    'form_params' => ['message' => json_encode( $message )], 
] );

if ( $response->getStatusCode() === 200 ) {
    $response = json_decode( (string)$response->getBody() );
    // Set client ID
    $response = $client->request( 'POST', $url2, [
        'headers' => [...],
        'cookies' => $jar,
        'form_params' => ['message' => json_encode( $message )], 
    ] ); 
}

【讨论】:

    猜你喜欢
    • 2013-11-12
    • 2013-05-28
    • 2017-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2011-11-03
    相关资源
    最近更新 更多