【问题标题】:Redirect to a URL fragment resets session on Chrome (Node/React/React-Router)重定向到 URL 片段会重置 Chrome 上的会话(Node/React/React-Router)
【发布时间】:2016-10-13 06:20:28
【问题描述】:

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

这意味着我的 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 如何处理 URL 片段和会话,是否有什么我不知道的地方。

【问题讨论】:

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


    【解决方案1】:

    所以经过 3 天的痛苦后,我解决了这个问题。

    原来显示错误行为的不是 Chrome,而是 Safari。

    我用于发出 XHR 请求的 library 不会将 cookie 与客户端请求一起发送到服务器,除非您包含以下选项:credentials: 'same-origin

    例如:

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

    看起来 safari 无论如何都会发送它们,这就是造成混乱的原因。希望这会对某人有所帮助。

    【讨论】:

    • 这也解释了为什么它适用于 api 请求,但不适用于来自 SPA 的请求,因为 SPA 请求是唯一使用 fetch 的请求,因此需要此选项
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-29
    • 2022-01-22
    • 2020-08-28
    • 2023-02-23
    • 1970-01-01
    • 2015-09-14
    • 1970-01-01
    相关资源
    最近更新 更多