I am trying to access Adyen test API that requires basic authentication credentials. https://docs.adyen.com/developers/ecommerce-integration
My credentials work when accessing the API page through browser.
But I get an 401 Unauthorized response when trying to access the API with XMLHttpRequest POST request.
Javascript Code
var url = "https://pal-test.adyen.com/pal/servlet/Payment/v25/authorise";
var username = "[email protected]";
var password = "J}5fJ6+?e6&lh/Zb0>r5y2W5t";
var base64Credentials = btoa(username+":"+password);
var xhttp = new XMLHttpRequest();
xhttp.open("POST", url, true);
xhttp.setRequestHeader("content-type", "application/json");
xhttp.setRequestHeader("Authorization", "Basic " + base64Credentials);
var requestParams = XXXXXXXX;
xhttp.send(requestParams);
Result
That screenshot shows “Request Method: OPTIONS”, which indicates the details displayed are for a CORS preflight OPTIONS request automatically made by your browser—not for your POST
.
Your browser doesn’t (and can’t) send the Authorization
header when it makes that OPTIONS
request, and that causes the preflight to fail, so the browser never moves on to trying your POST
.
As long as https://pal-test.adyen.com/pal/servlet/Payment/v25/authorise
requires authentication for OPTIONS
requests, there’s no way you can make a successful POST
to it.
The reason is because what’s happening here is this:
Authorization
header.Authorization
header require me to do a CORS preflight OPTIONS
to make sure the server allows requests with that header.OPTIONS
request to the server without the Authorization
header—because the whole purpose of the OPTIONS
check is to see if it’s OK to send that.OPTIONS
request but instead of responding to it in a way that indicates it allows Authorization
in requests, it rejects it with a 401 since it lacks that header.POST
request from your code.