【问题标题】:Nextjs & custom Express server - cannot access cookie set with `http: true` in the express server [duplicate]Nextjs 和自定义 Express 服务器 - 无法访问 Express 服务器中使用“http:true”设置的 cookie [重复]
【发布时间】:2021-07-23 15:52:38
【问题描述】:

我正在尝试解析通过在我的自定义快递服务器上包含属性 httpOnly: true 设置的 cookie

现在在我的 NextJs 应用程序中,我可以在服务器端方法 getServerSideProps 中获取 cookie,并从那里访问 ctx.req.cookies 中的 cookie。但是当我对自定义服务器进行 fetch api 调用(从服务器端方法)时,自定义服务器 api 调用中似乎无法访问 cookie。

这是我在server.ts 中的express 配置:

    // Express Configuration
    app.set('port', process.env.PORT || 3000)
    app.use(cors({ credentials: true, origin: true }))
    app.use(cookieParser())
    app.use(passport.initialize())
    app.use(express.json())
    app.use(express.urlencoded({ extended: true }))

这就是我在自定义快递服务器上设置 cookie 的方式:

res.cookie('rtk', refreshTokenJWT.token, {
    httpOnly: true,
})

这是来自 getServerSideProps 方法的 fetch api 调用:

const response = await fetch('http://localhost:3000/refresh_token', {
    credentials: 'include',
    method: 'POST',
})

也许是因为我必须使用绝对 url 进行 api 调用,当我尝试执行 fetch('/refresh_token', ...) 时,我收到错误:TypeError: Only absolute URLs are supported

我可以从request body 中的服务器端方法发送有效负载并在自定义快递服务器中处理它,但这似乎不是最好的解决方案。

请帮忙,在此先感谢。

编辑:澄清一下,await fetch() 发生在 nextjs 的服务器端方法 getServerSideProps 中。

按照@O 的建议,在fetch api 调用中将cookie 作为标头发送。琼斯有效,但我的印象是这行不通,因为我设置了httpOnly: true

【问题讨论】:

标签: node.js express cookies next.js


【解决方案1】:

尽管存在 httponly 属性,但您必须并且被允许解析该服务器响应标头。

为什么?因为HttpOnly (owasp link) 只是对浏览器的一个指令, 应该强制隔离;当您的客户端代码只是另一个 node.js 进程时,它只是一个响应标头。

这是我在身份验证单元测试中所做的反刍,听起来与您的需求非常相似;正如我的 Koa RESTful 应用程序所发出的那样,我总是得到两个以逗号分隔的一种衬里格式的 cookie(您的 Express 设置可以像这样以逗号分隔,或者发送两个 Set-Cookie,因此您可能需要稍作改动如果你有后一种情况。)

// raw's format is `koa.sess=YA5N/yI1KhKc/qyylgNduj8vK3e2; path=/; expires=Sun, 09 May 2021 05:17:19 GMT; secure; httponly, koa.sess.sig=8x1BraqjAvKryLx1fvgc0DBu5D4; path=/; expires=Sun, 09 May 2021 05:17:19 GMT; secure; httponly`;
const scp = require('set-cookie-parser');
const cookies = scp.parse(scp.splitCookiesString(headers['set-cookie']));
const next_request_headers = {
    cookie: cookies.map(cookie => cookie.name + '=' + cookie.value).join('; ')
};

我使用 npm:set-cookie-parser 是因为 cookies are jank 并且我厌倦了在过期和分隔符中处理逗号。

附带问题:abs URLs

TypeError:仅支持绝对 URL

在将相对 URL 规范化为绝对 URL 之后应用 Cookie 域规则,所以在我看来,这个附带问题只是关于节点样式的获取,没有浏览器样式的相对 ajax URL 所需的隐式服务器/路径,并且不会阻止与 cookie 相关的任何事情。

【讨论】:

    【解决方案2】:

    getServerSideProps,顾名思义,就是生成服务器端

    当您在getServerSideProps 中进行提取时,您没有任何默认 cookie。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-21
      • 2020-04-08
      • 1970-01-01
      • 1970-01-01
      • 2011-07-04
      • 2023-03-11
      • 1970-01-01
      • 2012-05-19
      相关资源
      最近更新 更多