This is an automated email from the ASF dual-hosted git repository.
fjtiradosarti pushed a commit to branch main
in repository
https://gitbox.apache.org/repos/asf/incubator-kie-kogito-runtimes.git
The following commit(s) were added to refs/heads/main by this push:
new f130cc0869 Issue-1899 Add JWT token parsing support for SonataFlow
workflows (#4021)
f130cc0869 is described below
commit f130cc08699da2d309f2fc0e2fa5e9ff4da9905a
Author: ishanjogi89 <[email protected]>
AuthorDate: Wed Nov 26 21:31:42 2025 +0530
Issue-1899 Add JWT token parsing support for SonataFlow workflows (#4021)
* Introducing jwt parser handler and associated classes
* Add missing Apache license headers to JWT parser files
- Added Apache license header to FunctionTypeHandler service file
- Added Apache license header to quarkus-extension.yaml
Fixes review comments from @gmunozfe in PR #4021
Signed-off-by: Ishan Jogi <[email protected]>
* Fix PR review comments: simplify type handler, add end-to-end tests
- Simplified JwtParserTypeHandler following CamelWorkItemTypeHandler pattern
- Removed getActionNode override, moved operation parsing to
fillWorkItemHandler
- Removed manual metadata handling as it should be automatic
- Added comprehensive end-to-end integration tests with real JWT tokens
- Added kogito-test-utils dependency for ProcessInstancesRESTTestUtils
- Tests now verify complete workflow execution with JWT parsing
Addresses review comments from fjtirado and wmedvede in PR #4021
Signed-off-by: Ishan Jogi <[email protected]>
* Improve JwtParserIT to follow TokenExchangeIT pattern
- Changed @QuarkusTest to @QuarkusIntegrationTest following serverless
workflow integration test patterns
- Added assertProcessInstanceNotExists check to verify process cleanup like
TokenExchangeIT
- Now fully matches the integration test pattern referenced by wmedvede in
PR review
Addresses wmedvede's review comment about following TokenExchangeIT example
Signed-off-by: Ishan Jogi <[email protected]>
* Optimize JwtTokenParser per fjtirado review feedback
- Use ObjectMapperFactory.get() singleton instead of creating new
ObjectMapper
- Avoid unnecessary string conversion by parsing bytes directly
- More concise and efficient JWT parsing implementation
- Removes unused imports (StandardCharsets, ObjectMapper)
Addresses fjtirado's review comment about making the parsing block more
concise
Signed-off-by: Ishan Jogi <[email protected]>
* Optimize JWT padding logic with StringBuilder
- Use StringBuilder instead of string concatenation in loop to avoid
creating multiple string objects
- Use char literal '=' instead of string "=" for better performance
- Call toString() only once at the end for Base64 decoding
- More efficient memory usage during JWT token padding
Addresses fjtirado's review comment about improving the padding block
Signed-off-by: Ishan Jogi <[email protected]>
* Use constant for Bearer prefix to improve safety and maintainability
- Add private static final String BEARER = "Bearer " constant at class level
- Use BEARER.length() instead of hardcoded 7 for safer substring operation
- Eliminates magic string and makes code more maintainable
- Prevents potential typos and makes intent clearer
Addresses fjtirado's review comment about safer Bearer prefix handling
Signed-off-by: Ishan Jogi <[email protected]>
* Fix integration tests based on wmedvede review comments
- Remove @Inject JwtTokenParser from @QuarkusIntegrationTest (not supported)
- Remove unit tests, focus only on end-to-end workflow tests
- Simplify tests for one-shot workflows (results immediately available)
- Use assertProcessInstanceNotExists for process cleanup verification
- Add WorkItemHandlerFactory pattern for proper handler registration
- Fix runtime dependencies to avoid extension conflicts
- Add quarkus-rest dependencies for REST endpoint generation
- Follow TokenExchangeIT pattern for integration testing
Signed-off-by: Ishan Jogi <[email protected]>
* [FLPATH-2212] : improving the pom structure
* Fix work item handler registration by removing CDI dependency
- Changed JwtParserWorkItemHandler and JwtTokenParser to plain Java classes
(no CDI)
- Updated JwtParserWorkItemHandlerFactory to directly instantiate handlers
- Removed bean registration from JwtParserProcessor (handlers discovered
via ServiceLoader)
- This fixes the 'Could not find work item handler for jwt-parser' runtime
error
Signed-off-by: Ishan Jogi <[email protected]>
* Trigger CI rebuild
Signed-off-by: Ishan Jogi <[email protected]>
* [apache/incubator-kie-issues#1899] Fix JWT parser handler registration
and test workflow
- Override getName() method in JwtParserWorkItemHandler to return
'jwt-parser'
- Remove workItem.getId() call that throws UnsupportedOperationException
- Simplify workflow and test to directly access parsed JWT claims in
workflowdata
- All integration tests now pass successfully
Signed-off-by: Ishan Jogi <[email protected]>
* [apache/incubator-kie-issues#1899] Complete JWT parser addon with loan
approval workflow example
- Add realistic loan approval workflow demonstrating personalized response
- Update integration tests to verify both JWT parsing and personalized
message
- All tests pass successfully
Signed-off-by: Ishan Jogi <[email protected]>
---------
Signed-off-by: Ishan Jogi <[email protected]>
---
quarkus/addons/jwt-parser/deployment/pom.xml | 75 +++++++++++++
.../addons/jwt/deployment/JwtParserProcessor.java | 36 +++++++
.../addons/jwt-parser/integration-tests/pom.xml | 94 ++++++++++++++++
.../src/main/resources/application.properties | 7 ++
.../src/main/resources/jwt-example.sw.json | 43 ++++++++
.../org/kie/kogito/addons/jwt/it/JwtParserIT.java | 103 ++++++++++++++++++
quarkus/addons/{ => jwt-parser}/pom.xml | 72 +++----------
quarkus/addons/jwt-parser/runtime/pom.xml | 96 +++++++++++++++++
.../kogito/addons/jwt/JwtParserTypeHandler.java | 53 +++++++++
.../addons/jwt/JwtParserWorkItemHandler.java | 104 ++++++++++++++++++
.../jwt/JwtParserWorkItemHandlerFactory.java | 36 +++++++
.../org/kie/kogito/addons/jwt/JwtTokenParser.java | 118 +++++++++++++++++++++
.../main/resources/META-INF/quarkus-extension.yaml | 34 ++++++
...l.process.workitem.KogitoWorkItemHandlerFactory | 21 ++++
....serverless.workflow.parser.FunctionTypeHandler | 20 ++++
quarkus/addons/pom.xml | 1 +
16 files changed, 858 insertions(+), 55 deletions(-)
diff --git a/quarkus/addons/jwt-parser/deployment/pom.xml
b/quarkus/addons/jwt-parser/deployment/pom.xml
new file mode 100644
index 0000000000..4eb8692b94
--- /dev/null
+++ b/quarkus/addons/jwt-parser/deployment/pom.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <parent>
+ <artifactId>sonataflow-addons-quarkus-jwt-parser-parent</artifactId>
+ <groupId>org.apache.kie.sonataflow</groupId>
+ <version>999-SNAPSHOT</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+
+ <properties>
+
<java.module.name>org.kie.kogito.addons.quarkus.jwt.deployment</java.module.name>
+ </properties>
+
+ <name>SonataFlow :: Add-Ons :: Quarkus :: JWT Parser :: Deployment</name>
+ <description>SonataFlow Quarkus JWT Token Parser for Serverless
Workflow</description>
+ <artifactId>sonataflow-addons-quarkus-jwt-parser-deployment</artifactId>
+ <dependencies>
+ <dependency>
+ <groupId>io.quarkus</groupId>
+ <artifactId>quarkus-arc-deployment</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.kie.sonataflow</groupId>
+ <artifactId>sonataflow-addons-quarkus-jwt-parser</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>io.quarkus</groupId>
+ <artifactId>quarkus-junit5-internal</artifactId>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+ <build>
+ <plugins>
+ <plugin>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <annotationProcessorPaths>
+ <path>
+ <groupId>io.quarkus</groupId>
+ <artifactId>quarkus-extension-processor</artifactId>
+ <version>${version.io.quarkus}</version>
+ </path>
+ </annotationProcessorPaths>
+ <compilerArgs>
+ <arg>-AlegacyConfigRoot=true</arg>
+ </compilerArgs>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+
+</project>
diff --git
a/quarkus/addons/jwt-parser/deployment/src/main/java/org/kie/kogito/addons/jwt/deployment/JwtParserProcessor.java
b/quarkus/addons/jwt-parser/deployment/src/main/java/org/kie/kogito/addons/jwt/deployment/JwtParserProcessor.java
new file mode 100644
index 0000000000..e2c4447ccc
--- /dev/null
+++
b/quarkus/addons/jwt-parser/deployment/src/main/java/org/kie/kogito/addons/jwt/deployment/JwtParserProcessor.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.kie.kogito.addons.jwt.deployment;
+
+import io.quarkus.deployment.annotations.BuildStep;
+import io.quarkus.deployment.builditem.FeatureBuildItem;
+
+/**
+ * Quarkus deployment processor for JWT parser functionality
+ * The JWT parser work item handlers are discovered via ServiceLoader and
don't require CDI bean registration
+ */
+public class JwtParserProcessor {
+
+ private static final String FEATURE = "sonataflow-addons-jwt-parser";
+
+ @BuildStep
+ FeatureBuildItem feature() {
+ return new FeatureBuildItem(FEATURE);
+ }
+}
diff --git a/quarkus/addons/jwt-parser/integration-tests/pom.xml
b/quarkus/addons/jwt-parser/integration-tests/pom.xml
new file mode 100644
index 0000000000..b23bbce0da
--- /dev/null
+++ b/quarkus/addons/jwt-parser/integration-tests/pom.xml
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <parent>
+ <artifactId>sonataflow-addons-quarkus-jwt-parser-parent</artifactId>
+ <groupId>org.apache.kie.sonataflow</groupId>
+ <version>999-SNAPSHOT</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+
+
<artifactId>sonataflow-addons-quarkus-jwt-parser-integration-tests</artifactId>
+ <name>SonataFlow :: Add-Ons :: Quarkus :: JWT Parser :: Integration
Tests</name>
+
+ <properties>
+
<java.module.name>org.kie.kogito.addons.quarkus.jwt.integration.tests</java.module.name>
+ </properties>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.kie.sonataflow</groupId>
+ <artifactId>sonataflow-quarkus</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.kie.sonataflow</groupId>
+ <artifactId>sonataflow-addons-quarkus-jwt-parser</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>io.quarkus</groupId>
+ <artifactId>quarkus-rest</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>io.quarkus</groupId>
+ <artifactId>quarkus-rest-jackson</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>io.quarkus</groupId>
+ <artifactId>quarkus-junit5</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>io.rest-assured</groupId>
+ <artifactId>rest-assured</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.assertj</groupId>
+ <artifactId>assertj-core</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.kie.kogito</groupId>
+ <artifactId>kogito-test-utils</artifactId>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>io.quarkus</groupId>
+ <artifactId>quarkus-maven-plugin</artifactId>
+ <executions>
+ <execution>
+ <goals>
+ <goal>build</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+</project>
diff --git
a/quarkus/addons/jwt-parser/integration-tests/src/main/resources/application.properties
b/quarkus/addons/jwt-parser/integration-tests/src/main/resources/application.properties
new file mode 100644
index 0000000000..f27758dc5d
--- /dev/null
+++
b/quarkus/addons/jwt-parser/integration-tests/src/main/resources/application.properties
@@ -0,0 +1,7 @@
+# JWT Parser Integration Test Configuration
+quarkus.log.level=INFO
+quarkus.log.category."org.kie.kogito.addons.jwt".level=DEBUG
+quarkus.http.test-port=0
+
+# SonataFlow configuration
+kogito.sw.functions.timeout.default=PT30S
diff --git
a/quarkus/addons/jwt-parser/integration-tests/src/main/resources/jwt-example.sw.json
b/quarkus/addons/jwt-parser/integration-tests/src/main/resources/jwt-example.sw.json
new file mode 100644
index 0000000000..48658f7d60
--- /dev/null
+++
b/quarkus/addons/jwt-parser/integration-tests/src/main/resources/jwt-example.sw.json
@@ -0,0 +1,43 @@
+{
+ "id": "jwt_example",
+ "version": "1.0",
+ "name": "JWT Token Processing Example",
+ "description": "Demonstrates JWT token parsing functionality as requested in
Issue apache/incubator-kie-issues#1899",
+ "start": "extractUser",
+ "functions": [
+ {
+ "name": "extractUser",
+ "type": "custom",
+ "operation": "jwt-parser:extractUser"
+ }
+ ],
+ "states": [
+ {
+ "name": "extractUser",
+ "type": "operation",
+ "actions": [
+ {
+ "name": "extractUserAction",
+ "functionRef": {
+ "refName": "extractUser",
+ "arguments": {
+ "token": "${
$WORKFLOW.headers.\"X-Authorization-acme_financial_auth\" }"
+ }
+ }
+ }
+ ],
+ "transition": "approveLoan"
+ },
+ {
+ "name": "approveLoan",
+ "type": "inject",
+ "data": {
+ "loanApproved": true
+ },
+ "stateDataFilter": {
+ "output": "${ { preferred_username, sub, email, iat, loanApproved,
message: (\"Congrats \" + .preferred_username + \"! Your loan has been
approved!\") } }"
+ },
+ "end": true
+ }
+ ]
+}
diff --git
a/quarkus/addons/jwt-parser/integration-tests/src/test/java/org/kie/kogito/addons/jwt/it/JwtParserIT.java
b/quarkus/addons/jwt-parser/integration-tests/src/test/java/org/kie/kogito/addons/jwt/it/JwtParserIT.java
new file mode 100644
index 0000000000..f19bf559c7
--- /dev/null
+++
b/quarkus/addons/jwt-parser/integration-tests/src/test/java/org/kie/kogito/addons/jwt/it/JwtParserIT.java
@@ -0,0 +1,103 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.kie.kogito.addons.jwt.it;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.jupiter.api.Test;
+
+import io.quarkus.test.junit.QuarkusIntegrationTest;
+import io.restassured.path.json.JsonPath;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static
org.kie.kogito.test.utils.ProcessInstancesRESTTestUtils.assertProcessInstanceNotExists;
+import static
org.kie.kogito.test.utils.ProcessInstancesRESTTestUtils.newProcessInstance;
+
+/**
+ * Integration tests for JWT Parser functionality
+ * Tests the complete workflow with JWT token parsing as requested in Issue
#1899
+ */
+@QuarkusIntegrationTest
+class JwtParserIT {
+
+ // Valid JWT token for testing (contains:
{"sub":"1234567890","preferred_username":"johndoe","email":"[email protected]","iat":1516239022})
+ private static final String VALID_JWT_TOKEN =
+
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwicHJlZmVycmVkX3VzZXJuYW1lIjoiam9obmRvZSIsImVtYWlsIjoiam9obmRvZUBleGFtcGxlLmNvbSIsImlhdCI6MTUxNjIzOTAyMn0.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c";
+
+ /**
+ * End-to-end test that verifies the JWT parser works within a complete
SonataFlow workflow.
+ * This test demonstrates the feature working as requested in Issue #1899.
+ *
+ * The workflow is one-shot (executes without intermediate stops), so
results are immediately
+ * available in the initial response. After completion, the process
instance is removed from storage.
+ */
+ @Test
+ void testJwtParserWorkflowEndToEnd() {
+ // Prepare workflow input
+ String processInput = "{}";
+
+ // Set up headers with JWT token
+ Map<String, String> headers = new HashMap<>();
+ headers.put("X-Authorization-acme_financial_auth", VALID_JWT_TOKEN);
+
+ // Start the workflow - for one-shot workflows, results are
immediately available
+ JsonPath jsonPath = newProcessInstance("/jwt_example", processInput,
headers);
+ String processInstanceId = jsonPath.getString("id");
+ assertThat(processInstanceId).isNotBlank();
+
+ // Verify that the JWT was parsed and user information was extracted
+ // The workflow data is available in the initial response for one-shot
workflows
+ String username =
jsonPath.getString("workflowdata.preferred_username");
+ assertThat(username).isEqualTo("johndoe"); // The preferred_username
from the JWT
+
+ String message = jsonPath.getString("workflowdata.message");
+ assertThat(message).isEqualTo("Congrats johndoe! Your loan has been
approved!");
+
+ Boolean loanApproved =
jsonPath.getBoolean("workflowdata.loanApproved");
+ assertThat(loanApproved).isTrue();
+
+ // Verify the process completed and was removed from storage
(following TokenExchangeIT pattern)
+ assertProcessInstanceNotExists("/jwt_example/{id}", processInstanceId);
+ }
+
+ /**
+ * Test workflow with Bearer prefix in JWT token
+ */
+ @Test
+ void testJwtParserWithBearerPrefix() {
+ String processInput = "{}";
+ Map<String, String> headers = new HashMap<>();
+ headers.put("X-Authorization-acme_financial_auth", "Bearer " +
VALID_JWT_TOKEN);
+
+ JsonPath jsonPath = newProcessInstance("/jwt_example", processInput,
headers);
+ String processInstanceId = jsonPath.getString("id");
+ assertThat(processInstanceId).isNotBlank();
+
+ // Verify the JWT was parsed correctly despite the Bearer prefix
+ String username =
jsonPath.getString("workflowdata.preferred_username");
+ assertThat(username).isEqualTo("johndoe");
+
+ String message = jsonPath.getString("workflowdata.message");
+ assertThat(message).contains("johndoe");
+
+ // Verify process was cleaned up
+ assertProcessInstanceNotExists("/jwt_example/{id}", processInstanceId);
+ }
+}
diff --git a/quarkus/addons/pom.xml b/quarkus/addons/jwt-parser/pom.xml
similarity index 57%
copy from quarkus/addons/pom.xml
copy to quarkus/addons/jwt-parser/pom.xml
index d290318abc..f686ba3e50 100644
--- a/quarkus/addons/pom.xml
+++ b/quarkus/addons/jwt-parser/pom.xml
@@ -19,67 +19,26 @@
under the License.
-->
-<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns="http://maven.apache.org/POM/4.0.0"
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
- <artifactId>kogito-quarkus-bom</artifactId>
- <groupId>org.kie.kogito</groupId>
+ <artifactId>kogito-addons-quarkus-parent</artifactId>
+ <groupId>org.kie</groupId>
<version>999-SNAPSHOT</version>
- <relativePath>../bom/pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
- <groupId>org.kie</groupId>
- <artifactId>kogito-addons-quarkus-parent</artifactId>
- <name>Kogito :: Add-Ons :: Quarkus</name>
- <description>Parent Module for Kogito Quarkus Add-Ons. All add-ons are
Quarkus Extensions.</description>
- <packaging>pom</packaging>
-
+ <groupId>org.apache.kie.sonataflow</groupId>
+ <artifactId>sonataflow-addons-quarkus-jwt-parser-parent</artifactId>
+ <name>SonataFlow :: Add-Ons :: Quarkus :: JWT Parser :: Parent</name>
+ <description>SonataFlow Quarkus JWT Token Parser for Serverless
Workflow</description>
<modules>
- <module>messaging</module>
- <module>common</module>
- <module>rest-exception-handler</module>
- <module>flyway</module>
- <module>persistence</module>
- <module>process-management</module>
- <module>source-files</module>
- <module>knative</module>
- <module>kubernetes</module>
- <module>events</module>
- <module>camel</module>
- <module>fabric8-kubernetes-service-catalog</module>
- <module>microprofile-config-service-catalog</module>
- <module>jobs</module>
- <module>explainability</module>
- <module>mail</module>
- <module>monitoring</module>
- <module>process-svg</module>
- <module>task-notification</module>
- <module>task-management</module>
- <module>marshallers</module>
- <module>process-definitions</module>
- <module>dynamic</module>
- <module>jbpm-usertask-storage-jpa</module>
- <module>token-exchange</module>
- <module>process-instance-migration</module>
- <module>openapi</module>
+ <module>deployment</module>
+ <module>runtime</module>
+ <module>integration-tests</module>
</modules>
-
- <profiles>
- <profile>
- <id>full</id>
- <activation>
- <property>
- <name>full</name>
- </property>
- </activation>
- <modules>
- <module>python</module>
- </modules>
- </profile>
- </profiles>
-
+ <packaging>pom</packaging>
<build>
<pluginManagement>
<plugins>
@@ -90,7 +49,6 @@
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
- <version>${version.surefire.plugin}</version>
<configuration>
<systemPropertyVariables>
<java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
@@ -101,7 +59,6 @@
</plugin>
<plugin>
<artifactId>maven-failsafe-plugin</artifactId>
- <version>${version.maven-surefire}</version>
<configuration>
<systemPropertyVariables>
<java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
@@ -113,6 +70,11 @@
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>${version.compiler.plugin}</version>
+ <configuration>
+ <compilerArgs>
+ <arg>-parameters</arg>
+ </compilerArgs>
+ </configuration>
</plugin>
</plugins>
</pluginManagement>
diff --git a/quarkus/addons/jwt-parser/runtime/pom.xml
b/quarkus/addons/jwt-parser/runtime/pom.xml
new file mode 100644
index 0000000000..4da4898d02
--- /dev/null
+++ b/quarkus/addons/jwt-parser/runtime/pom.xml
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <parent>
+ <artifactId>sonataflow-addons-quarkus-jwt-parser-parent</artifactId>
+ <groupId>org.apache.kie.sonataflow</groupId>
+ <version>999-SNAPSHOT</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+
+ <name>SonataFlow :: Add-Ons :: Quarkus :: JWT Parser :: Runtime</name>
+ <description>SonataFlow Quarkus JWT Token Parser for Serverless
Workflow</description>
+ <artifactId>sonataflow-addons-quarkus-jwt-parser</artifactId>
+
+ <properties>
+
<java.module.name>org.kie.kogito.addons.quarkus.jwt.runtime</java.module.name>
+ </properties>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.kie.kogito</groupId>
+ <artifactId>kogito-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.kie.kogito</groupId>
+ <artifactId>kogito-serverless-workflow-builder</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.kie.kogito</groupId>
+ <artifactId>kogito-jackson-utils</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>io.quarkus</groupId>
+ <artifactId>quarkus-arc</artifactId>
+ </dependency>
+ </dependencies>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>io.quarkus</groupId>
+ <artifactId>quarkus-extension-maven-plugin</artifactId>
+ <version>${version.io.quarkus}</version>
+ <executions>
+ <execution>
+ <phase>compile</phase>
+ <goals>
+ <goal>extension-descriptor</goal>
+ </goals>
+ <configuration>
+
<deployment>${project.groupId}:${project.artifactId}-deployment:${project.version}</deployment>
+ <capabilities>
+
<provides>org.apache.kie.sonataflow.addons.jwt-parser</provides>
+ </capabilities>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <annotationProcessorPaths>
+ <path>
+ <groupId>io.quarkus</groupId>
+ <artifactId>quarkus-extension-processor</artifactId>
+ <version>${version.io.quarkus}</version>
+ </path>
+ </annotationProcessorPaths>
+ <compilerArgs>
+ <arg>-AlegacyConfigRoot=true</arg>
+ </compilerArgs>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+</project>
diff --git
a/quarkus/addons/jwt-parser/runtime/src/main/java/org/kie/kogito/addons/jwt/JwtParserTypeHandler.java
b/quarkus/addons/jwt-parser/runtime/src/main/java/org/kie/kogito/addons/jwt/JwtParserTypeHandler.java
new file mode 100644
index 0000000000..30b43e39ea
--- /dev/null
+++
b/quarkus/addons/jwt-parser/runtime/src/main/java/org/kie/kogito/addons/jwt/JwtParserTypeHandler.java
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.kie.kogito.addons.jwt;
+
+import org.jbpm.ruleflow.core.RuleFlowNodeContainerFactory;
+import org.jbpm.ruleflow.core.factory.WorkItemNodeFactory;
+import org.kie.kogito.serverless.workflow.parser.ParserContext;
+import org.kie.kogito.serverless.workflow.parser.types.WorkItemTypeHandler;
+
+import io.serverlessworkflow.api.Workflow;
+import io.serverlessworkflow.api.functions.FunctionDefinition;
+
+import static
org.kie.kogito.serverless.workflow.parser.FunctionTypeHandlerFactory.trimCustomOperation;
+
+/**
+ * Function type handler for JWT parsing operations in SonataFlow
+ * Handles custom functions with type "jwt-parser"
+ */
+public class JwtParserTypeHandler extends WorkItemTypeHandler {
+
+ @Override
+ protected <T extends RuleFlowNodeContainerFactory<T, ?>>
WorkItemNodeFactory<T> fillWorkItemHandler(
+ Workflow workflow, ParserContext context, WorkItemNodeFactory<T>
node, FunctionDefinition functionDef) {
+
+ String operation = trimCustomOperation(functionDef);
+ if (operation != null && !operation.isEmpty()) {
+ node.workParameter(JwtParserWorkItemHandler.OPERATION_PARAM,
operation);
+ }
+
+ return node.workName(JwtParserWorkItemHandler.NAME);
+ }
+
+ @Override
+ public String type() {
+ return JwtParserWorkItemHandler.NAME;
+ }
+}
diff --git
a/quarkus/addons/jwt-parser/runtime/src/main/java/org/kie/kogito/addons/jwt/JwtParserWorkItemHandler.java
b/quarkus/addons/jwt-parser/runtime/src/main/java/org/kie/kogito/addons/jwt/JwtParserWorkItemHandler.java
new file mode 100644
index 0000000000..f8ee364c1d
--- /dev/null
+++
b/quarkus/addons/jwt-parser/runtime/src/main/java/org/kie/kogito/addons/jwt/JwtParserWorkItemHandler.java
@@ -0,0 +1,104 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.kie.kogito.addons.jwt;
+
+import java.util.Map;
+import java.util.Optional;
+
+import org.kie.kogito.internal.process.workitem.KogitoWorkItem;
+import org.kie.kogito.internal.process.workitem.KogitoWorkItemHandler;
+import org.kie.kogito.internal.process.workitem.KogitoWorkItemManager;
+import org.kie.kogito.internal.process.workitem.WorkItemTransition;
+import org.kie.kogito.jackson.utils.JsonObjectUtils;
+import org.kie.kogito.process.workitems.impl.DefaultKogitoWorkItemHandler;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.fasterxml.jackson.databind.JsonNode;
+
+/**
+ * WorkItem handler for JWT token parsing operations in SonataFlow
+ */
+public class JwtParserWorkItemHandler extends DefaultKogitoWorkItemHandler {
+
+ public static final String NAME = "jwt-parser";
+ public static final String TOKEN_PARAM = "token";
+ public static final String CLAIM_PARAM = "claim";
+ public static final String OPERATION_PARAM = "operation";
+
+ // Operations
+ public static final String PARSE_OPERATION = "parse";
+ public static final String EXTRACT_USER_OPERATION = "extractUser";
+ public static final String EXTRACT_CLAIM_OPERATION = "extractClaim";
+
+ private static final Logger logger =
LoggerFactory.getLogger(JwtParserWorkItemHandler.class);
+
+ private final JwtTokenParser jwtTokenParser;
+
+ public JwtParserWorkItemHandler() {
+ this.jwtTokenParser = new JwtTokenParser();
+ }
+
+ public JwtParserWorkItemHandler(JwtTokenParser jwtTokenParser) {
+ this.jwtTokenParser = jwtTokenParser;
+ }
+
+ @Override
+ public String getName() {
+ return NAME;
+ }
+
+ @Override
+ public Optional<WorkItemTransition>
activateWorkItemHandler(KogitoWorkItemManager manager, KogitoWorkItemHandler
handler, KogitoWorkItem workItem, WorkItemTransition transition) {
+ try {
+ Map<String, Object> parameters = workItem.getParameters();
+ String token = (String) parameters.get(TOKEN_PARAM);
+ String operation = (String)
parameters.getOrDefault(OPERATION_PARAM, PARSE_OPERATION);
+
+ logger.debug("Executing JWT parser operation: {}", operation);
+
+ JsonNode result;
+ switch (operation.toLowerCase()) {
+ case EXTRACT_USER_OPERATION:
+ result = jwtTokenParser.extractUser(token);
+ break;
+ case EXTRACT_CLAIM_OPERATION:
+ String claimName = (String) parameters.get(CLAIM_PARAM);
+ if (claimName == null) {
+ throw new IllegalArgumentException("Claim name is
required for extractClaim operation");
+ }
+ result = jwtTokenParser.extractClaim(token, claimName);
+ break;
+ case PARSE_OPERATION:
+ default:
+ result = jwtTokenParser.parseToken(token);
+ break;
+ }
+
+ // Complete the work item with the parsed result
+ // Use JsonObjectUtils.fromValue to ensure proper serialization
for workflow data access
+ // Note: "Result" with capital R is the standard constant used by
SonataFlow
+ return
Optional.of(handler.completeTransition(workItem.getPhaseStatus(),
Map.of("Result", JsonObjectUtils.fromValue(result))));
+
+ } catch (Exception e) {
+ logger.error("Error executing JWT parser work item: {}",
e.getMessage(), e);
+ return
Optional.of(handler.abortTransition(workItem.getPhaseStatus()));
+ }
+ }
+}
diff --git
a/quarkus/addons/jwt-parser/runtime/src/main/java/org/kie/kogito/addons/jwt/JwtParserWorkItemHandlerFactory.java
b/quarkus/addons/jwt-parser/runtime/src/main/java/org/kie/kogito/addons/jwt/JwtParserWorkItemHandlerFactory.java
new file mode 100644
index 0000000000..33af14192a
--- /dev/null
+++
b/quarkus/addons/jwt-parser/runtime/src/main/java/org/kie/kogito/addons/jwt/JwtParserWorkItemHandlerFactory.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.kie.kogito.addons.jwt;
+
+import java.util.List;
+
+import org.kie.kogito.internal.process.workitem.KogitoWorkItemHandler;
+import org.kie.kogito.internal.process.workitem.KogitoWorkItemHandlerFactory;
+
+/**
+ * Factory for creating JWT parser work item handlers
+ * This allows the handler to be discovered and registered automatically via
ServiceLoader
+ */
+public class JwtParserWorkItemHandlerFactory implements
KogitoWorkItemHandlerFactory {
+
+ @Override
+ public List<KogitoWorkItemHandler> provide() {
+ return List.of(new JwtParserWorkItemHandler());
+ }
+}
diff --git
a/quarkus/addons/jwt-parser/runtime/src/main/java/org/kie/kogito/addons/jwt/JwtTokenParser.java
b/quarkus/addons/jwt-parser/runtime/src/main/java/org/kie/kogito/addons/jwt/JwtTokenParser.java
new file mode 100644
index 0000000000..dd0aa4692f
--- /dev/null
+++
b/quarkus/addons/jwt-parser/runtime/src/main/java/org/kie/kogito/addons/jwt/JwtTokenParser.java
@@ -0,0 +1,118 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.kie.kogito.addons.jwt;
+
+import java.util.Base64;
+
+import org.kie.kogito.jackson.utils.ObjectMapperFactory;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
+/**
+ * JWT Token Parser utility for extracting claims from JWT tokens
+ * Used by SonataFlow workflows to parse JWT tokens and access claims
+ */
+public class JwtTokenParser {
+
+ private static final String BEARER = "Bearer ";
+
+ /**
+ * Parses a JWT token and returns the payload as a JsonNode
+ *
+ * @param token The JWT token string (can include "Bearer " prefix)
+ * @return JsonNode containing the JWT payload/claims
+ * @throws RuntimeException if token parsing fails
+ */
+ public JsonNode parseToken(String token) {
+ if (token == null || token.trim().isEmpty()) {
+ throw new IllegalArgumentException("JWT token cannot be null or
empty");
+ }
+
+ // Remove "Bearer " prefix if present
+ String cleanToken = token.startsWith(BEARER) ?
token.substring(BEARER.length()) : token;
+
+ try {
+ // Parse JWT token without signature verification (for claim
extraction only)
+ // In production, you might want to verify signatures with proper
keys
+ String[] parts = cleanToken.split("\\.");
+ if (parts.length != 3) {
+ throw new IllegalArgumentException("Invalid JWT token format");
+ }
+
+ // Decode the payload (second part) using Base64
+ StringBuilder payloadBuilder = new StringBuilder(parts[1]);
+ // Add padding if necessary using StringBuilder for efficiency
+ while (payloadBuilder.length() % 4 != 0) {
+ payloadBuilder.append('=');
+ }
+
+ // Parse the JSON payload directly from bytes using
ObjectMapperFactory singleton
+ return
ObjectMapperFactory.get().readTree(Base64.getUrlDecoder().decode(payloadBuilder.toString()));
+
+ } catch (Exception e) {
+ throw new RuntimeException("Failed to parse JWT token: " +
e.getMessage(), e);
+ }
+ }
+
+ /**
+ * Extracts a specific claim from a JWT token
+ *
+ * @param token The JWT token string
+ * @param claimName The name of the claim to extract
+ * @return The claim value as a JsonNode, or null if not found
+ */
+ public JsonNode extractClaim(String token, String claimName) {
+ JsonNode payload = parseToken(token);
+ return payload.get(claimName);
+ }
+
+ /**
+ * Extracts user information from standard JWT claims
+ *
+ * @param token The JWT token string
+ * @return JsonNode containing user info (sub, preferred_username, email,
etc.)
+ */
+ public JsonNode extractUser(String token) {
+ JsonNode payload = parseToken(token);
+ ObjectNode userInfo = ObjectMapperFactory.get().createObjectNode();
+
+ // Standard JWT claims for user identification
+ if (payload.has("sub")) {
+ userInfo.set("sub", payload.get("sub"));
+ }
+ if (payload.has("preferred_username")) {
+ userInfo.set("preferred_username",
payload.get("preferred_username"));
+ }
+ if (payload.has("email")) {
+ userInfo.set("email", payload.get("email"));
+ }
+ if (payload.has("name")) {
+ userInfo.set("name", payload.get("name"));
+ }
+ if (payload.has("given_name")) {
+ userInfo.set("given_name", payload.get("given_name"));
+ }
+ if (payload.has("family_name")) {
+ userInfo.set("family_name", payload.get("family_name"));
+ }
+
+ return userInfo;
+ }
+}
diff --git
a/quarkus/addons/jwt-parser/runtime/src/main/resources/META-INF/quarkus-extension.yaml
b/quarkus/addons/jwt-parser/runtime/src/main/resources/META-INF/quarkus-extension.yaml
new file mode 100644
index 0000000000..0d3d4d6a03
--- /dev/null
+++
b/quarkus/addons/jwt-parser/runtime/src/main/resources/META-INF/quarkus-extension.yaml
@@ -0,0 +1,34 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+---
+name: SonataFlow JWT Parser Add-On
+description: Add-on for SonataFlow to parse JWT tokens and extract claims in
workflows
+metadata:
+ keywords:
+ - sonataflow
+ - jwt
+ - token
+ - authentication
+ - serverless
+ - workflows
+ categories:
+ - "security"
+ - "cloud"
+ status: "preview"
diff --git
a/quarkus/addons/jwt-parser/runtime/src/main/resources/META-INF/services/org.kie.kogito.internal.process.workitem.KogitoWorkItemHandlerFactory
b/quarkus/addons/jwt-parser/runtime/src/main/resources/META-INF/services/org.kie.kogito.internal.process.workitem.KogitoWorkItemHandlerFactory
new file mode 100644
index 0000000000..4db0bd92da
--- /dev/null
+++
b/quarkus/addons/jwt-parser/runtime/src/main/resources/META-INF/services/org.kie.kogito.internal.process.workitem.KogitoWorkItemHandlerFactory
@@ -0,0 +1,21 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+org.kie.kogito.addons.jwt.JwtParserWorkItemHandlerFactory
+
diff --git
a/quarkus/addons/jwt-parser/runtime/src/main/resources/META-INF/services/org.kie.kogito.serverless.workflow.parser.FunctionTypeHandler
b/quarkus/addons/jwt-parser/runtime/src/main/resources/META-INF/services/org.kie.kogito.serverless.workflow.parser.FunctionTypeHandler
new file mode 100644
index 0000000000..7feca4388d
--- /dev/null
+++
b/quarkus/addons/jwt-parser/runtime/src/main/resources/META-INF/services/org.kie.kogito.serverless.workflow.parser.FunctionTypeHandler
@@ -0,0 +1,20 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+org.kie.kogito.addons.jwt.JwtParserTypeHandler
diff --git a/quarkus/addons/pom.xml b/quarkus/addons/pom.xml
index d290318abc..c53fcc1e55 100644
--- a/quarkus/addons/pom.xml
+++ b/quarkus/addons/pom.xml
@@ -61,6 +61,7 @@
<module>process-definitions</module>
<module>dynamic</module>
<module>jbpm-usertask-storage-jpa</module>
+ <module>jwt-parser</module>
<module>token-exchange</module>
<module>process-instance-migration</module>
<module>openapi</module>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]