2016-01-12 59 views
3

我已閱讀每一個其他話題,我可以找到這個和沒有解決方案的工作。我使用的陣營+終極版+快遞,並試圖在cookie存儲JWT按:Cookie未被存儲與提取

https://auth0.com/blog/2015/09/28/5-steps-to-add-modern-authentication-to-legacy-apps-using-jwts/

在我的終極版動作我發送以下請求:

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)); 
} 

而且在服務器我在迴應...

app.post('/authorize-cookie', authenticate, (req, res) => { 
    res.cookie('id_token', req.body.token, { 
    maxAge: 360000 
    }); 
    res.status(200).send({ message: 'Cookie set!' }); 
}); 

...其中authenticate是驗證令牌的函數。

一切似乎罰款與我的響應頭:

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 

但是當我檢查源選項卡中有沒有被發現的cookie。我已閱讀關於關閉httpOnly和安全和使用本地主機的問題。我也嘗試過所有主流瀏覽器,但沒有運氣。

這是怎麼回事?

+0

你的cookie有'Max-Age = 360'(這意味着6分鐘)。它可能過期如此之快? –

+0

我已經嘗試過將其改爲幾小時和幾天,但仍然沒有運氣。 – Andrew

+0

正如我所看到的,你將要'http://127.0.0.1:4000'。它實際上是一個域,您的網頁打開?在交叉來源請求期間,您無法保存cookie。 –

回答

11

您遇到了一個有趣的案例。事情是fetch函數的行爲是不同的,而不是XMLHttpRequest。要使用fetch中的Cookie,您應該明確提供credentials選項。

fetch('http://127.0.0.1:4000/authorize-cookie', { 
    method: 'POST', 
    body: JSON.stringify({token: token}), 
    credentials: 'same-origin', // <- this is mandatory to deal with cookies 
}) 

根據the article on MDN

憑證:您要使用該請求的請求憑據:省略,相同來源,或包括。要爲當前域自動發送Cookie,必須提供此選項。