在我的 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
并执行未经授权的错误。
不幸的是,我不知道如何正确解决它。我也不知道这是否是实际问题。
好吧,我浪费了一天时间来调试这个。问题是我没有包含一个单词,那就是 SvelteKit 操作中的
{ fetch }
。
所以这里没有使用SvelteKits内部的
fetch
,而是使用浏览器标准的。
这就是为什么它不起作用哈哈