JTI Validation entry with id 'accesstoken-7503b000-fcd8-438e-a0ac-c76694b6756c' is expired #544
Replies: 2 comments 1 reply
-
|
It looks like you are running into two related problems in the MVD deployment, both caused by expired JWTs that are still stored in the JTI validation table ( The important error is:ERROR: duplicate key value violates unique constraint "edc_jti_validation_pkey"
Key (token_id)=... already exists.This means:
This behaviour typically appears after some weeks because self-issued ID tokens in the MVD have a relatively long TTL and eventually all components begin rejecting them at the same time. Why this breaks the deploymentWhen an expired token is re-used:
This is expected if the environment hasn't rotated its key material or cleaned old JTIs. How to Fix the Issue :1. Clear the JTI validation tableOn the PostgreSQL database used by identity-hub and controlplane: DELETE FROM edc_jti_validation;This is safe it only contains short-lived token IDs. After clearing it, restart:
This usually resolves the issue immediately. 2. Check that your system time is correctIf NTP drifted and the server time is off by >1–2 minutes, JWTs will be seen as invalid. Verify: timedatectl status`If needed: sudo timedatectl set-ntp true3. Rotate keys / restart MVD after long uptimeThe MVD uses self-issued ID tokens signed by ephemeral keys. A full restart of all MVD services forces:
4. (Optional) Reduce JTI expiry timeIn your MVD config you can set: edc.iam.identitytrust.validation.jti.ttl=300This ensures expired entries are cleaned more aggressively. |
Beta Was this translation helpful? Give feedback.
-
|
The issue still exists: The steps I followed: 1) I cleared the edc_jti_validation table in Consumer and Provider Postgres running: DELETE FROM edc_jti_validation; 2) I restarted the pods: running the following commands:
But I still have error messages in the following pods: The logs in provider postgres: 2025-12-04 11:45:52.885 UTC [3795522] ERROR: duplicate key value violates unique constraint "edc_jti_validation_pkey" The logs in consumer identity hub: WARNING 2025-12-06T07:39:43.213572677 JTI Validation entry with id 'accesstoken-f3fbf885-fa4e-4f7c-adb1-25ec882ae367' is expired The logs in consumer control plane: DEBUG 2025-12-06T07:11:32.866273339 [ExecutionManager] The following work item has errored out. Will re-queue after a delay of 10 seconds: [WorkItem{id='did:web:provider-identityhub%3A7083:provider', url='http://provider-catalog-server-controlplane:8082/api/dsp', protocolName='dataspace-protocol-http', errors=[org.eclipse.edc.spi.EdcException: {"@type":"dspace:CatalogError","dspace:code":"401","dspace:reason":"Unauthorized","@context":{"dcat":"http://www.w3.org/ns/dcat#","dct":"http://purl.org/dc/terms/","odrl":"http://www.w3.org/ns/odrl/2/","dspace":"https://w3id.org/dspace/v0.8/","@vocab":"https://w3id.org/edc/v0.0.1/ns/","edc":"https://w3id.org/edc/v0.0.1/ns/"}}, org.eclipse.edc.spi.EdcException: {"@type":"dspace:CatalogError","dspace:code":"401","dspace:reason":"Unauthorized","@context":{"dcat":"http://www.w3.org/ns/dcat#","dct":"http://purl.org/dc/terms/","odrl":"http://www.w3.org/ns/odrl/2/","dspace":"https://w3id.org/dspace/v0.8/","@vocab":"https://w3id.org/edc/v0.0.1/ns/","edc":"https://w3id.org/edc/v0.0.1/ns/"}}]}] The logs in provider qna control plane: DEBUG 2025-12-06T05:35:46.558057185 [DEMO] Node filter: skipping node 'did:web:provider-identityhub%3A7083:provider' for participant 'did:web:provider-identityhub%3A7083:provider' |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
-
Hi all,
I have deployed the Minimum Viable Dataspace (MVD) in a Linux environment. Initially, the MVD operated without any issues. However, after a few weeks, the following error messages appeared:
In the consumer-identityhub the following message is continually displayed:
WARNING 2025-10-30T07:26:11.828112717 JTI Validation entry with id 'accesstoken-7503b000-fcd8-438e-a0ac-c76694b6756c' is expired
WARNING 2025-10-30T07:26:29.572117121 JTI Validation entry with id 'accesstoken-ce46bd21-ac4a-4b28-b4ac-d43836107ad4' is expired
WARNING 2025-10-30T07:26:36.396340248 JTI Validation entry with id 'accesstoken-f3a6f26c-c541-42d6-88d5-77b41f25ceaa' is expired
WARNING 2025-10-30T07:27:00.574569119 JTI Validation entry with id 'accesstoken-ce46bd21-ac4a-4b28-b4ac-d43836107ad4' is expired
WARNING 2025-10-30T07:27:32.575145914 JTI Validation entry with id 'accesstoken-ce46bd21-ac4a-4b28-b4ac-d43836107ad4' is expired
WARNING 2025-10-30T07:28:06.577922692 JTI Validation entry with id 'accesstoken-ce46bd21-ac4a-4b28-b4ac-d43836107ad4' is expired
WARNING 2025-10-30T07:28:44.58836785 JTI Validation entry with id 'accesstoken-ce46bd21-ac4a-4b28-b4ac-d43836107ad4' is expired
......
In provider-catalog-server the following error message is displayed:
DEBUG 2025-10-30T07:35:56.806433272 DSP: Incoming CatalogRequestMessage for class org.eclipse.edc.connector.controlplane.catalog.spi.Catalog process
DEBUG 2025-10-30T07:35:56.807144044 Unauthorized: Token has expired (exp)
DEBUG 2025-10-30T07:35:56.807169968 DSP: Service call failed: Unauthorized
DEBUG 2025-10-30T07:35:56.808548064 DSP: Incoming CatalogRequestMessage for class org.eclipse.edc.connector.controlplane.catalog.spi.Catalog process
Also In provider-qna-controlplane , the following error messages is displayed:
DEBUG 2025-10-30T07:40:22.945046053 DSP: Incoming CatalogRequestMessage for class org.eclipse.edc.connector.controlplane.catalog.spi.Catalog process
SEVERE 2025-10-30T07:40:23.950390504 JerseyExtension: Unexpected exception caught
org.eclipse.edc.spi.persistence.EdcPersistenceException: ERROR: duplicate key value violates unique constraint "edc_jti_validation_pkey"
Detail: Key (token_id)=(7ddcdccf-2f86-48a1-b1ee-4a74d199e111) already exists.
at org.eclipse.edc.sql.SqlQueryExecutor.execute(SqlQueryExecutor.java:59)
at org.eclipse.edc.jtivalidation.store.sql.SqlJtiValidationStore.lambda$storeEntry$0(SqlJtiValidationStore.java:55)
at org.eclipse.edc.transaction.local.LocalTransactionContext.execute(LocalTransactionContext.java:74)
at org.eclipse.edc.jtivalidation.store.sql.SqlJtiValidationStore.storeEntry(SqlJtiValidationStore.java:48)
at org.eclipse.edc.verifiablecredentials.jwt.rules.JtiValidationRule.checkRule(JtiValidationRule.java:48)
at org.eclipse.edc.token.TokenValidationServiceImpl.lambda$validate$2(TokenValidationServiceImpl.java:65)
at java.base/java.util.stream.ReferencePipeline$3$1.accept(Unknown Source)
at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(Unknown Source)
at java.base/java.util.stream.AbstractPipeline.copyInto(Unknown Source)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source)
at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(Unknown Source)
at java.base/java.util.stream.AbstractPipeline.evaluate(Unknown Source)
at java.base/java.util.stream.ReferencePipeline.reduce(Unknown Source)
at org.eclipse.edc.token.TokenValidationServiceImpl.validate(TokenValidationServiceImpl.java:66)
at org.eclipse.edc.iam.identitytrust.core.validation.SelfIssueIdTokenValidationAction.apply(SelfIssueIdTokenValidationAction.java:53)
at org.eclipse.edc.iam.identitytrust.core.validation.SelfIssueIdTokenValidationAction.apply(SelfIssueIdTokenValidationAction.java:33)
at org.eclipse.edc.iam.identitytrust.service.IdentityAndTrustService.verifyJwtToken(IdentityAndTrustService.java:138)
at org.eclipse.edc.connector.controlplane.services.protocol.ProtocolTokenValidatorImpl.verify(ProtocolTokenValidatorImpl.java:66)
at org.eclipse.edc.connector.controlplane.services.spi.protocol.ProtocolTokenValidator.verify(ProtocolTokenValidator.java:42)
at org.eclipse.edc.connector.controlplane.services.catalog.CatalogProtocolServiceImpl.lambda$getCatalog$1(CatalogProtocolServiceImpl.java:60)
at org.eclipse.edc.transaction.local.LocalTransactionContext.execute(LocalTransactionContext.java:74)
at org.eclipse.edc.connector.controlplane.services.catalog.CatalogProtocolServiceImpl.getCatalog(CatalogProtocolServiceImpl.java:60)
at org.eclipse.edc.protocol.dsp.http.message.DspRequestHandlerImpl.createResource(DspRequestHandlerImpl.java:132)
at org.eclipse.edc.protocol.dsp.catalog.http.api.controller.BaseDspCatalogApiController.requestCatalog(BaseDspCatalogApiController.java:84)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory.lambda$static$0(ResourceMethodInvocationHandlerFactory.java:52)
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:146)
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:189)
at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$ResponseOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:176)
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:93)
at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:478)
at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:400)
at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:81)
at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:274)
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:248)
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:244)
at org.glassfish.jersey.internal.Errors.process(Errors.java:292)
at org.glassfish.jersey.internal.Errors.process(Errors.java:274)
at org.glassfish.jersey.internal.Errors.process(Errors.java:244)
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:266)
at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:253)
at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:696)
at org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:397)
at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:349)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:358)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:312)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:205)
at org.eclipse.jetty.ee10.servlet.ServletHolder.handle(ServletHolder.java:736)
at org.eclipse.jetty.ee10.servlet.ServletHandler$ChainEnd.doFilter(ServletHandler.java:1622)
at org.eclipse.jetty.ee10.servlet.ServletHandler$MappedServlet.handle(ServletHandler.java:1555)
at org.eclipse.jetty.ee10.servlet.ServletChannel.dispatch(ServletChannel.java:823)
at org.eclipse.jetty.ee10.servlet.ServletChannel.handle(ServletChannel.java:440)
at org.eclipse.jetty.ee10.servlet.ServletHandler.handle(ServletHandler.java:470)
at org.eclipse.jetty.server.handler.ContextHandler.handle(ContextHandler.java:1071)
at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:181)
at org.eclipse.jetty.server.Server.handle(Server.java:182)
at org.eclipse.jetty.server.internal.HttpChannelState$HandlerInvoker.run(HttpChannelState.java:678)
at org.eclipse.jetty.server.internal.HttpConnection.onFillable(HttpConnection.java:416)
at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:322)
at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:99)
at org.eclipse.jetty.io.SelectableChannelEndPoint$1.run(SelectableChannelEndPoint.java:53)
at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.runTask(AdaptiveExecutionStrategy.java:480)
at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.consumeTask(AdaptiveExecutionStrategy.java:443)
at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.tryProduce(AdaptiveExecutionStrategy.java:293)
at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.run(AdaptiveExecutionStrategy.java:201)
at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:311)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:981)
at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.doRunJob(QueuedThreadPool.java:1211)
at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1166)
at java.base/java.lang.Thread.run(Unknown Source)
Caused by: org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "edc_jti_validation_pkey"
Detail: Key (token_id)=(7ddcdccf-2f86-48a1-b1ee-4a74d199e111) already exists.
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2734)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2421)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:372)
at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:518)
at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:435)
at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:196)
at org.postgresql.jdbc.PgPreparedStatement.execute(PgPreparedStatement.java:182)
at org.eclipse.edc.sql.SqlQueryExecutor.execute(SqlQueryExecutor.java:57)
... 70 more
DEBUG 2025-10-30T07:40:24.954300206 DSP: Incoming CatalogRequestMessage for class org.eclipse.edc.connector.controlplane.catalog.spi.Catalog process
WARNING 2025-10-30T07:40:24.957743189 JTI Validation entry with id '7ddcdccf-2f86-48a1-b1ee-4a74d199e111' is expired
Beta Was this translation helpful? Give feedback.
All reactions