Authentication : provide a way to use refresh_token mode in addition to password method
Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/d945b860 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/d945b860 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/d945b860 Branch: refs/heads/master Commit: d945b860ee151d1d5a123e4ce4326c6d96a6708d Parents: 2714b4b Author: Jaira abderrahim <abderrahim.jaira.exte...@capgemini.com> Authored: Mon Feb 6 15:35:36 2017 +0100 Committer: Claus Ibsen <davscl...@apache.org> Committed: Tue Feb 7 18:28:19 2017 +0100 ---------------------------------------------------------------------- .../camel-salesforce-component/README.md | 3 +- .../salesforce/SalesforceLoginConfig.java | 23 +++++++++++++ .../salesforce/internal/SalesforceSession.java | 21 +++++++++--- .../component/salesforce/LoginConfigHelper.java | 36 ++++++++++++++------ .../SalesforceComponentConfiguration.java | 12 +++++++ 5 files changed, 79 insertions(+), 16 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/d945b860/components/camel-salesforce/camel-salesforce-component/README.md ---------------------------------------------------------------------- diff --git a/components/camel-salesforce/camel-salesforce-component/README.md b/components/camel-salesforce/camel-salesforce-component/README.md index ef3dc12..44285b2 100644 --- a/components/camel-salesforce/camel-salesforce-component/README.md +++ b/components/camel-salesforce/camel-salesforce-component/README.md @@ -88,7 +88,7 @@ Install the Warehouse package, tested with _Spring 2013_ (version 1.2) that can You'll need to access a Merchandise record and run a `Test Report` in order for them to appear in _Recent Items_ and _Recent Reports_. Do this by accessing _Warehouse_ application from the menu in the top right, and selecting _Merchandise_ click _Go!_ (preselected is View: _All_) and click on the single Merchandise item available. Next go to Reports and select and run _Test Report_ from _Test Reports_. This is needed by the integration tests as they access recent items and recently run reports. -Create `Camel` connected application by selecting under _Apps_ in _Build_ and _Create_ sections by clicking _New_ in _Connected Apps_ section. Fill in the required fields and in the _API (Enable OAuth Settings)_ section thick _Enable OAuth Settings_ and move all scopes from _Available OAuth Scopes_ to _Selected OAuth Scopes_. For _Callback URL_ you can use any URL it's not needed by the REST API used by the Camel Salesforce component. Make note of _Consumer Key_ and _Consumer Secret_ you'll need to specify them in `test-salesforce-login.properties`, more on that below. +Create `Camel` connected application by selecting under _Apps_ in _Build_ and _Create_ sections by clicking _New_ in _Connected Apps_ section. Fill in the required fields and in the _API (Enable OAuth Settings)_ section thick _Enable OAuth Settings_ and move all scopes from _Available OAuth Scopes_ to _Selected OAuth Scopes_. For _Callback URL_ you can use any URL it's not needed by the REST API used by the Camel Salesforce component. Make note of _Consumer Key_ and _Consumer Secret_, or if your partner provide just _Consumer Refresh Token_ you'll need to specify them in `test-salesforce-login.properties`, more on that below. Next enable relaxed IP restrictions, by editing the policy of the _Camel_ connected application in _Connected Apps_ under _Administer_ and _Manage Apps_ pick _Relax IP restrictions_ for _IP Relaxation_. @@ -96,6 +96,7 @@ Create `test-salesforce-login.properties` in `camel-salesforce` directory (one u clientId=<Consumer Key of the `Camel` connected App> clientSecret=<Consumer Secret of the `Camel` connected app> + refreshToken=<Consumer Refresh Token of the `Camel` connected app> userName=<Username of the user with the `System Administrator With Hard Delete` profile> password=<Password of the above user> loginUrl=https://login.salesforce.com/ http://git-wip-us.apache.org/repos/asf/camel/blob/d945b860/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceLoginConfig.java ---------------------------------------------------------------------- diff --git a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceLoginConfig.java b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceLoginConfig.java index f363468..7e1c365 100644 --- a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceLoginConfig.java +++ b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceLoginConfig.java @@ -26,6 +26,7 @@ public class SalesforceLoginConfig { private String loginUrl; private String clientId; private String clientSecret; + private String refreshToken; private String userName; private String password; // allow lazy login into Salesforce @@ -48,6 +49,16 @@ public class SalesforceLoginConfig { this.lazyLogin = lazyLogin; } + public SalesforceLoginConfig(String loginUrl, + String clientId, String clientSecret, + String refreshToken, boolean lazyLogin) { + this.loginUrl = loginUrl; + this.clientId = clientId; + this.clientSecret = clientSecret; + this.refreshToken = refreshToken; + this.lazyLogin = lazyLogin; + } + public String getLoginUrl() { return loginUrl; } @@ -81,6 +92,18 @@ public class SalesforceLoginConfig { this.clientSecret = clientSecret; } + + public String getRefreshToken() { + return refreshToken; + } + + /** + * Salesforce connected application Consumer token + */ + public void setRefreshToken(String refreshToken) { + this.refreshToken = refreshToken; + } + public String getUserName() { return userName; } http://git-wip-us.apache.org/repos/asf/camel/blob/d945b860/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/SalesforceSession.java ---------------------------------------------------------------------- diff --git a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/SalesforceSession.java b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/SalesforceSession.java index ae0d13b..22e0d14 100644 --- a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/SalesforceSession.java +++ b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/SalesforceSession.java @@ -72,8 +72,13 @@ public class SalesforceSession implements Service { ObjectHelper.notNull(config.getLoginUrl(), "loginUrl"); ObjectHelper.notNull(config.getClientId(), "clientId"); ObjectHelper.notNull(config.getClientSecret(), "clientSecret"); - ObjectHelper.notNull(config.getUserName(), "userName"); - ObjectHelper.notNull(config.getPassword(), "password"); + + if (config.getRefreshToken() == null) { + ObjectHelper.notNull(config.getUserName(), "userName"); + ObjectHelper.notNull(config.getPassword(), "password"); + } else { + ObjectHelper.notNull(config.getRefreshToken(), "refreshToken"); + } this.httpClient = httpClient; this.timeout = timeout; @@ -132,13 +137,19 @@ public class SalesforceSession implements Service { LOG.info("Login user {} at Salesforce loginUrl: {}", config.getUserName(), loginUrl); final Fields fields = new Fields(true); - fields.put("grant_type", "password"); fields.put("client_id", config.getClientId()); fields.put("client_secret", config.getClientSecret()); - fields.put("username", config.getUserName()); - fields.put("password", config.getPassword()); fields.put("format", "json"); + if (config.getRefreshToken() == null) { + fields.put("grant_type", "password"); + fields.put("username", config.getUserName()); + fields.put("password", config.getPassword()); + } else { + fields.put("grant_type", "refresh_token"); + fields.put("refresh_token", config.getRefreshToken()); + } + final Request post; if (conversation == null) { post = httpClient.POST(loginUrl); http://git-wip-us.apache.org/repos/asf/camel/blob/d945b860/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/LoginConfigHelper.java ---------------------------------------------------------------------- diff --git a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/LoginConfigHelper.java b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/LoginConfigHelper.java index 28c6a5b..7a51470 100644 --- a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/LoginConfigHelper.java +++ b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/LoginConfigHelper.java @@ -34,28 +34,44 @@ public class LoginConfigHelper extends Assert { Properties properties = new Properties(); InputStream stream = null; try { + final SalesforceLoginConfig config; stream = new FileInputStream(TEST_LOGIN_PROPERTIES); properties.load(stream); - final SalesforceLoginConfig config = new SalesforceLoginConfig( - properties.getProperty("loginUrl", SalesforceLoginConfig.DEFAULT_LOGIN_URL), - properties.getProperty("clientId"), - properties.getProperty("clientSecret"), - properties.getProperty("userName"), - properties.getProperty("password"), - Boolean.parseBoolean(properties.getProperty("lazyLogin", "false"))); + if (properties.getProperty("refreshToken")== null) { + config = new SalesforceLoginConfig( + properties.getProperty("loginUrl", SalesforceLoginConfig.DEFAULT_LOGIN_URL), + properties.getProperty("clientId"), + properties.getProperty("clientSecret"), + properties.getProperty("userName"), + properties.getProperty("password"), + Boolean.parseBoolean(properties.getProperty("lazyLogin", "false"))); + } else { + config = new SalesforceLoginConfig( + properties.getProperty("loginUrl", SalesforceLoginConfig.DEFAULT_LOGIN_URL), + properties.getProperty("clientId"), // + properties.getProperty("clientSecret"), // + properties.getProperty("refreshToken"), // + Boolean.parseBoolean(properties.getProperty("lazyLogin", "false"))); + } + assertNotNull("Null loginUrl", config.getLoginUrl()); assertNotNull("Null clientId", config.getClientId()); assertNotNull("Null clientSecret", config.getClientSecret()); - assertNotNull("Null userName", config.getUserName()); - assertNotNull("Null password", config.getPassword()); + if (properties.getProperty("refreshToken")== null) { + assertNotNull("Null userName", config.getUserName()); + assertNotNull("Null password", config.getPassword()); + } else { + assertNotNull("Null refreshToken", config.getRefreshToken()); + } + return config; } catch (FileNotFoundException e) { throw new FileNotFoundException("Create a properties file named " - + TEST_LOGIN_PROPERTIES + " with clientId, clientSecret, userName, and password" + + TEST_LOGIN_PROPERTIES + " with clientId, clientSecret, userName, and password or with clientId, clientSecret and refreshToken" + " for a Salesforce account with Merchandise and Invoice objects from Salesforce Guides."); } finally { if (stream != null) { http://git-wip-us.apache.org/repos/asf/camel/blob/d945b860/platforms/spring-boot/components-starter/camel-salesforce-starter/src/main/java/org/apache/camel/component/salesforce/springboot/SalesforceComponentConfiguration.java ---------------------------------------------------------------------- diff --git a/platforms/spring-boot/components-starter/camel-salesforce-starter/src/main/java/org/apache/camel/component/salesforce/springboot/SalesforceComponentConfiguration.java b/platforms/spring-boot/components-starter/camel-salesforce-starter/src/main/java/org/apache/camel/component/salesforce/springboot/SalesforceComponentConfiguration.java index 9a296f7..55e2279 100644 --- a/platforms/spring-boot/components-starter/camel-salesforce-starter/src/main/java/org/apache/camel/component/salesforce/springboot/SalesforceComponentConfiguration.java +++ b/platforms/spring-boot/components-starter/camel-salesforce-starter/src/main/java/org/apache/camel/component/salesforce/springboot/SalesforceComponentConfiguration.java @@ -832,6 +832,10 @@ public class SalesforceComponentConfiguration { */ private String clientSecret; /** + * Salesforce connected application Consumer token + */ + private String refreshToken; + /** * Salesforce account user name */ private String userName; @@ -870,6 +874,14 @@ public class SalesforceComponentConfiguration { this.clientSecret = clientSecret; } + public String getRefreshToken() { + return refreshToken; + } + + public void setRefreshToken(String refreshToken) { + this.refreshToken = refreshToken; + } + public String getUserName() { return userName; }