[英]How to create session in nodejs + react
我正在研究 React 前端应用程序,中间件是用 nodejs 编写的。 我正在使用 oauth 访问令牌,它会在 3600 毫秒后过期,所以我需要创建 session 7 天,这样用户就不会在 7 天之前注销。
session的创建方法是什么? 我需要在反应应用程序或 node.js 应用程序中做吗?
PS 我们不想实施刷新令牌方法。 有什么方法可以设置 session 且有效期为 7 天?
您可以使用访问令牌 + 刷新令牌来实现此目的。 使用较短的访问令牌并保持刷新令牌的 7 天到期。
访问令牌过期后,您可以通过传递刷新令牌来刷新它。 这将一直有效,直到您的刷新令牌到期 7 天。 然后用户必须重新登录。
像下面这样的东西。
export const generateAccessToken = (user: UserResponse): string => {
return jwt.sign(
{
userId: user.user_id,
clientId: user.client_id,
createdAt: new Date().getTime(),
storageKey: user.storageKey ?? "",
pipelineKey: user.pipelineKey ?? "",
},
process.env.ACCESS_TOKEN_SECRET,
{ expiresIn: `3600s` }
);
};
export const generateRefreshToken = async (
user: UserResponse
): Promise<string> => {
const refreshTOken = jwt.sign(
{
userId: user.user_id,
},
process.env.REFRESH_TOKEN_SECRET,
{ expiresIn: `7d` }
);
const status = await storeRefreshToken(user.user_id, refreshTOken);
if (status) {
return refreshTOken;
} else {
throw new Error("Error while storing refresh token");
}
};
刷新令牌端点将是这样的
authRouter.post("/refresh-token", async (request: any, response: any) => {
await transformAndValidate(RefreshTokenRequestDto, request.body)
.then(async (refreshTokenRequest: any) => {
if (authenticateRefreshToken(refreshTokenRequest.refreshToken)) {
const dbRefreshToken = await getRefreshTokenByToken(
refreshTokenRequest.refreshToken
);
if (
dbRefreshToken &&
dbRefreshToken.user_id &&
dbRefreshToken.active &&
dbRefreshToken.expiry_at >= new Date()
) {
const user = await getUserById(dbRefreshToken.user_id);
if (user) {
const jwtToken = generateAccessToken(user);
response.status(200).send(
generateSuccessResponse({
accessToken: jwtToken,
refreshToken: dbRefreshToken.token,
fullName: user.username,
})
);
} else {
return response
.status(400)
.json(
generateFailedResponse(
"Invalid User",
AppCodes.REFRESHTOKENFAIL
)
);
}
} else {
return response
.status(400)
.json(
generateFailedResponse(
"Refresh Token Failed",
AppCodes.REFRESHTOKENFAIL
)
);
}
} else {
return response
.status(400)
.json(
generateFailedResponse(
"Refresh Token JWT Validation Failed",
AppCodes.REFRESHTOKENFAIL
)
);
}
})
.catch((err) => {
response
.status(400)
.json(
generateFailedResponse(
formatValidationErrorMsg(err),
AppCodes.VALIDATIONFAILED
)
);
});
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.