Backend geeft nu een 401 ipv. een 500 terug voor de 'expired jwt' fout
This commit is contained in:
		
							parent
							
								
									61c751c343
								
							
						
					
					
						commit
						c2f3a6169a
					
				
					 7 changed files with 132 additions and 5 deletions
				
			
		|  | @ -1,7 +1,9 @@ | ||||||
|  | import { HasStatusCode } from "./has-status-code"; | ||||||
|  | 
 | ||||||
| /** | /** | ||||||
|  * Exceptions which are associated with a HTTP error code. |  * Exceptions which are associated with a HTTP error code. | ||||||
|  */ |  */ | ||||||
| export abstract class ExceptionWithHttpState extends Error { | export abstract class ExceptionWithHttpState extends Error implements HasStatusCode { | ||||||
|     constructor( |     constructor( | ||||||
|         public status: number, |         public status: number, | ||||||
|         public error: string |         public error: string | ||||||
|  |  | ||||||
							
								
								
									
										6
									
								
								backend/src/exceptions/has-status-code.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								backend/src/exceptions/has-status-code.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,6 @@ | ||||||
|  | export interface HasStatusCode { | ||||||
|  |     status: number | ||||||
|  | } | ||||||
|  | export function hasStatusCode(err: unknown): err is HasStatusCode { | ||||||
|  |     return typeof err === 'object' && err !== null && 'status' in err && typeof (err as HasStatusCode)?.status === 'number'; | ||||||
|  | } | ||||||
|  | @ -48,14 +48,14 @@ const idpConfigs = { | ||||||
| const verifyJwtToken = expressjwt({ | const verifyJwtToken = expressjwt({ | ||||||
|     secret: async (_: express.Request, token: jwt.Jwt | undefined) => { |     secret: async (_: express.Request, token: jwt.Jwt | undefined) => { | ||||||
|         if (!token?.payload || !(token.payload as JwtPayload).iss) { |         if (!token?.payload || !(token.payload as JwtPayload).iss) { | ||||||
|             throw new Error('Invalid token'); |             throw new UnauthorizedException("Invalid token.") | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         const issuer = (token.payload as JwtPayload).iss; |         const issuer = (token.payload as JwtPayload).iss; | ||||||
| 
 | 
 | ||||||
|         const idpConfig = Object.values(idpConfigs).find((config) => config.issuer === issuer); |         const idpConfig = Object.values(idpConfigs).find((config) => config.issuer === issuer); | ||||||
|         if (!idpConfig) { |         if (!idpConfig) { | ||||||
|             throw new Error('Issuer not accepted.'); |             throw new UnauthorizedException('Issuer not accepted.'); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         const signingKey = await idpConfig.jwksClient.getSigningKey(token.header.kid); |         const signingKey = await idpConfig.jwksClient.getSigningKey(token.header.kid); | ||||||
|  |  | ||||||
|  | @ -1,11 +1,11 @@ | ||||||
| import { NextFunction, Request, Response } from 'express'; | import { NextFunction, Request, Response } from 'express'; | ||||||
| import { getLogger, Logger } from '../../logging/initalize.js'; | import { getLogger, Logger } from '../../logging/initalize.js'; | ||||||
| import { ExceptionWithHttpState } from '../../exceptions/exception-with-http-state.js'; | import { hasStatusCode } from '../../exceptions/has-status-code.js'; | ||||||
| 
 | 
 | ||||||
| const logger: Logger = getLogger(); | const logger: Logger = getLogger(); | ||||||
| 
 | 
 | ||||||
| export function errorHandler(err: unknown, _req: Request, res: Response, _: NextFunction): void { | export function errorHandler(err: unknown, _req: Request, res: Response, _: NextFunction): void { | ||||||
|     if (err instanceof ExceptionWithHttpState) { |     if (hasStatusCode(err)) { | ||||||
|         logger.warn(`An error occurred while handling a request: ${err} (-> HTTP ${err.status})`); |         logger.warn(`An error occurred while handling a request: ${err} (-> HTTP ${err.status})`); | ||||||
|         res.status(err.status).json(err); |         res.status(err.status).json(err); | ||||||
|     } else { |     } else { | ||||||
|  |  | ||||||
							
								
								
									
										4
									
								
								frontend/.gitignore
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								frontend/.gitignore
									
										
									
									
										vendored
									
									
								
							|  | @ -31,3 +31,7 @@ coverage | ||||||
| 
 | 
 | ||||||
| test-results/ | test-results/ | ||||||
| playwright-report/ | playwright-report/ | ||||||
|  | 
 | ||||||
|  | backend/dwengo | ||||||
|  | dwengo | ||||||
|  | idp_data/* | ||||||
|  |  | ||||||
							
								
								
									
										
											BIN
										
									
								
								idp_data/h2/keycloakdb.mv.db
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								idp_data/h2/keycloakdb.mv.db
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										115
									
								
								idp_data/h2/keycloakdb.trace.db
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										115
									
								
								idp_data/h2/keycloakdb.trace.db
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,115 @@ | ||||||
|  | 2025-03-02 00:00:38.381535Z jdbc[3]: exception | ||||||
|  | org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "MIGRATION_MODEL" not found (this database is empty); SQL statement: | ||||||
|  | SELECT ID, VERSION FROM MIGRATION_MODEL ORDER BY UPDATE_TIME DESC [42104-230] | ||||||
|  | 2025-03-02 00:00:39.164210Z jdbc[3]: exception | ||||||
|  | org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "DATABASECHANGELOG" not found (this database is empty); SQL statement: | ||||||
|  | SELECT COUNT(*) FROM PUBLIC.DATABASECHANGELOG [42104-230] | ||||||
|  | 2025-03-02 00:00:39.409343Z jdbc[4]: exception | ||||||
|  | org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "DATABASECHANGELOGLOCK" not found (this database is empty); SQL statement: | ||||||
|  | SELECT COUNT(*) FROM PUBLIC.DATABASECHANGELOGLOCK [42104-230] | ||||||
|  | 2025-03-02 00:00:39.441771Z jdbc[3]: exception | ||||||
|  | org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "DATABASECHANGELOG" not found; SQL statement: | ||||||
|  | SELECT COUNT(*) FROM PUBLIC.DATABASECHANGELOG [42102-230] | ||||||
|  | 2025-03-02 00:00:42.567135Z jdbc[3]: exception | ||||||
|  | org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "T.DETAILS_JSON" not found; SQL statement: | ||||||
|  | select t.DETAILS_JSON from PUBLIC.ADMIN_EVENT_ENTITY t where 0=1 [42122-230] | ||||||
|  | 	at org.h2.message.DbException.getJdbcSQLException(DbException.java:514) | ||||||
|  | 	at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) | ||||||
|  | 	at org.h2.message.DbException.get(DbException.java:223) | ||||||
|  | 	at org.h2.message.DbException.get(DbException.java:199) | ||||||
|  | 	at org.h2.expression.ExpressionColumn.getColumnException(ExpressionColumn.java:244) | ||||||
|  | 	at org.h2.expression.ExpressionColumn.optimizeOther(ExpressionColumn.java:226) | ||||||
|  | 	at org.h2.expression.ExpressionColumn.optimize(ExpressionColumn.java:213) | ||||||
|  | 	at org.h2.command.query.Select.prepareExpressions(Select.java:1228) | ||||||
|  | 	at org.h2.command.query.Query.prepare(Query.java:232) | ||||||
|  | 	at org.h2.command.Parser.prepareCommand(Parser.java:489) | ||||||
|  | 	at org.h2.engine.SessionLocal.prepareLocal(SessionLocal.java:644) | ||||||
|  | 	at org.h2.engine.SessionLocal.prepareCommand(SessionLocal.java:560) | ||||||
|  | 	at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1164) | ||||||
|  | 	at org.h2.jdbc.JdbcPreparedStatement.<init>(JdbcPreparedStatement.java:93) | ||||||
|  | 	at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:315) | ||||||
|  | 	at io.agroal.pool.wrapper.ConnectionWrapper.prepareStatement(ConnectionWrapper.java:647) | ||||||
|  | 	at liquibase.database.jvm.JdbcConnection.prepareStatement(JdbcConnection.java:443) | ||||||
|  | 	at liquibase.precondition.core.ColumnExistsPrecondition.makeSureColumnExistsInOtherDBs(ColumnExistsPrecondition.java:161) | ||||||
|  | 	at liquibase.precondition.core.ColumnExistsPrecondition.checkFast(ColumnExistsPrecondition.java:140) | ||||||
|  | 	at liquibase.precondition.core.ColumnExistsPrecondition.check(ColumnExistsPrecondition.java:83) | ||||||
|  | 	at liquibase.precondition.core.NotPrecondition.check(NotPrecondition.java:34) | ||||||
|  | 	at liquibase.precondition.core.AndPrecondition.check(AndPrecondition.java:39) | ||||||
|  | 	at liquibase.precondition.core.PreconditionContainer.check(PreconditionContainer.java:213) | ||||||
|  | 	at liquibase.changelog.ChangeSet.execute(ChangeSet.java:689) | ||||||
|  | 	at liquibase.changelog.visitor.UpdateVisitor.executeAcceptedChange(UpdateVisitor.java:119) | ||||||
|  | 	at liquibase.changelog.visitor.UpdateVisitor.visit(UpdateVisitor.java:68) | ||||||
|  | 	at liquibase.changelog.ChangeLogIterator.lambda$run$0(ChangeLogIterator.java:131) | ||||||
|  | 	at liquibase.Scope.lambda$child$0(Scope.java:191) | ||||||
|  | 	at liquibase.Scope.child(Scope.java:200) | ||||||
|  | 	at liquibase.Scope.child(Scope.java:190) | ||||||
|  | 	at liquibase.Scope.child(Scope.java:169) | ||||||
|  | 	at liquibase.changelog.ChangeLogIterator.lambda$run$1(ChangeLogIterator.java:120) | ||||||
|  | 	at liquibase.Scope.lambda$child$0(Scope.java:191) | ||||||
|  | 	at liquibase.Scope.child(Scope.java:200) | ||||||
|  | 	at liquibase.Scope.child(Scope.java:190) | ||||||
|  | 	at liquibase.Scope.child(Scope.java:169) | ||||||
|  | 	at liquibase.Scope.child(Scope.java:257) | ||||||
|  | 	at liquibase.Scope.child(Scope.java:261) | ||||||
|  | 	at liquibase.changelog.ChangeLogIterator.run(ChangeLogIterator.java:89) | ||||||
|  | 	at liquibase.command.core.AbstractUpdateCommandStep.lambda$run$0(AbstractUpdateCommandStep.java:113) | ||||||
|  | 	at liquibase.Scope.lambda$child$0(Scope.java:191) | ||||||
|  | 	at liquibase.Scope.child(Scope.java:200) | ||||||
|  | 	at liquibase.Scope.child(Scope.java:190) | ||||||
|  | 	at liquibase.Scope.child(Scope.java:169) | ||||||
|  | 	at liquibase.command.core.AbstractUpdateCommandStep.run(AbstractUpdateCommandStep.java:111) | ||||||
|  | 	at liquibase.command.core.UpdateCommandStep.run(UpdateCommandStep.java:105) | ||||||
|  | 	at liquibase.command.CommandScope.execute(CommandScope.java:220) | ||||||
|  | 	at liquibase.Liquibase.lambda$update$0(Liquibase.java:216) | ||||||
|  | 	at liquibase.Scope.lambda$child$0(Scope.java:191) | ||||||
|  | 	at liquibase.Scope.child(Scope.java:200) | ||||||
|  | 	at liquibase.Scope.child(Scope.java:190) | ||||||
|  | 	at liquibase.Scope.child(Scope.java:169) | ||||||
|  | 	at liquibase.Liquibase.runInScope(Liquibase.java:1290) | ||||||
|  | 	at liquibase.Liquibase.update(Liquibase.java:205) | ||||||
|  | 	at liquibase.Liquibase.update(Liquibase.java:188) | ||||||
|  | 	at liquibase.Liquibase.update(Liquibase.java:175) | ||||||
|  | 	at org.keycloak.quarkus.runtime.storage.database.liquibase.QuarkusJpaUpdaterProvider.updateChangeSet(QuarkusJpaUpdaterProvider.java:190) | ||||||
|  | 	at org.keycloak.quarkus.runtime.storage.database.liquibase.QuarkusJpaUpdaterProvider.update(QuarkusJpaUpdaterProvider.java:105) | ||||||
|  | 	at org.keycloak.quarkus.runtime.storage.database.liquibase.QuarkusJpaUpdaterProvider.update(QuarkusJpaUpdaterProvider.java:83) | ||||||
|  | 	at org.keycloak.quarkus.runtime.storage.database.jpa.QuarkusJpaConnectionProviderFactory.update(QuarkusJpaConnectionProviderFactory.java:281) | ||||||
|  | 	at org.keycloak.quarkus.runtime.storage.database.jpa.QuarkusJpaConnectionProviderFactory.createOrUpdateSchema(QuarkusJpaConnectionProviderFactory.java:247) | ||||||
|  | 	at org.keycloak.quarkus.runtime.storage.database.jpa.QuarkusJpaConnectionProviderFactory.postInit(QuarkusJpaConnectionProviderFactory.java:124) | ||||||
|  | 	at org.keycloak.services.DefaultKeycloakSessionFactory.initializeProviders(DefaultKeycloakSessionFactory.java:168) | ||||||
|  | 	at org.keycloak.services.DefaultKeycloakSessionFactory.initializeProviders(DefaultKeycloakSessionFactory.java:165) | ||||||
|  | 	at org.keycloak.services.DefaultKeycloakSessionFactory.initProviderFactories(DefaultKeycloakSessionFactory.java:145) | ||||||
|  | 	at org.keycloak.services.DefaultKeycloakSessionFactory.initProviderFactories(DefaultKeycloakSessionFactory.java:126) | ||||||
|  | 	at org.keycloak.quarkus.runtime.integration.QuarkusKeycloakSessionFactory.init(QuarkusKeycloakSessionFactory.java:87) | ||||||
|  | 	at org.keycloak.quarkus.runtime.integration.jaxrs.QuarkusKeycloakApplication.createSessionFactory(QuarkusKeycloakApplication.java:67) | ||||||
|  | 	at org.keycloak.services.resources.KeycloakApplication.startup(KeycloakApplication.java:89) | ||||||
|  | 	at org.keycloak.quarkus.runtime.integration.jaxrs.QuarkusKeycloakApplication.onStartupEvent(QuarkusKeycloakApplication.java:52) | ||||||
|  | 	at org.keycloak.quarkus.runtime.integration.jaxrs.QuarkusKeycloakApplication_Observer_onStartupEvent_GNZ8m5QenZ9h9VNelo7awjUZFDE.notify(Unknown Source) | ||||||
|  | 	at io.quarkus.arc.impl.EventImpl$Notifier.notifyObservers(EventImpl.java:351) | ||||||
|  | 	at io.quarkus.arc.impl.EventImpl$Notifier.notify(EventImpl.java:333) | ||||||
|  | 	at io.quarkus.arc.impl.EventImpl.fire(EventImpl.java:80) | ||||||
|  | 	at io.quarkus.arc.runtime.ArcRecorder.fireLifecycleEvent(ArcRecorder.java:156) | ||||||
|  | 	at io.quarkus.arc.runtime.ArcRecorder.handleLifecycleEvents(ArcRecorder.java:107) | ||||||
|  | 	at io.quarkus.deployment.steps.LifecycleEventsBuildStep$startupEvent1144526294.deploy_0(Unknown Source) | ||||||
|  | 	at io.quarkus.deployment.steps.LifecycleEventsBuildStep$startupEvent1144526294.deploy(Unknown Source) | ||||||
|  | 	at io.quarkus.runner.ApplicationImpl.doStart(Unknown Source) | ||||||
|  | 	at io.quarkus.runtime.Application.start(Application.java:101) | ||||||
|  | 	at io.quarkus.runtime.ApplicationLifecycleManager.run(ApplicationLifecycleManager.java:119) | ||||||
|  | 	at io.quarkus.runtime.Quarkus.run(Quarkus.java:71) | ||||||
|  | 	at org.keycloak.quarkus.runtime.KeycloakMain.start(KeycloakMain.java:145) | ||||||
|  | 	at org.keycloak.quarkus.runtime.cli.Picocli.start(Picocli.java:941) | ||||||
|  | 	at org.keycloak.quarkus.runtime.cli.command.AbstractStartCommand.run(AbstractStartCommand.java:49) | ||||||
|  | 	at picocli.CommandLine.executeUserObject(CommandLine.java:2030) | ||||||
|  | 	at picocli.CommandLine.access$1500(CommandLine.java:148) | ||||||
|  | 	at picocli.CommandLine$RunLast.executeUserObjectOfLastSubcommandWithSameParent(CommandLine.java:2465) | ||||||
|  | 	at picocli.CommandLine$RunLast.handle(CommandLine.java:2457) | ||||||
|  | 	at picocli.CommandLine$RunLast.handle(CommandLine.java:2419) | ||||||
|  | 	at picocli.CommandLine$AbstractParseResultHandler.execute(CommandLine.java:2277) | ||||||
|  | 	at picocli.CommandLine$RunLast.execute(CommandLine.java:2421) | ||||||
|  | 	at picocli.CommandLine.execute(CommandLine.java:2174) | ||||||
|  | 	at org.keycloak.quarkus.runtime.cli.Picocli.parseAndRun(Picocli.java:130) | ||||||
|  | 	at org.keycloak.quarkus.runtime.KeycloakMain.main(KeycloakMain.java:116) | ||||||
|  | 	at org.keycloak.quarkus.runtime.KeycloakMain.main(KeycloakMain.java:71) | ||||||
|  | 	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) | ||||||
|  | 	at java.base/java.lang.reflect.Method.invoke(Method.java:580) | ||||||
|  | 	at io.quarkus.bootstrap.runner.QuarkusEntryPoint.doRun(QuarkusEntryPoint.java:62) | ||||||
|  | 	at io.quarkus.bootstrap.runner.QuarkusEntryPoint.main(QuarkusEntryPoint.java:33) | ||||||
		Reference in a new issue
	
	 Gerald Schmittinger
						Gerald Schmittinger