I'm working with an odata api, and when I'm using postman to do a GET request, works perfect and I get the response as I was expecting.
But when I use a fetch request from my React app, the request throws a 401, using the same headers as I previously used in Postman. and it says that Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:3000' is therefore not allowed access. The response had HTTP status code 401.
Any idea about how to solve this request? Thanks!
fetch('https://api4.successfactors.com/odata/v2/', {
method: 'GET',
headers: {
authorization: `Basic ${auth}`, //auth is the encoded base64 username:password
},
})
.then(response => response.json())
.then((response) => {
console.log('in response: ', response);
})
.catch((error) => {
console.log('in fetchJobs error: ', error);
});
This is the 401 that I'm getting....
2 Cmd/Ctrl + Click will open the link in default browser. Save this answer.
Basic auth Basic authentication involves sending a verified username and password with your request. In the request Authorization tab, select Basic Auth from the Type dropdown list. Enter your API username and password in the Username and Password fields. For extra security, store these in variables.
Step 1 − Click on the three dots beside the Collection name in Postman and select the option Edit. Step 2 − The EDIT COLLECTION pop-up comes up. Move to the Authorization tab and then select any option from the TYPE dropdown. Click on Update.
This is most likely because Postman is probably not sending a preflight Options
request before your GET
, and upon receipt of the GET
response doesn't perform any kind of cors check (since it wouldn't really make sense to anyway).
On the other hand, when running code from your webpage Chrome is both performing a preflight Options
in order to ascertain what cross-domain request parameters it's allowed to send to the remote server and checking if the response to the Options
req has the appropriate Access-Control-Allow-Origin
header on to authorise your origin
(i.e. the domain of the page you're making the request from).
Typically, a preflight Options
is sent to the server by a browser to ask the server if it's allowed to perform the operation it's about to perform - in your case, a GET
. If the remote (cross-domain) server doesn't respond to the prelight Options
request with the correct headers in the response authorising your GET
then the browser won't send one. You're not even getting that far however, since the response to your Options
request doesn't even itself pass a cors origin
check.
If you control the server, you need to respond to the Options
request by setting the Access-Control-Allow-Origin
header on the response to include the origin
of your request page, and also to set the Access-Control-Allow-Methods
to include GET
(and probably OPTIONS
). If you don't control the remote server, it's likely any normal api service such as the one you're trying to hit has some configuration in their backend you can set somewhere to authorise your origin
.
You can read up more on cors behaviour here
You are experiencing a CORS issue, in order to get past it you need to enable CORS on your backend.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With