首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Nextjs &自定义Express服务器-无法访问express服务器中使用` `http: true`设置的cookie

Nextjs &自定义Express服务器-无法访问express服务器中使用` `http: true`设置的cookie
EN

Stack Overflow用户
提问于 2021-04-30 17:39:02
回答 2查看 214关注 0票数 0

我正在尝试解析一个cookie,该cookie是通过在我的自定义express服务器上包含属性httpOnly: true来设置的。

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

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

代码语言:javascript
代码运行次数:0
运行
复制
    // 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的方法:

代码语言:javascript
代码运行次数:0
运行
复制
res.cookie('rtk', refreshTokenJWT.token, {
    httpOnly: true,
})

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

代码语言:javascript
代码运行次数:0
运行
复制
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,所以这行不通。

EN

回答 2

Stack Overflow用户

发布于 2021-05-09 14:28:23

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

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

下面是我在我的作者的单元测试中所做的返回值,听起来与您的需求非常相似;我总是得到两个逗号分隔的单行格式的Cookie,就像我的Koa RESTful应用程序发出的那样(您的快速设置可以像这样用逗号分隔,或者发送两个Set-Cookie,所以如果是后一种情况,您可能需要稍微修改一下。)

代码语言:javascript
代码运行次数:0
运行
复制
// 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有关的任何事情。

票数 0
EN

Stack Overflow用户

发布于 2021-05-09 15:00:56

名称为getServerSideProps,,表示它生成的是服务器端

getServerSideProps中执行fetch时,没有任何默认cookies。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67331598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档