Skip to content

Commit 2f3a3fd

Browse files
authored
Add DiscoveryURL to flows other than M2M (#599)
* Add OAuth to flows other than M2M * Add tests
1 parent e7e9ae6 commit 2f3a3fd

File tree

10 files changed

+102
-294
lines changed

10 files changed

+102
-294
lines changed

src/main/java/com/databricks/jdbc/auth/OAuthEndpointResolver.java

Lines changed: 0 additions & 98 deletions
This file was deleted.

src/main/java/com/databricks/jdbc/auth/OAuthRefreshCredentialsProvider.java

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
import com.databricks.jdbc.api.IDatabricksConnectionContext;
77
import com.databricks.jdbc.common.DatabricksJdbcConstants;
8+
import com.databricks.jdbc.common.util.DatabricksAuthUtil;
89
import com.databricks.jdbc.exception.DatabricksParsingException;
910
import com.databricks.jdbc.log.JdbcLogger;
1011
import com.databricks.jdbc.log.JdbcLoggerFactory;
@@ -16,7 +17,6 @@
1617
import com.databricks.sdk.core.oauth.AuthParameterPosition;
1718
import com.databricks.sdk.core.oauth.RefreshableTokenSource;
1819
import com.databricks.sdk.core.oauth.Token;
19-
import com.google.common.annotations.VisibleForTesting;
2020
import java.time.LocalDateTime;
2121
import java.util.HashMap;
2222
import java.util.Map;
@@ -32,10 +32,9 @@ public class OAuthRefreshCredentialsProvider extends RefreshableTokenSource
3232
private final String clientId;
3333
private final String clientSecret;
3434

35-
@VisibleForTesting
3635
public OAuthRefreshCredentialsProvider(
37-
IDatabricksConnectionContext context, OAuthEndpointResolver oAuthEndpointResolver) {
38-
this.tokenEndpoint = oAuthEndpointResolver.getTokenEndpoint();
36+
IDatabricksConnectionContext context, DatabricksConfig databricksConfig) {
37+
this.tokenEndpoint = DatabricksAuthUtil.getTokenEndpoint(databricksConfig, context);
3938
try {
4039
this.clientId = context.getClientId();
4140
} catch (DatabricksParsingException e) {
@@ -53,11 +52,6 @@ public OAuthRefreshCredentialsProvider(
5352
LocalDateTime.now().minusMinutes(1));
5453
}
5554

56-
public OAuthRefreshCredentialsProvider(
57-
IDatabricksConnectionContext context, DatabricksConfig databricksConfig) {
58-
this(context, new OAuthEndpointResolver(context, databricksConfig));
59-
}
60-
6155
@Override
6256
public String authType() {
6357
return "oauth-refresh";

src/main/java/com/databricks/jdbc/auth/PrivateKeyClientCredentialProvider.java

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.databricks.jdbc.auth;
22

33
import com.databricks.jdbc.api.IDatabricksConnectionContext;
4+
import com.databricks.jdbc.common.util.DatabricksAuthUtil;
45
import com.databricks.jdbc.dbclient.IDatabricksHttpClient;
56
import com.databricks.jdbc.dbclient.impl.http.DatabricksHttpClientFactory;
67
import com.databricks.sdk.core.CredentialsProvider;
@@ -22,15 +23,9 @@ public class PrivateKeyClientCredentialProvider implements CredentialsProvider {
2223

2324
public PrivateKeyClientCredentialProvider(
2425
IDatabricksConnectionContext connectionContext, DatabricksConfig databricksConfig) {
25-
this(connectionContext, new OAuthEndpointResolver(connectionContext, databricksConfig));
26-
}
27-
28-
@VisibleForTesting
29-
public PrivateKeyClientCredentialProvider(
30-
IDatabricksConnectionContext connectionContext, OAuthEndpointResolver oAuthEndpointResolver) {
3126
this.connectionContext = connectionContext;
3227
this.httpClient = DatabricksHttpClientFactory.getInstance().getClient(connectionContext);
33-
this.tokenEndpoint = oAuthEndpointResolver.getTokenEndpoint();
28+
this.tokenEndpoint = DatabricksAuthUtil.getTokenEndpoint(databricksConfig, connectionContext);
3429
}
3530

3631
@Override
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.databricks.jdbc.common.util;
2+
3+
import com.databricks.jdbc.api.IDatabricksConnectionContext;
4+
import com.databricks.jdbc.log.JdbcLogger;
5+
import com.databricks.jdbc.log.JdbcLoggerFactory;
6+
import com.databricks.jdbc.model.client.thrift.generated.*;
7+
import com.databricks.sdk.core.DatabricksConfig;
8+
import com.databricks.sdk.core.DatabricksException;
9+
import java.io.IOException;
10+
import java.util.*;
11+
12+
public class DatabricksAuthUtil {
13+
private static final JdbcLogger LOGGER = JdbcLoggerFactory.getLogger(DatabricksAuthUtil.class);
14+
15+
public static String getTokenEndpoint(
16+
DatabricksConfig databricksConfig, IDatabricksConnectionContext connectionContext) {
17+
String userProvidedTokenEndpoint = connectionContext.getTokenEndpoint();
18+
if (userProvidedTokenEndpoint != null) {
19+
return userProvidedTokenEndpoint;
20+
}
21+
try {
22+
return databricksConfig.getOidcEndpoints().getTokenEndpoint();
23+
} catch (IOException e) {
24+
String errorMessage = "Failed to build default token endpoint URL.";
25+
LOGGER.error(errorMessage);
26+
throw new DatabricksException(errorMessage, e);
27+
}
28+
}
29+
}

src/main/java/com/databricks/jdbc/dbclient/impl/common/ClientConfigurator.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ public ClientConfigurator(IDatabricksConnectionContext connectionContext) {
3838
setupProxyConfig(httpClientBuilder);
3939
setupConnectionManager(httpClientBuilder);
4040
this.databricksConfig.setHttpClient(httpClientBuilder.build());
41+
setupDiscoveryEndpoint();
4142
setupAuthConfig();
4243
this.databricksConfig.resolve();
4344
}
@@ -219,4 +220,10 @@ public static String convertNonProxyHostConfigToBeSystemPropertyCompliant(String
219220
public DatabricksConfig getDatabricksConfig() {
220221
return this.databricksConfig;
221222
}
223+
224+
private void setupDiscoveryEndpoint() {
225+
if (connectionContext.isOAuthDiscoveryModeEnabled()) {
226+
databricksConfig.setDiscoveryUrl(connectionContext.getOAuthDiscoveryURL());
227+
}
228+
}
222229
}

src/test/java/com/databricks/jdbc/TestConstants.java

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
import com.databricks.jdbc.common.IDatabricksComputeResource;
66
import com.databricks.jdbc.common.Warehouse;
77
import com.databricks.jdbc.model.client.thrift.generated.*;
8+
import com.databricks.sdk.core.DatabricksException;
9+
import com.databricks.sdk.core.oauth.OpenIDConnectEndpoints;
10+
import java.net.MalformedURLException;
811
import java.nio.ByteBuffer;
912
import java.util.Collections;
1013
import java.util.List;
@@ -102,11 +105,18 @@ public class TestConstants {
102105
public static final String TEST_JWT_ALGORITHM = "RS256";
103106
public static final String TEST_JWT_KEY_FILE = "src/test/resources/private_key.pem";
104107
public static final String TEST_ACCESS_TOKEN = "test-access-token";
105-
public static final String TEST_OIDC_RESPONSE =
106-
"{\n"
107-
+ " \"token_endpoint\": \"https://test.token.url\",\n"
108-
+ " \"authorization_endpoint\": \"https://test.auth.url\"\n"
109-
+ "}";
108+
109+
public static OpenIDConnectEndpoints TEST_OIDC_ENDPOINTS;
110+
111+
static {
112+
try {
113+
TEST_OIDC_ENDPOINTS =
114+
new OpenIDConnectEndpoints("https://test.token.url", "https://test.auth.url");
115+
} catch (MalformedURLException e) {
116+
throw new DatabricksException("Can't initiate test constant for OIDC. Error: " + e);
117+
}
118+
}
119+
110120
public static final String TEST_OAUTH_RESPONSE =
111121
"{\n"
112122
+ " \"expires_in\": 3600,\n"

src/test/java/com/databricks/jdbc/auth/OAuthEndpointResolverTest.java

Lines changed: 0 additions & 142 deletions
This file was deleted.

0 commit comments

Comments
 (0)