Estoy trabajando en la aplicación de front-end de reacción y el middleware está escrito en nodejs. Estoy usando un token de acceso de autenticación que caduca en 3600 ms, por lo que necesito crear una sesión durante 7 días para que el usuario no cierre la sesión antes de 7 días.
¿Cuál es la forma de crear sesión? ¿Debo hacerlo en la aplicación de reacción o en la aplicación de nodo js?
PD: no queremos implementar el enfoque de token de actualización. ¿Alguna forma de configurar la sesión y es válida durante 7 días?
Puede usar un token de acceso + token de actualización para lograr esto. Use tokens de acceso más cortos y mantenga el vencimiento de 7d para el token de actualización.
Una vez que expire el token de acceso, puede actualizarlo pasando el token de actualización. Esto funcionará hasta que el vencimiento de su token de actualización sea de 7 días. Entonces el usuario tiene que iniciar sesión de nuevo.
Algo como lo siguiente.
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"); } };el punto final del token de actualización sería algo como esto
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 ) ); }); });