From df899369aa5a68a14e9e4809767e07f38bafdc5d Mon Sep 17 00:00:00 2001
From: razzanYoni <13521087@mahasiswa.itb.ac.id>
Date: Tue, 14 Nov 2023 17:15:06 +0700
Subject: [PATCH] fix : resolve auth

---
 src/errors/standard-error.ts    |  6 ++++++
 src/middlewares/verify-token.ts | 32 ++++++++++++++++++--------------
 2 files changed, 24 insertions(+), 14 deletions(-)

diff --git a/src/errors/standard-error.ts b/src/errors/standard-error.ts
index 1a3546a..9667545 100644
--- a/src/errors/standard-error.ts
+++ b/src/errors/standard-error.ts
@@ -10,6 +10,7 @@ enum ErrorType {
   ACCESS_TOKEN_MISSING,
   ACCESS_TOKEN_EXPIRED,
   ACCESS_TOKEN_NOT_ACTIVE,
+  INVALID_SIGNATURE,
   AUTHORIZATION_HEADER_NOT_SET,
   FINGERPRINT_MISSING,
   ALBUM_NOT_FOUND,
@@ -70,6 +71,11 @@ class StandardError {
         this.status = StatusCodes.UNAUTHORIZED;
         break;
 
+      case ErrorType.INVALID_SIGNATURE:
+        this.title = "Your access token is invalid."
+        this.status = StatusCodes.UNAUTHORIZED;
+        break;
+
       case ErrorType.AUTHORIZATION_HEADER_NOT_SET:
         this.title = "Authorization header not set."
         this.status = StatusCodes.UNAUTHORIZED;
diff --git a/src/middlewares/verify-token.ts b/src/middlewares/verify-token.ts
index 82d2257..137a4a2 100644
--- a/src/middlewares/verify-token.ts
+++ b/src/middlewares/verify-token.ts
@@ -1,5 +1,5 @@
 import { NextFunction, Request, Response } from "express";
-import jwt, { NotBeforeError, TokenExpiredError } from "jsonwebtoken";
+import jwt, {JsonWebTokenError, NotBeforeError, TokenExpiredError} from "jsonwebtoken";
 import { ErrorType, StandardError } from "../errors/standard-error";
 import { hashFingerprint } from "../utils/token";
 
@@ -22,26 +22,26 @@ const verifyFingerprint = async (
 };
 
 const verifyToken = async (req: Request, res: Response, next: NextFunction) => {
+  try {
   // Authorization Bearer ${accessToken}
-  const authHeader = req.headers.authorization;
+    const authHeader = req.headers.authorization;
 
-  if (!authHeader) {
-    throw new StandardError(ErrorType.AUTHORIZATION_HEADER_NOT_SET);
-  }
+    if (!authHeader) {
+      throw new StandardError(ErrorType.AUTHORIZATION_HEADER_NOT_SET);
+    }
 
-  const accessToken = authHeader.split(" ")[1];
+    const accessToken = authHeader.split(" ")[1];
 
-  if (!accessToken) {
-    throw new StandardError(ErrorType.ACCESS_TOKEN_MISSING);
-  }
+    if (!accessToken) {
+      throw new StandardError(ErrorType.ACCESS_TOKEN_MISSING);
+    }
 
-  const fingerprint = req.cookies["__Secure-fingerprint"];
+    const fingerprint = req.cookies["__Secure-fingerprint"];
 
-  if (!fingerprint) {
-    throw new StandardError(ErrorType.FINGERPRINT_MISSING);
-  }
+    if (!fingerprint) {
+      throw new StandardError(ErrorType.FINGERPRINT_MISSING);
+    }
 
-  try {
     const decodedPayload = jwt.verify(
       accessToken,
       process.env.JWT_SHARED_SECRET as string,
@@ -61,6 +61,10 @@ const verifyToken = async (req: Request, res: Response, next: NextFunction) => {
       next(new StandardError(ErrorType.ACCESS_TOKEN_EXPIRED));
     } else if (error instanceof NotBeforeError) {
       next(new StandardError(ErrorType.ACCESS_TOKEN_NOT_ACTIVE));
+    } else if (error instanceof JsonWebTokenError) {
+        next(new StandardError(ErrorType.INVALID_SIGNATURE));
+    } else if (error instanceof StandardError) {
+        next(error);
     }
     // unknown error
     next(error);
-- 
GitLab