I connected my web app to salesforce and successfully followed all the steps in the web server OAuth flow to get an access_token and related info: https://developer.salesforce.com/docs/atlas.en-us.api_placeorder.meta/api_placeorder/intro_understanding_web_server_oauth_flow.htm
Every step seems to return the expected set of results specified in the docs, but when I try to make requests with the final access token, I get an error saying my session ID is invalid. Here is my code:
// Execute a request for access_token and related info
$output = json_decode(curl_exec($ch));
$info = curl_getinfo($ch);
curl_close($ch);
// Display output and curl info
var_dump($info);
var_dump($output);
// Extract token and instance_url from output
$sf_url = $output->instance_url . '/services/data/v35.0/';
$sf_auth = 'Bearer ' . $output->access_token;
// Execute a new cURL request with auth values
$ci = curl_init();
curl_setopt($ci, CURLOPT_URL, $sf_url);
curl_setopt($ci, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ci, CURLINFO_HEADER_OUT, true);
curl_setopt($ci, CURLOPT_HTTPGET, true);
curl_setopt($ci, CURLOPT_HTTPHEADER, array(
'Accept' => 'application/json',
'Authorization' => $sf_auth,
'X-PrettyPrint' => 1
));
$output2 = curl_exec($ci);
$info2 = curl_getinfo($ci);
curl_close($ci);
// Display output and curl info
var_dump($info2);
var_dump($output2);
The dump from $output gives:
object(stdClass)#194 (7) {
["access_token"]=> string(112) "xxxxxxxxxxxxxxxx"
["signature"]=> string(44) "xxxxxxxxxxxxxx"
["scope"]=> string(3) "api"
["instance_url"]=> string(27) "https://cs10.salesforce.com"
["id"]=> string(68) "https://test.salesforce.com/id/xxxxx/xxxxx"
["token_type"]=> string(6) "Bearer"
["issued_at"]=> string(13) "1453358xxxxxx" }
The dump from $output2 gives:
string(75) "[{"message":"Session expired or invalid","errorCode":"INVALID_SESSION_ID"}]"
Any help here would be much appreciated.
* UPDATE *
I also tried using the username-password auth flow, and I'm getting the same result. I can get an access token, but I can't query the database, and the error being returned is the same INVALID_SESSION_ID.
I used the Postman plugin for chrome, passed in all the same info for the username-password flow, and it works for making queries. I'm not sure what is being done differently, seems like all the data being passed is the same.
* Update 2 *
The dumps from curl_getinfo() show that the headers aren't being set in the second curl request, but I can't see why.
The var_dump from $info gives:
array(27) {
["url"]=> string(294) "https://test.salesforce.com/services/oauth2/token?client_id=xxxxxxx&client_secret=xxxxxxxx&username=xxxxxxxx&password=xxxxxxxx&grant_type=password"
["content_type"]=> string(30) "application/json;charset=UTF-8"
["http_code"]=> int(200)
["header_size"]=> int(669)
["request_size"]=> int(396)
["filetime"]=> int(-1)
["ssl_verify_result"]=> int(0)
["redirect_count"]=> int(0)
["total_time"]=> float(0.602597)
["namelookup_time"]=> float(0.028403)
["connect_time"]=> float(0.097796)
["pretransfer_time"]=> float(0.241315)
["size_upload"]=> float(0)
["size_download"]=> float(361)
["speed_download"]=> float(599)
["speed_upload"]=> float(0)
["download_content_length"]=> float(-1)
["upload_content_length"]=> float(-1)
["starttransfer_time"]=> float(0.601087)
["redirect_time"]=> float(0)
["redirect_url"]=> string(0) ""
["primary_ip"]=> string(14) "xx.xx.xx.xx"
["certinfo"]=> array(0) { }
["primary_port"]=> int(443)
["local_ip"]=> string(11) "xx.xx.xx.xx"
["local_port"]=> int(45269)
["request_header"]=> string(396) "POST /services/oauth2/token?client_id=xxxxxxxxxxx&client_secret=xxxxxxxxx&username=xxxxxx&password=xxxxxx&grant_type=password HTTP/1.1 Host: test.salesforce.com Accept: */* Content-Type: application/x-www-form-urlencoded Expect: 100-continue " }
The dump from $info2 gives:
array(27) {
["url"]=> string(47) "https://cs10.salesforce.com/services/data/v35.0"
["content_type"]=> string(30) "application/json;charset=UTF-8"
["http_code"]=> int(401)
["header_size"]=> int(319)
["request_size"]=> int(77)
["filetime"]=> int(-1)
["ssl_verify_result"]=> int(0)
["redirect_count"]=> int(0)
["total_time"]=> float(0.278246)
["namelookup_time"]=> float(0.060541)
["connect_time"]=> float(0.095554)
["pretransfer_time"]=> float(0.170015)
["size_upload"]=> float(0)
["size_download"]=> float(75)
["speed_download"]=> float(269)
["speed_upload"]=> float(0)
["download_content_length"]=> float(-1)
["upload_content_length"]=> float(0)
["starttransfer_time"]=> float(0.20641)
["redirect_time"]=> float(0)
["redirect_url"]=> string(0) ""
["primary_ip"]=> string(12) "xx.xx.xx.xx"
["certinfo"]=> array(0) { }
["primary_port"]=> int(443)
["local_ip"]=> string(11) "xx.xx.xx.xx"
["local_port"]=> int(50733)
["request_header"]=> string(77) "GET /services/data/v35.0 HTTP/1.1 Host: cs10.salesforce.com Accept: */* " }
access_token
andinstance_url
that you get in PHP with the Chrome Postman plugin does the REST API call succeed? If so, there is something with the PHP to cURL interaction.