通过cURL(CURLOPT_COOKIEFILE)发送Cookie无效-Salesforce流式API



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

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

这是第一个请求的片段:

$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_BROWSERcookie,以下是返回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设置cookie文件的位置,并使用它们进行请求:

$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_BROWSERcookie,这是确切的响应:

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

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

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

任何人都有类似的问题,或者知道我的代码出了什么问题?

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

$cookie_filename = '/some/patch/cookies.json';
$jar = new GuzzleHttpCookieFileCookieJar( $filename, true );
$client = new GuzzleHttpClient();
// 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 )], 
] ); 
}

最新更新