仅使用 HTTP 会话 cookie 的跨源 POST 请求

问题描述 投票:0回答:1

在我的 fastify 应用程序中,我有一个钩子可以捕获

auth_session
以查看用户是否获得授权:

fastify.addHook('preHandler', async (req, reply) => {
        const sessionId =
            req.cookies[fastify.lucia.luciaInstance.sessionCookieName]

        console.log(`SESSIONID --------------- ${sessionId}`)

        if (sessionId) {
            const { session, user } =
                await fastify.lucia.luciaInstance.validateSession(sessionId)

            if (session && session.fresh) {
                const cookie = fastify.lucia.luciaInstance.createSessionCookie(
                    session.id
                )
                reply.setCookie(cookie.name, cookie.value, cookie.attributes)
            }

            if (!session) {
                reply.clearCookie(fastify.lucia.luciaInstance.sessionCookieName)
            }

            req.user = user
            req.session = session
        } else {
            req.user =
                process.env.NODE_ENV === 'test'
                    ? { id: 'qkj7ld6pgsqvurgfxaao' }
                    : null
            req.session = null
        }
    })

fastify.addHook('preHandler', async (req, reply) => {
        if (
            !req.user &&
            !req.session &&
            !req.url.includes('/account/login') &&
            process.env.NODE_ENV !== 'test'
        ) {
            return reply.unauthorized()
        }
    })

当我通过 Swagger UI 向

/api/v1/websites
发出 POST 请求并且有一个活动会话时,一切都会按预期进行。数据被发布到数据库。

但是,当我从 SvelteKit 应用程序发出 POST 请求时,如下所示:

createWebsite: async ({ request }) => {
        const data = await request.formData()

        await fetch('http://localhost:3000/api/v1/websites', {
            method: 'POST',
            credentials: 'include',
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify({
                title: data.get('title'),
                metaDescription: data.get('description')
            })
        })
    }

我收到错误

UnauthorizedError: Unauthorized

我在钩子中添加了一个

console.log
来记录
sessionId
变量,我注意到,当我从 SvelteKit 发出请求时,我连续得到两个日志结果,第一个是
undefined
,然后是右边
sessionId
。从 fastify 服务器上的 swagger UI 中,我只得到适当的
sessionId
,没有未定义的。

当我从 SvelteKit 发出

GET
请求时,我没有遇到此未经授权的问题,并且
auth_session
cookie 似乎工作得很好。

我在网上读到,在 CORS 中,在实际的 POST 请求之前发送了一些 PREFLIGHT 请求,并怀疑这最终会导致

undefined
并执行未经授权的错误。

不幸的是,我不知道如何正确解决它。我也不知道这是否是实际问题。

rest http cors sveltekit fastify
1个回答
0
投票

好吧,我浪费了一天时间来调试这个。问题是我没有包含一个单词,那就是 SvelteKit 操作中的

{ fetch }

所以这里没有使用SvelteKits内部的

fetch
,而是使用浏览器标准的。

这就是为什么它不起作用哈哈

© www.soinside.com 2019 - 2024. All rights reserved.