我有两个简单的身份验证回调函数"jwt“和" session”,它们检查用户对象是否存在,如果存在则创建会话。
callbacks: {
jwt: async ({ token, user }) => {
if(user) {
token.id = user.id
}
return token
},
session: ({ session, token }) => {
if(token) {
session.id = token.id
}
return session
},
}
我的问题是,我已经搜索了很多相关的信息,为什么这个jwt不自动保存到cookie中呢?
我发现我的会话是创建的,我已经成功地“登录”了,但是如果我查看我的本地存储,就没有保存jwt cookie。
是否必须在jwt回调中手动将jwt保存到cookie中?还是jwt会话策略中甚至不需要jwt cookie?我需要jwt,因为据我所读到的中间件,大多数解决方案使用cookies并解密jwt来查看用户是否登录,而不是检查getSession()钩子。
发布于 2022-09-28 20:28:02
您可能需要更详细地解释您的问题,因为为了简单起见,我不能真正说明您已经实现了什么,而忽略了什么。我希望这对你有帮助:
添加cookie的步骤大致如下所示:
import { SignJWT, jwtVerify, JWTVerifyResult } from "jose";
async function setCookie(response, user: {id: number}) {
const token = await generateJwtToken(user);
response.setHeader("Set-Cookie", [
`user=${token};` +
"expires=" + new Date(new Date().getTime() + 1 * 86409000).toUTCString() + ";"
]);
response.status(200).json({message: "Successfully set cookie"})
}
async function generateJwtToken(user: { id: number }) {
return await new SignJWT({id: user.id})
.setProtectedHeader({ alg: "HS256" })
.setIssuedAt()
.setExpirationTime("24h")
.sign(new TextEncoder().encode(process.env.YOUR_JWT_TOKEN_ENV_VAR));
}
export async function verifyJwt(request) {
const token = request.cookies["yourCustomUser"];
const verified: JWTVerifyResult = await jwtVerify(
token,
new TextEncoder().encode(process.env.YOUR_JWT_TOKEN_ENV_VAR),
);
verified.payload.status = 200;
return verified.payload;
}
除此之外,您可能还需要添加sameSite=Strict、secure或path=/。要了解更多信息,您应该查看developers.mozilla,并确保添加过期Jwts等的错误处理。
https://stackoverflow.com/questions/73885959
复制相似问题