我正在尝试解析一个cookie,该cookie是通过在我的自定义express服务器上包含属性httpOnly: true
来设置的。
现在,在我的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
中发送来自服务器端方法的有效负载,然后在自定义express服务器中处理它,但这似乎不是最好的解决方案。
请帮助,提前谢谢。
编辑:为了澄清,await fetch()
发生在nextjs的服务器端方法getServerSideProps
中。
按照@O.Jones的建议,在fetch
应用程序接口调用中将cookie作为标头发送是可行的,但我的印象是,由于我设置了httpOnly: true
,所以这行不通。
发布于 2021-05-09 14:28:23
尽管存在httponly属性,但您必须并被允许解析该服务器响应头。
为什么?因为HttpOnly (owasp link)只是告诉浏览器应该强制实施这种隔离的指令;当您的客户端代码只是另一个node.js进程时,它只是一个响应头。
下面是我在我的作者的单元测试中所做的返回值,听起来与您的需求非常相似;我总是得到两个逗号分隔的单行格式的Cookie,就像我的Koa RESTful应用程序发出的那样(您的快速设置可以像这样用逗号分隔,或者发送两个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 URL
TypeError:仅支持绝对URL
Cookie域规则是在相对URL被规范化为绝对URL之后应用的,所以在我看来,这个次要问题只是关于节点样式的抓取,没有浏览器样式的相对ajax URL所需的隐式服务器/路径,并且不会阻塞与Cookie有关的任何事情。
发布于 2021-05-09 15:00:56
名称为getServerSideProps,,表示它生成的是服务器端
在getServerSideProps
中执行fetch时,没有任何默认cookies。
https://stackoverflow.com/questions/67331598
复制相似问题