重定向到网址片段会重置Chrome上的会话(节点/ React / React-Router)

时间:2016-06-12 21:58:25

标签: node.js google-chrome express reactjs react-router

我有一个应用程序在后端使用节点并在前端做出反应(使用哈希历史记录)。

这意味着我的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如何处理网址碎片和会话的内容。

1 个答案:

答案 0 :(得分:0)

所以在经历了3天的痛苦之后,我已经解决了这个问题。

原来并不是Chrome表现出不正确的行为,而是Safari。

我用于发出XHR请求的library不会通过客户端请求向服务器发送Cookie,除非您包含选项:credentials: 'same-origin

例如:

fetch(endpoint, { method, headers, credentials: 'same-origin' })
    .then(res => {
        // do something
    });

看起来safari正在发送它们,这是造成混乱的原因。希望这会对某人有所帮助。