我有一个应用程序在后端使用节点并在前端做出反应(使用哈希历史记录)。
这意味着我的api端点URL如下所示:
https://example.com/api/login
我的反应端点都是来自根的片段:
https://example.com/#/somePage
在(通过OAuth2)登录用户后,我想将用户重定向到React SPA中的特定URL片段。
我首先想到的是让服务器将我重定向到URL片段。
我的路由处理程序类似于:
app.get('/oauthCallback', (req, res) => {
req.session.token = 'some token'
redirect('/#/someLoggedInPage')
}
在Safari中,此工作正常,并且从SPA发出的任何进一步的API请求都共享相同的req.session,因此具有令牌并可以进行经过身份验证的下游请求。
但是,在Chrome中,重定向后,下一个API请求会导致创建新会话,从而丢失令牌并阻止经过身份验证的请求成功。
重定向到另一个api端点(不在SPA中)时,一切正常。
如果我重定向到SPA的根目录/
,它也不起作用。
我想知道是否有一些我不知道Chrome如何处理网址碎片和会话的内容。
答案 0 :(得分:0)
所以在经历了3天的痛苦之后,我已经解决了这个问题。
原来并不是Chrome表现出不正确的行为,而是Safari。
我用于发出XHR请求的library不会通过客户端请求向服务器发送Cookie,除非您包含选项:credentials: 'same-origin
。
例如:
fetch(endpoint, { method, headers, credentials: 'same-origin' })
.then(res => {
// do something
});
看起来safari正在发送它们,这是造成混乱的原因。希望这会对某人有所帮助。