You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2022/01/10 10:57:06 UTC

[camel] branch main updated: CAMEL-17458: Bearer Access Token authentication (#6696)

This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/main by this push:
     new 0203ade  CAMEL-17458: Bearer Access Token authentication (#6696)
0203ade is described below

commit 0203ade5eac1c4c11bd88febf04bc7a22624692b
Author: Federico Mariani <34...@users.noreply.github.com>
AuthorDate: Mon Jan 10 11:54:31 2022 +0100

    CAMEL-17458: Bearer Access Token authentication (#6696)
---
 .../resources/org/apache/camel/component/jira/jira.json |  4 ++--
 components/camel-jira/src/main/docs/jira-component.adoc |  9 ++++++++-
 .../apache/camel/component/jira/JiraConfiguration.java  |  2 +-
 .../org/apache/camel/component/jira/JiraEndpoint.java   |  7 +++++++
 .../component/jira/JiraComponentConfigurationTest.java  | 17 +++++++++++++++++
 5 files changed, 35 insertions(+), 4 deletions(-)

diff --git a/components/camel-jira/src/generated/resources/org/apache/camel/component/jira/jira.json b/components/camel-jira/src/generated/resources/org/apache/camel/component/jira/jira.json
index 4712da9..7d8342d 100644
--- a/components/camel-jira/src/generated/resources/org/apache/camel/component/jira/jira.json
+++ b/components/camel-jira/src/generated/resources/org/apache/camel/component/jira/jira.json
@@ -28,7 +28,7 @@
     "lazyStartProducer": { "kind": "property", "displayName": "Lazy Start Producer", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during star [...]
     "autowiredEnabled": { "kind": "property", "displayName": "Autowired Enabled", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether autowiring is enabled. This is used for automatic autowiring options (the option must be marked as autowired) by looking up in the registry to find if there is a single instance of matching type, which t [...]
     "configuration": { "kind": "property", "displayName": "Configuration", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.jira.JiraConfiguration", "deprecated": false, "autowired": false, "secret": false, "description": "To use a shared base jira configuration." },
-    "accessToken": { "kind": "property", "displayName": "Access Token", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.jira.JiraConfiguration", "configurationField": "configuration", "description": "(OAuth only) The access token generated by the Jira server." },
+    "accessToken": { "kind": "property", "displayName": "Access Token", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.jira.JiraConfiguration", "configurationField": "configuration", "description": "(OAuth or Personal Access Token authentication) The access token generated by the Jira server." },
     "consumerKey": { "kind": "property", "displayName": "Consumer Key", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.jira.JiraConfiguration", "configurationField": "configuration", "description": "(OAuth only) The consumer key from Jira settings." },
     "password": { "kind": "property", "displayName": "Password", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.jira.JiraConfiguration", "configurationField": "configuration", "description": "(Basic authentication only) The password to authenticate to the Jira server. Use only if username basic authentication is used." },
     "privateKey": { "kind": "property", "displayName": "Private Key", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.jira.JiraConfiguration", "configurationField": "configuration", "description": "(OAuth only) The private key generated by the client to encrypt the conversation to the server." },
@@ -47,7 +47,7 @@
     "exceptionHandler": { "kind": "parameter", "displayName": "Exception Handler", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.ExceptionHandler", "optionalPrefix": "consumer.", "deprecated": false, "autowired": false, "secret": false, "description": "To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By default the con [...]
     "exchangePattern": { "kind": "parameter", "displayName": "Exchange Pattern", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.ExchangePattern", "enum": [ "InOnly", "InOut", "InOptionalOut" ], "deprecated": false, "autowired": false, "secret": false, "description": "Sets the exchange pattern when the consumer creates an exchange." },
     "lazyStartProducer": { "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during sta [...]
-    "accessToken": { "kind": "parameter", "displayName": "Access Token", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.jira.JiraConfiguration", "configurationField": "configuration", "description": "(OAuth only) The access token generated by the Jira server." },
+    "accessToken": { "kind": "parameter", "displayName": "Access Token", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.jira.JiraConfiguration", "configurationField": "configuration", "description": "(OAuth or Personal Access Token authentication) The access token generated by the Jira server." },
     "consumerKey": { "kind": "parameter", "displayName": "Consumer Key", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.jira.JiraConfiguration", "configurationField": "configuration", "description": "(OAuth only) The consumer key from Jira settings." },
     "password": { "kind": "parameter", "displayName": "Password", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.jira.JiraConfiguration", "configurationField": "configuration", "description": "(Basic authentication only) The password to authenticate to the Jira server. Use only if username basic authentication is used." },
     "privateKey": { "kind": "parameter", "displayName": "Private Key", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.jira.JiraConfiguration", "configurationField": "configuration", "description": "(OAuth only) The private key generated by the client to encrypt the conversation to the server." },
diff --git a/components/camel-jira/src/main/docs/jira-component.adoc b/components/camel-jira/src/main/docs/jira-component.adoc
index 99170c7..40619da 100644
--- a/components/camel-jira/src/main/docs/jira-component.adoc
+++ b/components/camel-jira/src/main/docs/jira-component.adoc
@@ -87,7 +87,7 @@ You can bind the `JiraRestClientFactory` with name *JiraRestClientFactory* in th
 
 == Authentication
 
-Camel-jira supports *https://developer.atlassian.com/cloud/jira/platform/jira-rest-api-basic-authentication/[Basic Authentication]* and *https://developer.atlassian.com/cloud/jira/platform/jira-rest-api-oauth-authentication/[OAuth 3 legged authentication]*.
+Camel-jira supports *https://developer.atlassian.com/cloud/jira/platform/jira-rest-api-basic-authentication/[Basic Authentication]*, *https://developer.atlassian.com/cloud/jira/platform/jira-rest-api-oauth-authentication/[OAuth 3 legged authentication]* and *https://confluence.atlassian.com/enterprise/using-personal-access-tokens-1026032365.html*.
 
 We recommend to use OAuth whenever possible, as it provides the best security for your users and system.
 
@@ -105,6 +105,13 @@ to generate the client private key, consumer key, verification code and access t
 * The consumer key, set in the Jira server settings.
 * An access token, generated by Jira server.
 
+=== Personal access token authentication requirements:
+
+Follow the tutorial in https://confluence.atlassian.com/enterprise/using-personal-access-tokens-1026032365.html
+to generate an access token bearer.
+
+* An access token
+
 == JQL:
 
 The JQL URI option is used by both consumer endpoints.  Theoretically,
diff --git a/components/camel-jira/src/main/java/org/apache/camel/component/jira/JiraConfiguration.java b/components/camel-jira/src/main/java/org/apache/camel/component/jira/JiraConfiguration.java
index cc4df7f..c98d770 100644
--- a/components/camel-jira/src/main/java/org/apache/camel/component/jira/JiraConfiguration.java
+++ b/components/camel-jira/src/main/java/org/apache/camel/component/jira/JiraConfiguration.java
@@ -87,7 +87,7 @@ public class JiraConfiguration implements Cloneable {
     }
 
     /**
-     * (OAuth only) The access token generated by the Jira server.
+     * (OAuth or Personal Access Token authentication) The access token generated by the Jira server.
      */
     public void setAccessToken(String accessToken) {
         this.accessToken = accessToken;
diff --git a/components/camel-jira/src/main/java/org/apache/camel/component/jira/JiraEndpoint.java b/components/camel-jira/src/main/java/org/apache/camel/component/jira/JiraEndpoint.java
index aaa1398..b68d90a 100644
--- a/components/camel-jira/src/main/java/org/apache/camel/component/jira/JiraEndpoint.java
+++ b/components/camel-jira/src/main/java/org/apache/camel/component/jira/JiraEndpoint.java
@@ -133,6 +133,13 @@ public class JiraEndpoint extends DefaultEndpoint {
                         LOG.debug("Connecting to JIRA with Basic authentication with username/password");
                         client = factory.createWithBasicHttpAuthentication(jiraServerUri, configuration.getUsername(),
                                 configuration.getPassword());
+                    } else if (configuration.getAccessToken() != null
+                            && configuration.getVerificationCode() == null
+                            && configuration.getPrivateKey() == null
+                            && configuration.getConsumerKey() == null) {
+                        client = factory.create(jiraServerUri, builder -> {
+                            builder.setHeader("Authorization", "Bearer " + configuration.getAccessToken());
+                        });
                     } else {
                         LOG.debug("Connecting to JIRA with OAuth authentication");
                         JiraOAuthAuthenticationHandler oAuthHandler = new JiraOAuthAuthenticationHandler(
diff --git a/components/camel-jira/src/test/java/org/apache/camel/component/jira/JiraComponentConfigurationTest.java b/components/camel-jira/src/test/java/org/apache/camel/component/jira/JiraComponentConfigurationTest.java
index 89081d5..ab1c467 100644
--- a/components/camel-jira/src/test/java/org/apache/camel/component/jira/JiraComponentConfigurationTest.java
+++ b/components/camel-jira/src/test/java/org/apache/camel/component/jira/JiraComponentConfigurationTest.java
@@ -80,6 +80,23 @@ public class JiraComponentConfigurationTest extends CamelTestSupport {
     }
 
     @Test
+    public void createEndpointWithPersonalAccessTokenAuthentication() throws Exception {
+        JiraComponent component = new JiraComponent(context);
+        component.start();
+        String query = Joiner.on("&").join(
+                concat(JIRA_URL, JIRA_URL_VALUE),
+                concat(ACCESS_TOKEN, ACCESS_TOKEN_VALUE));
+        JiraEndpoint endpoint = (JiraEndpoint) component.createEndpoint("jira://updateIssue?" + query);
+
+        assertEquals("updateissue", endpoint.getType().name().toLowerCase());
+        assertEquals(JIRA_URL_VALUE, endpoint.getConfiguration().getJiraUrl());
+        assertEquals(null, endpoint.getConfiguration().getVerificationCode());
+        assertEquals(ACCESS_TOKEN_VALUE, endpoint.getConfiguration().getAccessToken());
+        assertEquals(null, endpoint.getConfiguration().getConsumerKey());
+        assertEquals(null, endpoint.getConfiguration().getPrivateKey());
+    }
+
+    @Test
     public void createWatchChangesEndpoint() throws Exception {
         JiraComponent component = new JiraComponent(context);
         component.start();