通过 cURL (CURLOPT_COOKIEFILE) 发送 Cookie 无效 - Salesforce 流 API
Sending Cookie via cURL (CURLOPT_COOKIEFILE) not working - Salesforce streaming API
我在尝试通过 cURL 发送 Cookie 时遇到问题。具体案例场景与 Salesforce streaming API 有关,但我认为它适用于类似的 PHP 情况。
这就是问题所在,完成了 2 个请求,第一个收到名为 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_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
设置 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_BROWSER
cookie 不存在于请求中,这里是确切的响应:
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 \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 )],
] );
}
我在尝试通过 cURL 发送 Cookie 时遇到问题。具体案例场景与 Salesforce streaming API 有关,但我认为它适用于类似的 PHP 情况。
这就是问题所在,完成了 2 个请求,第一个收到名为 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_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
设置 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_BROWSER
cookie 不存在于请求中,这里是确切的响应:
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 \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 )],
] );
}