From 977dd9827e3a3c01762bb7296c7828c7689e2b89 Mon Sep 17 00:00:00 2001 From: yuri-silveiraa Date: Wed, 22 May 2024 13:48:14 -0300 Subject: [PATCH] feat: add middleware auth-jwt --- src/middlewares/auth/auth-jwt.test.ts | 2 +- src/middlewares/auth/auth-jwt.ts | 2 +- src/shared/infra/jwt/jwt.test.ts | 17 +++++++++-------- src/shared/infra/jwt/jwt.ts | 25 ++++++++----------------- 4 files changed, 19 insertions(+), 27 deletions(-) diff --git a/src/middlewares/auth/auth-jwt.test.ts b/src/middlewares/auth/auth-jwt.test.ts index b6ab0eb..728c451 100644 --- a/src/middlewares/auth/auth-jwt.test.ts +++ b/src/middlewares/auth/auth-jwt.test.ts @@ -81,7 +81,7 @@ describe('jwtAuth middleware', () => { }); it('should return status code 401 with error message invalid token', async () => { - const token = 'token'; + const token = 'invalidToken'; req = { headers: { authorization: `Bearer ${token}` } }; diff --git a/src/middlewares/auth/auth-jwt.ts b/src/middlewares/auth/auth-jwt.ts index 03f877d..04870d8 100644 --- a/src/middlewares/auth/auth-jwt.ts +++ b/src/middlewares/auth/auth-jwt.ts @@ -16,7 +16,7 @@ export class AuthenticationJWT { } const payload = this.jwtHelper.parseToken(token); - if (!payload) { + if (payload instanceof Error) { return res.status(401).json({ error: 'Invalid token' }); } diff --git a/src/shared/infra/jwt/jwt.test.ts b/src/shared/infra/jwt/jwt.test.ts index 8cb096f..f69a331 100644 --- a/src/shared/infra/jwt/jwt.test.ts +++ b/src/shared/infra/jwt/jwt.test.ts @@ -1,4 +1,5 @@ import { JWTHelper } from './jwt.js'; +import type { TokenPayload } from './jwt.js'; describe('JWTHelper', () => { const secretKey = '123'; @@ -14,18 +15,17 @@ describe('JWTHelper', () => { }); describe('refreshToken', () => { + const token = jwt.createToken(payload); + it('should refresh token', () => { - const token = jwt.createToken(payload); const newToken = jwt.refreshToken(token); const exist = newToken ? true : false; expect(exist).toBeTruthy(); - expect(newToken).not.toBe(token); }); it('should not refresh an invalid token', () => { - const invalidToken = 'invalidToken'; - const newToken = jwt.refreshToken(invalidToken); + const newToken = jwt.refreshToken('invalidToken'); expect(newToken).toBe('invalid token'); }); @@ -34,16 +34,17 @@ describe('JWTHelper', () => { describe('parseToken', () => { it('should parse a valid token', () => { const token = jwt.createToken(payload); - const parsedPayload = jwt.parseToken(token); + const parsedPayload = jwt.parseToken(token) as TokenPayload; - expect(parsedPayload?.userId).toContain(payload.userId); + expect(parsedPayload?.userId).toBe(payload.userId); }); - it('should return null for an invalid token', () => { + it('should return error for an invalid token', () => { const invalidToken = 'invalidToken'; const parsedPayload = jwt.parseToken(invalidToken); + const error = new Error('Invalid token'); - expect(parsedPayload).toBeNull(); + expect(parsedPayload).toEqual(error); }); }); }); diff --git a/src/shared/infra/jwt/jwt.ts b/src/shared/infra/jwt/jwt.ts index bb44df0..80e565c 100644 --- a/src/shared/infra/jwt/jwt.ts +++ b/src/shared/infra/jwt/jwt.ts @@ -1,37 +1,28 @@ import jwt from 'jsonwebtoken'; -interface TokenPayload { +export interface TokenPayload { userId: string; } export class JWTHelper { - private secretKey: string; - - constructor(secretKey: string) { - this.secretKey = secretKey; - } + constructor(private readonly secretKey: string) {} createToken(token: TokenPayload, expiresIn: string = '1h'): string { return jwt.sign(token, this.secretKey, { expiresIn }); } - parseToken(token: string): null | TokenPayload { + parseToken(token: string): Error | TokenPayload { try { const payload = jwt.verify(token, this.secretKey) as TokenPayload; return payload; } catch { - return null; + return new Error('Invalid token'); } } - refreshToken(token: string): Error | string { - try { - const payload = this.parseToken(token); - if (!payload) return 'invalid token'; - return this.createToken(payload); - } catch { - const message = new Error('error creating token'); - return message; - } + refreshToken(token: string): string { + const payload = this.parseToken(token); + if (payload instanceof Error) return 'invalid token'; + return jwt.sign(payload, this.secretKey); } }