I have read every other topic I could find on this and none of the solutions worked. I am using React + Redux + Express and attempting to store a JWT in a cookie as per:
https://auth0.com/blog/2015/09/28/5-steps-to-add-modern-authentication-to-legacy-apps-using-jwts/
In my Redux action I am sending the following request:
export function getCookie(token) {
const config = {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + token
},
body: JSON.stringify({ token })
};
return fetch('http://127.0.0.1:4000/authorize-cookie', config)
.then((res) => {
return res.json();
})
.then((resJson) => {
return resJson;
})
.catch(err => console.log('Error: ', err));
}
And on the server I am responding with...
app.post('/authorize-cookie', authenticate, (req, res) => {
res.cookie('id_token', req.body.token, {
maxAge: 360000
});
res.status(200).send({ message: 'Cookie set!' });
});
...where authenticate is a function that verifies the token.
Everything seems fine with my response header:
HTTP/1.1 200 OK
Set-Cookie: id_token=xxx.xxx.xxx; Max-Age=360; Path=/; Expires=Tue, 12 Jan 2016 01:24:03 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 25
ETag: W/"19-UA3htFr0PWczMQBN6T4NpA"
Date: Tue, 12 Jan 2016 01:18:03 GMT
Connection: keep-alive
But when I check the sources tab there's no cookie to be found. I've read about turning off httpOnly and secure and problems with using localhost. I've also tried in every major browser and no luck.
What's going on here?
You encountered an interesting case. The thing is that behavior of
fetch
function is different rather thanXMLHttpRequest
. To work with cookies infetch
you should explicitly providecredentials
option.According to the article on MDN