logout.ts 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import { Request, Response, NextFunction } from "express";
  2. import createHttpError from "http-errors";
  3. import HttpCode from "@server/types/HttpCode";
  4. import response from "@server/lib/response";
  5. import logger from "@server/logger";
  6. import {
  7. createBlankSessionTokenCookie,
  8. invalidateSession
  9. } from "@server/auth/sessions/app";
  10. import { verifySession } from "@server/auth/sessions/verifySession";
  11. import config from "@server/lib/config";
  12. export async function logout(
  13. req: Request,
  14. res: Response,
  15. next: NextFunction
  16. ): Promise<any> {
  17. const { user, session } = await verifySession(req);
  18. if (!user || !session) {
  19. if (config.getRawConfig().app.log_failed_attempts) {
  20. logger.info(
  21. `Log out failed because missing or invalid session. IP: ${req.ip}.`
  22. );
  23. }
  24. return next(
  25. createHttpError(
  26. HttpCode.BAD_REQUEST,
  27. "You must be logged in to sign out"
  28. )
  29. );
  30. }
  31. try {
  32. try {
  33. await invalidateSession(session.sessionId);
  34. } catch (error) {
  35. logger.error("Failed to invalidate session", error)
  36. }
  37. const isSecure = req.protocol === "https";
  38. res.setHeader("Set-Cookie", createBlankSessionTokenCookie(isSecure));
  39. return response<null>(res, {
  40. data: null,
  41. success: true,
  42. error: false,
  43. message: "Logged out successfully",
  44. status: HttpCode.OK
  45. });
  46. } catch (error) {
  47. logger.error(error);
  48. return next(
  49. createHttpError(HttpCode.INTERNAL_SERVER_ERROR, "Failed to log out")
  50. );
  51. }
  52. }