- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
10-02-2024 11:40 PM - edited 10-02-2024 11:51 PM
Hi, i need to send info to third party APIGEE and here is the script include
//hashing the reqPayload to generate Signature
var r = new sn_ws.RESTMessageV2(apiname, apimethod);
r.setEndpoint(xxurlxx);
r.setHttpMethod("get");
var response = r.execute();
var responseBody = response.getBody();
var httpStatus = response.getStatusCode();
Somehow, the Request string send is inverted, thus getting error 401 "invalid signature".
Request string that I sent: xxurlxx?file=test.xlsx&folder=WO123
Hash string that I used: ?folder=WO123&file=test.xlsx
To success, I should send the request string same as hashing : xxurlxx?folder=WO123&file=test.xlsx
Any one knows what is problem here or how to control the request string in REST Message or script include?
Solved! Go to Solution.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
10-03-2024 05:00 AM
Try this once:
var queryParam = {
'folder': "WOT123",
'file': "test.xlsx"
};
// Construct the query string in the desired order
var reqPayload = '?folder=' + encodeURIComponent(queryParam['folder']) +
'&file=' + encodeURIComponent(queryParam['file']);
// Create the full endpoint URL
var fullUrl = xxurlxx + reqPayload; // Combine endpoint and query parameters
// Hashing the reqPayload to generate Signature
// Make sure to use reqPayload for generating the signature
var r = new sn_ws.RESTMessageV2(apiname, apimethod);
r.setEndpoint(fullUrl); // Use the full URL with query parameters
r.setHttpMethod("get");
r.setStringParameterNoEscape('Content-Type', "application/json");
r.setStringParameterNoEscape('oauth_sign', Signature);
r.setStringParameterNoEscape('oauth_client_key', oAuthClientKey);
// No need to set query parameters separately, as they are already in the URL
// Execute the request
var response = r.execute();
var responseBody = response.getBody();
var httpStatus = response.getStatusCode();
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
10-02-2024 11:53 PM
Hi @Muhammad Arif B ,
Try with the below script once :-
var queryParam = {
'folder': "WO123",
'file': "test.xlsx"
};
var reqPayload = '';
if (queryParam && Object.keys(queryParam).length > 0) {
var keys = Object.keys(queryParam);
for (var i = 0; i < keys.length; i++) {
if (i == 0)
reqPayload = '?' + keys[i] + '=' + queryParam[keys[i]];
else
reqPayload += '&' + keys[i] + '=' + queryParam[keys[i]];
}
}
// Hashing the reqPayload to generate Signature (keep your current logic here)
// Create the RESTMessageV2 object
var r = new sn_ws.RESTMessageV2(apiname, apimethod);
// Set endpoint with query parameters included
var endpoint = xxurlxx + reqPayload;
r.setEndpoint(endpoint);
// Set HTTP method
r.setHttpMethod("get");
// Set headers and parameters
r.setRequestHeader('Content-Type', "application/json");
r.setRequestHeader('oauth_sign', Signature);
r.setRequestHeader('oauth_client_key', oAuthClientKey);
// Execute the request
var response = r.execute();
var responseBody = response.getBody();
var httpStatus = response.getStatusCode();
If you found my response helpful, I would greatly appreciate it if you could mark it as "Accepted Solution" and "Helpful."
Your support not only benefits the community but also encourages me to continue assisting. Thank you so much!
Thanks and Regards
Ravi Gaurav | ServiceNow MVP 2025,2024 | ServiceNow Practice Lead | Solution Architect
CGI
M.Tech in Data Science & AI
YouTube: https://www.youtube.com/@learnservicenowwithravi
LinkedIn: https://www.linkedin.com/in/ravi-gaurav-a67542aa/
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
10-03-2024 01:43 AM
Cant set r.setEndpoint(xxurlxx + reqPayload);. By doing this, it will send request : "xxurlxx?file=test.xlsx&folder=WO123?folder=WO123&file=test.xlsx"(double payload)
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
10-02-2024 11:58 PM
It looks like you're facing an issue with the order of query parameters in your request string versus the string you're using to generate the hash for the signature. Since the order of parameters matters for generating a valid OAuth signature, you'll need to ensure that both the request string and the hash string use the same order.
Could you try once bellow updated code:
var queryParam = {
'folder': "WOT123",
'file': "test.xlsx"
};
// Create an array of keys and sort them to maintain a consistent order
var sortedKeys = Object.keys(queryParam).sort();
var reqPayload = '';
for (var i = 0; i < sortedKeys.length; i++) {
var key = sortedKeys[i];
if (i === 0) {
reqPayload = '?' + key + '=' + encodeURIComponent(queryParam[key]);
} else {
reqPayload += '&' + key + '=' + encodeURIComponent(queryParam[key]);
}
}
// Assuming your hashing logic is correct, ensure reqPayload is used consistently
var r = new sn_ws.RESTMessageV2(apiname, apimethod);
r.setEndpoint(xxurlxx + reqPayload); // Append the sorted query parameters to the endpoint
r.setHttpMethod("get");
r.setStringParameterNoEscape('Content-Type', "application/json");
r.setStringParameterNoEscape('oauth_sign', Signature);
r.setStringParameterNoEscape('oauth_client_key', oAuthClientKey);
// Set query parameters using the same sorted keys
for (var i = 0; i < sortedKeys.length; i++) {
var key = sortedKeys[i];
r.setQueryParameter(key, queryParam[key]);
}
var response = r.execute();
var responseBody = response.getBody();
var httpStatus = response.getStatusCode();
I hope my answer helps you to resolve your issue, if yes please mark my answer helpful and correct.
thank you
Rajesh
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
10-03-2024 01:42 AM
Hi, we cant sort the query parameters, even got valid signature, from APIGEE side must received ?folder=WO123&file=test.xlsx.
Cant set r.setEndpoint(xxurlxx + reqPayload);. By doing this, it will send request : "xxurlxx?file=test.xlsx&folder=WO123?file=test.xlsx&folder=WO123" (double payload)