【问题标题】:httpOnly cookie not getting sent with request from getInitialProps [Next.js]httpOnly cookie 未随 getInitialProps [Next.js] 的请求一起发送
【发布时间】:2020-01-11 18:52:02
【问题描述】:

我正在从服务器设置一个httpOnly cookie (jwtToken),它正在前端设置。我可以在 devTools 中看到 cookie。

现在,如果我使用以下代码从 getInitalProps 向服务器发出请求,

  const data = await fetch(`${process.env.API_URL}/me`, {
    credentials: 'include',
  }).then((res) => res.json());

jwtToken cookie 不会随请求一起发送。

我也试过这样做

  const data = await fetch(`${process.env.API_URL}/me`, {
    credentials: 'include',
    headers: {
      cookie:  context.req.headers.cookie
    },
  }).then((res) => res.json());

但效果并不好。

但是,当我从useEffect 发出相同的请求时 它完美地工作。谁能帮我把jwtTokengetInitialProps发送到服务器吗?

【问题讨论】:

    标签: reactjs express next.js


    【解决方案1】:

    实际问题是缺少来自context.req.headers.cookiejwtToken cookie。它可以在本地主机上工作,但不能在生产环境上工作。

    解决这个问题的方法是在你的 cookie 上设置domain。因此,如果前端位于 example.com 且 API 服务器位于 api.exmaple.com 上,则将域设置为 .example.com 即可解决此问题。

    res.cookie('jwtToken', token, { httpOnly: true, domain: '.example.com'});

    【讨论】:

      【解决方案2】:

      关于何时调用 getInitialProps 存在很多混淆。

      有 2 个上下文调用它:

      1. 服务器端,当初始页面被渲染时。这意味着您的客户端在请求中发送 cookie,您需要将其转发给“服务器到服务器”请求。

      2. 客户端,在第二页(客户端导航)。这意味着浏览器将 cookie 附加到 ajax 请求中。

      Component.getInitailProps = async context => {
        const data = await fetch(`${process.env.API_URL}/me`, {
          credentials: 'include', // tells the browser to attach cookies
          ...(context.req
            ? {
                headers: {
                  Cookie: Object.entries(context.req.headers.cookie)
                    .map(([key, value]) => `${key}=${value}`)
                    .join('; '),
                },
              }
            : {}),
        }).then(res => res.json());
      };
      

      对于服务器端,您需要传递一个字符串,因此,我使用Array.map 构造cookie 字符串。

      【讨论】:

      • 嗨@felixmosh!谢谢您的答复。我试过了,它仍然不起作用,原因是jwtToken cookie 不在context.req.headers.cookie 中,但它在浏览器 devTools 中。真正的问题是context.req.headers.cookie 中没有httpOnly cookie。上下文中存在其他非 httpOnly cookie。
      • 你能指定它在哪一侧不适合你,服务器它客户端(或两者)?
      • 对于我的情况它有效,但我不得不将其更改为Cookie: context.req.headers.cookie,谢谢@felixmosh
      猜你喜欢
      • 1970-01-01
      • 2012-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-17
      • 2013-10-18
      • 2017-06-20
      • 2019-10-12
      相关资源
      最近更新 更多