refactor(backend): Magic values vervangen door constanten.
This commit is contained in:
		
							parent
							
								
									f2449969a7
								
							
						
					
					
						commit
						03c6ada0e5
					
				
					 2 changed files with 39 additions and 11 deletions
				
			
		
							
								
								
									
										13
									
								
								backend/src/exceptions.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								backend/src/exceptions.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,13 @@ | ||||||
|  | export class UnauthorizedException extends Error { | ||||||
|  |     status = 401; | ||||||
|  |     constructor(message: string = "Unauthorized") { | ||||||
|  |         super(message); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | export class ForbiddenException extends Error { | ||||||
|  |     status = 403; | ||||||
|  |     constructor(message: string = "Forbidden") { | ||||||
|  |         super(message); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -6,11 +6,26 @@ import * as express from "express"; | ||||||
| import * as jwt from "jsonwebtoken"; | import * as jwt from "jsonwebtoken"; | ||||||
| import {AuthenticatedRequest} from "./authenticated-request.js"; | import {AuthenticatedRequest} from "./authenticated-request.js"; | ||||||
| import {AuthenticationInfo} from "./authentication-info.js"; | import {AuthenticationInfo} from "./authentication-info.js"; | ||||||
|  | import {ForbiddenException, UnauthorizedException} from "../../exceptions"; | ||||||
|  | 
 | ||||||
|  | const JWKS_CACHE = true; | ||||||
|  | const JWKS_RATE_LIMIT = true; | ||||||
|  | const REQUEST_PROPERTY_FOR_JWT_PAYLOAD = "jwtPayload"; | ||||||
|  | const JWT_ALGORITHM = "RS256"; // Not configurable via env vars since supporting other algorithms would
 | ||||||
|  |                                         // require additional libraries to be added.
 | ||||||
|  | 
 | ||||||
|  | const JWT_PROPERTY_NAMES = { | ||||||
|  |     username: "preferred_username", | ||||||
|  |     firstName: "given_name", | ||||||
|  |     lastName: "family_name", | ||||||
|  |     name: "name", | ||||||
|  |     email: "email" | ||||||
|  | }; | ||||||
| 
 | 
 | ||||||
| function createJwksClient(uri: string): jwksClient.JwksClient { | function createJwksClient(uri: string): jwksClient.JwksClient { | ||||||
|     return jwksClient({ |     return jwksClient({ | ||||||
|         cache: true, |         cache: JWKS_CACHE, | ||||||
|         rateLimit: true, |         rateLimit: JWKS_RATE_LIMIT, | ||||||
|         jwksUri: uri, |         jwksUri: uri, | ||||||
|     }); |     }); | ||||||
| } | } | ||||||
|  | @ -49,9 +64,9 @@ const verifyJwtToken = expressjwt({ | ||||||
|         return signingKey.getPublicKey(); |         return signingKey.getPublicKey(); | ||||||
|     }, |     }, | ||||||
|     audience: getEnvVar(EnvVars.IdpAudience), |     audience: getEnvVar(EnvVars.IdpAudience), | ||||||
|     algorithms: ["RS256"], |     algorithms: [JWT_ALGORITHM], | ||||||
|     credentialsRequired: false, |     credentialsRequired: false, | ||||||
|     requestProperty: "jwtPayload" |     requestProperty: REQUEST_PROPERTY_FOR_JWT_PAYLOAD | ||||||
| }); | }); | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  | @ -73,11 +88,11 @@ function getAuthenticationInfo(req: AuthenticatedRequest): AuthenticationInfo | | ||||||
|     } |     } | ||||||
|     return { |     return { | ||||||
|         accountType: accountType, |         accountType: accountType, | ||||||
|         username: req.jwtPayload["preferred_username"]!, |         username: req.jwtPayload[JWT_PROPERTY_NAMES.username]!, | ||||||
|         name: req.jwtPayload["name"], |         name: req.jwtPayload[JWT_PROPERTY_NAMES.name], | ||||||
|         firstName: req.jwtPayload["given_name"], |         firstName: req.jwtPayload[JWT_PROPERTY_NAMES.firstName], | ||||||
|         lastName: req.jwtPayload["family_name"], |         lastName: req.jwtPayload[JWT_PROPERTY_NAMES.lastName], | ||||||
|         email: req.jwtPayload["email"], |         email: req.jwtPayload[JWT_PROPERTY_NAMES.email], | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -101,9 +116,9 @@ export const authenticateUser = [verifyJwtToken, addAuthenticationInfo]; | ||||||
| export const authorize = (accessCondition: (auth: AuthenticationInfo) => boolean) => { | export const authorize = (accessCondition: (auth: AuthenticationInfo) => boolean) => { | ||||||
|     return (req: AuthenticatedRequest, res: express.Response, next: express.NextFunction): void => { |     return (req: AuthenticatedRequest, res: express.Response, next: express.NextFunction): void => { | ||||||
|         if (!req.auth) { |         if (!req.auth) { | ||||||
|             res.status(401).json({ message: "Unauthorized" }); |             throw new UnauthorizedException(); | ||||||
|         } else if (!accessCondition(req.auth)) { |         } else if (!accessCondition(req.auth)) { | ||||||
|             res.status(403).json({ message: "Forbidden" }); |             throw new ForbiddenException(); | ||||||
|         } else { |         } else { | ||||||
|             next(); |             next(); | ||||||
|         } |         } | ||||||
|  |  | ||||||
		Reference in a new issue
	
	 Gerald Schmittinger
						Gerald Schmittinger