Here's a quick summary of what I found: If you set credentials to same-origin : Fetch will send 1st party cookies to its own server. It will not send cookies to other domains or subdomains. If you set credentials to include : Fetch will continue to send 1st party cookies to its own server.
Unless fetch() is called with the credentials option set to include , fetch() : won't send cookies in cross-origin requests. won't set any cookies sent back in cross-origin responses. As of August 2018, the default credentials policy changed to same-origin.
get() The get() method of the cookies API retrieves information about a single cookie, given its name and URL. If more than one cookie with the same name exists for a given URL, the one with the longest path will be returned.
To send cookies with the Fetch API the credentials property of the Request object passed to fetch() must be set appropriately. The Fetch API spec defines the following values for credentials : 'omit' - Exclude credentials from this request. 'same-origin' - Include credentials with requests made to same-origin URLs.
Fetch does not use cookie by default. To enable cookie, do this:
fetch(url, {
credentials: "same-origin"
}).then(...).catch(...);
In addition to @Khanetor's answer, for those who are working with cross-origin requests: credentials: 'include'
Sample JSON fetch request:
fetch(url, {
method: 'GET',
credentials: 'include'
})
.then((response) => response.json())
.then((json) => {
console.log('Gotcha');
}).catch((err) => {
console.log(err);
});
https://developer.mozilla.org/en-US/docs/Web/API/Request/credentials
Have just solved. Just two f. days of brutforce
For me the secret was in following:
I called POST /api/auth and see that cookies were successfully received.
Then calling GET /api/users/ with credentials: 'include'
and got 401 unauth, because of no cookies were sent with the request.
The KEY is to set credentials: 'include'
for the first /api/auth
call too.
If you are reading this in 2019, credentials: "same-origin"
is the default value.
fetch(url).then
Just adding to the correct answers here for .net
webapi2
users.
If you are using cors
because your client site is served from a different address as your webapi
then you need to also include SupportsCredentials=true
on the server side configuration.
// Access-Control-Allow-Origin
// https://docs.microsoft.com/en-us/aspnet/web-api/overview/security/enabling-cross-origin-requests-in-web-api
var cors = new EnableCorsAttribute(Settings.CORSSites,"*", "*");
cors.SupportsCredentials = true;
config.EnableCors(cors);
Programmatically overwriting Cookie
header in browser side won't work.
In fetch
documentation, Note that some names are forbidden. is mentioned. And Cookie
happens to be one of the forbidden header names, which cannot be modified programmatically. Take the following code for example:
Cookie: 'xxx=yyy'
will be ignored, and the browser will always send the value of document.cookie
as the cookie if there is one.fetch('https://httpbin.org/cookies', {
headers: {
Cookie: 'xxx=yyy'
}
}).then(response => response.json())
.then(data => console.log(JSON.stringify(data, null, 2)));
P.S. You can create a sample cookie foo=bar
by opening https://httpbin.org/cookies/set/foo/bar in the chrome browser.
See Forbidden header name for details.
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