Skip to content

Commit 033a4e3

Browse files
fix
1 parent 9f6d4dd commit 033a4e3

File tree

8 files changed

+68
-49
lines changed

8 files changed

+68
-49
lines changed

src/main/java/com/snowflake/kafka/connector/SnowflakeSinkConnector.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package com.snowflake.kafka.connector;
1818

1919
import com.snowflake.kafka.connector.internal.KCLogger;
20+
import com.snowflake.kafka.connector.internal.OAuthConstants;
2021
import com.snowflake.kafka.connector.internal.SnowflakeConnectionService;
2122
import com.snowflake.kafka.connector.internal.SnowflakeConnectionServiceFactory;
2223
import com.snowflake.kafka.connector.internal.SnowflakeErrors;
@@ -212,8 +213,8 @@ public Config validate(Map<String, String> connectorConfigs) {
212213
// If using snowflake_jwt and authentication, and private key or private key passphrase is
213214
// provided through file, skip validation
214215
if (connectorConfigs
215-
.getOrDefault(Utils.SF_AUTHENTICATOR, Utils.SNOWFLAKE_JWT)
216-
.equals(Utils.SNOWFLAKE_JWT)
216+
.getOrDefault(Utils.SF_AUTHENTICATOR, OAuthConstants.SNOWFLAKE_JWT)
217+
.equals(OAuthConstants.SNOWFLAKE_JWT)
217218
&& (connectorConfigs.getOrDefault(Utils.SF_PRIVATE_KEY, "").contains("${file:")
218219
|| connectorConfigs.getOrDefault(Utils.PRIVATE_KEY_PASSPHRASE, "").contains("${file:")))
219220
return result;

src/main/java/com/snowflake/kafka/connector/SnowflakeSinkConnectorConfig.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import com.google.common.base.Strings;
2020
import com.google.common.collect.ImmutableSet;
2121
import com.snowflake.kafka.connector.internal.KCLogger;
22+
import com.snowflake.kafka.connector.internal.OAuthConstants;
2223
import com.snowflake.kafka.connector.internal.streaming.IngestionMethodConfig;
2324
import com.snowflake.kafka.connector.internal.streaming.StreamingUtils;
2425
import java.util.Arrays;
@@ -307,8 +308,8 @@ static ConfigDef newConfigDef() {
307308
SNOWFLAKE_ROLE)
308309
.define(
309310
AUTHENTICATOR_TYPE,
310-
Type.STRING,
311-
Utils.SNOWFLAKE_JWT,
311+
Type.STRING, // TODO: SNOW-889748 change to enum and add validator
312+
OAuthConstants.SNOWFLAKE_JWT,
312313
Importance.LOW,
313314
"Authenticator for JDBC and streaming ingest sdk",
314315
SNOWFLAKE_LOGIN_INFO,

src/main/java/com/snowflake/kafka/connector/Utils.java

Lines changed: 27 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import com.google.common.collect.ImmutableMap;
2525
import com.snowflake.kafka.connector.internal.BufferThreshold;
2626
import com.snowflake.kafka.connector.internal.KCLogger;
27+
import com.snowflake.kafka.connector.internal.OAuthConstants;
2728
import com.snowflake.kafka.connector.internal.SnowflakeErrors;
2829
import com.snowflake.kafka.connector.internal.SnowflakeURL;
2930
import com.snowflake.kafka.connector.internal.streaming.IngestionMethodConfig;
@@ -81,7 +82,8 @@ public class Utils {
8182
public static final String SF_SSL = "sfssl"; // for test only
8283
public static final String SF_WAREHOUSE = "sfwarehouse"; // for test only
8384
public static final String PRIVATE_KEY_PASSPHRASE = "snowflake.private.key" + ".passphrase";
84-
public static final String SF_AUTHENTICATOR = "snowflake.authenticator";
85+
public static final String SF_AUTHENTICATOR =
86+
"snowflake.authenticator"; // TODO: SNOW-889748 change to enum
8587
public static final String SF_OAUTH_CLIENT_ID = "snowflake.oauth.client.id";
8688
public static final String SF_OAUTH_CLIENT_SECRET = "snowflake.oauth.client.secret";
8789
public static final String SF_OAUTH_REFRESH_TOKEN = "snowflake.oauth.refresh.token";
@@ -128,19 +130,6 @@ public class Utils {
128130
public static final String GET_EXCEPTION_MISSING_MESSAGE = "missing exception message";
129131
public static final String GET_EXCEPTION_MISSING_CAUSE = "missing exception cause";
130132

131-
// OAuth
132-
public static final String TOKEN_REQUEST_ENDPOINT = "/oauth/token-request";
133-
public static final String OAUTH_CONTENT_TYPE_HEADER = "application/x-www-form-urlencoded";
134-
public static final String BASIC_AUTH_HEADER_PREFIX = "Basic ";
135-
public static final String GRANT_TYPE_PARAM = "grant_type";
136-
public static final String REFRESH_TOKEN = "refresh_token";
137-
public static final String ACCESS_TOKEN = "access_token";
138-
public static final String SNOWFLAKE_JWT = "snowflake_jwt";
139-
public static final String OAUTH = "oauth";
140-
public static final String REDIRECT_URI = "redirect_uri";
141-
public static final String DEFAULT_REDIRECT_URI = "https://localhost.com/oauth";
142-
public static final int OAUTH_MAX_RETRY = 5;
143-
144133
private static final KCLogger LOGGER = new KCLogger(Utils.class.getName());
145134

146135
/**
@@ -476,41 +465,43 @@ && parseTopicToTableMap(config.get(SnowflakeSinkConnectorConfig.TOPICS_TABLES_MA
476465
Utils.formatString("{} cannot be empty.", SnowflakeSinkConnectorConfig.SNOWFLAKE_SCHEMA));
477466
}
478467

479-
switch (config.getOrDefault(SnowflakeSinkConnectorConfig.AUTHENTICATOR_TYPE, SNOWFLAKE_JWT)) {
480-
case SNOWFLAKE_JWT:
468+
switch (config.getOrDefault(
469+
SnowflakeSinkConnectorConfig.AUTHENTICATOR_TYPE, OAuthConstants.SNOWFLAKE_JWT)) {
470+
// TODO: SNOW-889748 change to enum
471+
case OAuthConstants.SNOWFLAKE_JWT:
481472
if (!config.containsKey(SnowflakeSinkConnectorConfig.SNOWFLAKE_PRIVATE_KEY)) {
482473
invalidConfigParams.put(
483474
SnowflakeSinkConnectorConfig.SNOWFLAKE_PRIVATE_KEY,
484475
Utils.formatString(
485476
"{} cannot be empty when using {} authenticator.",
486477
SnowflakeSinkConnectorConfig.SNOWFLAKE_PRIVATE_KEY,
487-
SNOWFLAKE_JWT));
478+
OAuthConstants.SNOWFLAKE_JWT));
488479
}
489480
break;
490-
case OAUTH:
481+
case OAuthConstants.OAUTH:
491482
if (!config.containsKey(SnowflakeSinkConnectorConfig.OAUTH_CLIENT_ID)) {
492483
invalidConfigParams.put(
493484
SnowflakeSinkConnectorConfig.OAUTH_CLIENT_ID,
494485
Utils.formatString(
495486
"{} cannot be empty when using {} authenticator.",
496487
SnowflakeSinkConnectorConfig.OAUTH_CLIENT_ID,
497-
OAUTH));
488+
OAuthConstants.OAUTH));
498489
}
499490
if (!config.containsKey(SnowflakeSinkConnectorConfig.OAUTH_CLIENT_SECRET)) {
500491
invalidConfigParams.put(
501492
SnowflakeSinkConnectorConfig.OAUTH_CLIENT_SECRET,
502493
Utils.formatString(
503494
"{} cannot be empty when using {} authenticator.",
504495
SnowflakeSinkConnectorConfig.OAUTH_CLIENT_SECRET,
505-
OAUTH));
496+
OAuthConstants.OAUTH));
506497
}
507498
if (!config.containsKey(SnowflakeSinkConnectorConfig.OAUTH_REFRESH_TOKEN)) {
508499
invalidConfigParams.put(
509500
SnowflakeSinkConnectorConfig.OAUTH_REFRESH_TOKEN,
510501
Utils.formatString(
511502
"{} cannot be empty when using {} authenticator.",
512503
SnowflakeSinkConnectorConfig.OAUTH_REFRESH_TOKEN,
513-
OAUTH));
504+
OAuthConstants.OAUTH));
514505
}
515506
break;
516507
default:
@@ -519,8 +510,8 @@ && parseTopicToTableMap(config.get(SnowflakeSinkConnectorConfig.TOPICS_TABLES_MA
519510
Utils.formatString(
520511
"{} should be one of {} or {}.",
521512
SnowflakeSinkConnectorConfig.AUTHENTICATOR_TYPE,
522-
SNOWFLAKE_JWT,
523-
OAUTH));
513+
OAuthConstants.SNOWFLAKE_JWT,
514+
OAuthConstants.OAUTH));
524515
}
525516

526517
if (!config.containsKey(SnowflakeSinkConnectorConfig.SNOWFLAKE_USER)) {
@@ -792,7 +783,13 @@ public static String formatString(String format, Object... vars) {
792783
public static String getSnowflakeOAuthAccessToken(
793784
SnowflakeURL url, String clientId, String clientSecret, String refreshToken) {
794785
return getSnowflakeOAuthToken(
795-
url, clientId, clientSecret, refreshToken, REFRESH_TOKEN, REFRESH_TOKEN, ACCESS_TOKEN);
786+
url,
787+
clientId,
788+
clientSecret,
789+
refreshToken,
790+
OAuthConstants.REFRESH_TOKEN,
791+
OAuthConstants.REFRESH_TOKEN,
792+
OAuthConstants.ACCESS_TOKEN);
796793
}
797794

798795
/**
@@ -818,16 +815,16 @@ public static String getSnowflakeOAuthToken(
818815
String credentialType,
819816
String tokenType) {
820817
Map<String, String> headers = new HashMap<>();
821-
headers.put(HttpHeaders.CONTENT_TYPE, OAUTH_CONTENT_TYPE_HEADER);
818+
headers.put(HttpHeaders.CONTENT_TYPE, OAuthConstants.OAUTH_CONTENT_TYPE_HEADER);
822819
headers.put(
823820
HttpHeaders.AUTHORIZATION,
824-
BASIC_AUTH_HEADER_PREFIX
821+
OAuthConstants.BASIC_AUTH_HEADER_PREFIX
825822
+ Base64.getEncoder().encodeToString((clientId + ":" + clientSecret).getBytes()));
826823

827824
Map<String, String> payload = new HashMap<>();
828-
payload.put(GRANT_TYPE_PARAM, grantType);
825+
payload.put(OAuthConstants.GRANT_TYPE_PARAM, grantType);
829826
payload.put(credentialType, credential);
830-
payload.put(REDIRECT_URI, DEFAULT_REDIRECT_URI);
827+
payload.put(OAuthConstants.REDIRECT_URI, OAuthConstants.DEFAULT_REDIRECT_URI);
831828

832829
// Encode and convert payload into string entity
833830
String payloadString =
@@ -844,11 +841,11 @@ public static String getSnowflakeOAuthToken(
844841
final StringEntity entity =
845842
new StringEntity(payloadString, ContentType.APPLICATION_FORM_URLENCODED);
846843

847-
HttpPost post = makeOAuthHttpPost(url, TOKEN_REQUEST_ENDPOINT, headers, entity);
844+
HttpPost post = makeOAuthHttpPost(url, OAuthConstants.TOKEN_REQUEST_ENDPOINT, headers, entity);
848845

849846
// Request access token
850847
CloseableHttpClient client = HttpClientBuilder.create().build();
851-
for (int retries = 0; retries < OAUTH_MAX_RETRY; retries++) {
848+
for (int retries = 0; retries < OAuthConstants.OAUTH_MAX_RETRY; retries++) {
852849
try (CloseableHttpResponse httpResponse = client.execute(post)) {
853850
String respBodyString = EntityUtils.toString(httpResponse.getEntity());
854851

src/main/java/com/snowflake/kafka/connector/internal/InternalUtils.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -184,9 +184,9 @@ static Properties createProperties(
184184

185185
// Set credential
186186
if (!properties.containsKey(JDBC_AUTHENTICATOR)) {
187-
properties.put(JDBC_AUTHENTICATOR, Utils.SNOWFLAKE_JWT);
187+
properties.put(JDBC_AUTHENTICATOR, OAuthConstants.SNOWFLAKE_JWT);
188188
}
189-
if (properties.getProperty(JDBC_AUTHENTICATOR).equals(Utils.SNOWFLAKE_JWT)) {
189+
if (properties.getProperty(JDBC_AUTHENTICATOR).equals(OAuthConstants.SNOWFLAKE_JWT)) {
190190
// JWT key pair auth
191191
if (!privateKeyPassphrase.isEmpty()) {
192192
properties.put(
@@ -195,7 +195,7 @@ static Properties createProperties(
195195
} else if (!privateKey.isEmpty()) {
196196
properties.put(JDBC_PRIVATE_KEY, parsePrivateKey(privateKey));
197197
}
198-
} else if (properties.getProperty(JDBC_AUTHENTICATOR).equals(Utils.OAUTH)) {
198+
} else if (properties.getProperty(JDBC_AUTHENTICATOR).equals(OAuthConstants.OAUTH)) {
199199
// OAuth auth
200200
if (oAuthClientId.isEmpty()) {
201201
throw SnowflakeErrors.ERROR_0026.getException();
@@ -243,7 +243,7 @@ static Properties createProperties(
243243
}
244244

245245
// required parameter check, the OAuth parameter is already checked when fetching access token
246-
if (properties.getProperty(JDBC_AUTHENTICATOR).equals(Utils.SNOWFLAKE_JWT)
246+
if (properties.getProperty(JDBC_AUTHENTICATOR).equals(OAuthConstants.SNOWFLAKE_JWT)
247247
&& !properties.containsKey(JDBC_PRIVATE_KEY)) {
248248
throw SnowflakeErrors.ERROR_0013.getException();
249249
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.snowflake.kafka.connector.internal;
2+
3+
/**
4+
* This class contains constants for OAuth request.
5+
*
6+
* @see <a
7+
* href="https://github.com/snowflakedb/snowflake/blob/4fdb96cd5849f266cda430c5d49a13c29e866af5/GlobalServices/src/main/java/com/snowflake/resources/ResourceConstants.java">ResourceConstants</a>
8+
*/
9+
public class OAuthConstants {
10+
public static final String TOKEN_REQUEST_ENDPOINT = "/oauth/token-request";
11+
public static final String OAUTH_CONTENT_TYPE_HEADER = "application/x-www-form-urlencoded";
12+
public static final String BASIC_AUTH_HEADER_PREFIX = "Basic ";
13+
public static final String GRANT_TYPE_PARAM = "grant_type";
14+
public static final String REFRESH_TOKEN = "refresh_token";
15+
public static final String ACCESS_TOKEN = "access_token";
16+
public static final String SNOWFLAKE_JWT = "snowflake_jwt";
17+
public static final String OAUTH = "oauth";
18+
public static final String REDIRECT_URI = "redirect_uri";
19+
public static final String DEFAULT_REDIRECT_URI = "https://localhost.com/oauth";
20+
public static final int OAUTH_MAX_RETRY = 5;
21+
}

src/main/java/com/snowflake/kafka/connector/internal/streaming/StreamingUtils.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import com.snowflake.kafka.connector.SnowflakeSinkConnectorConfig;
1717
import com.snowflake.kafka.connector.Utils;
1818
import com.snowflake.kafka.connector.internal.BufferThreshold;
19+
import com.snowflake.kafka.connector.internal.OAuthConstants;
1920
import java.time.Duration;
2021
import java.util.HashMap;
2122
import java.util.Map;
@@ -101,11 +102,11 @@ public static Map<String, String> convertConfigForStreamingClient(
101102
connectorConfig.computeIfPresent(
102103
Utils.SF_AUTHENTICATOR,
103104
(key, value) -> {
104-
if (value.equals(Utils.SNOWFLAKE_JWT)) {
105+
if (value.equals(OAuthConstants.SNOWFLAKE_JWT)) {
105106
streamingPropertiesMap.put(
106107
STREAMING_CONSTANT_AUTHORIZATION_TYPE, STREAMING_CONSTANT_JWT);
107108
}
108-
if (value.equals(Utils.OAUTH)) {
109+
if (value.equals(OAuthConstants.OAUTH)) {
109110
streamingPropertiesMap.put(
110111
STREAMING_CONSTANT_AUTHORIZATION_TYPE, STREAMING_CONSTANT_OAUTH);
111112
}

src/test/java/com/snowflake/kafka/connector/ConnectorConfigTest.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@
44
import static com.snowflake.kafka.connector.SnowflakeSinkConnectorConfig.ERRORS_TOLERANCE_CONFIG;
55
import static com.snowflake.kafka.connector.SnowflakeSinkConnectorConfig.NAME;
66
import static com.snowflake.kafka.connector.Utils.HTTP_NON_PROXY_HOSTS;
7-
import static com.snowflake.kafka.connector.Utils.OAUTH;
87
import static com.snowflake.kafka.connector.internal.TestUtils.getConfig;
98
import static org.junit.Assert.assertEquals;
109

10+
import com.snowflake.kafka.connector.internal.OAuthConstants;
1111
import com.snowflake.kafka.connector.internal.SnowflakeErrors;
1212
import com.snowflake.kafka.connector.internal.SnowflakeKafkaConnectorException;
1313
import com.snowflake.kafka.connector.internal.streaming.IngestionMethodConfig;
@@ -902,7 +902,7 @@ public void testMultipleInvalidConfigs() {
902902
@Test
903903
public void testOAuthAuthenticator() {
904904
Map<String, String> config = getConfig();
905-
config.put(SnowflakeSinkConnectorConfig.AUTHENTICATOR_TYPE, OAUTH);
905+
config.put(SnowflakeSinkConnectorConfig.AUTHENTICATOR_TYPE, OAuthConstants.OAUTH);
906906
config.put(SnowflakeSinkConnectorConfig.OAUTH_CLIENT_ID, "client_id");
907907
config.put(SnowflakeSinkConnectorConfig.OAUTH_CLIENT_SECRET, "client_secret");
908908
config.put(SnowflakeSinkConnectorConfig.OAUTH_REFRESH_TOKEN, "refresh_token");
@@ -924,7 +924,7 @@ public void testInvalidAuthenticator() {
924924
public void testEmptyClientId() {
925925
try {
926926
Map<String, String> config = getConfig();
927-
config.put(SnowflakeSinkConnectorConfig.AUTHENTICATOR_TYPE, OAUTH);
927+
config.put(SnowflakeSinkConnectorConfig.AUTHENTICATOR_TYPE, OAuthConstants.OAUTH);
928928
config.put(SnowflakeSinkConnectorConfig.OAUTH_CLIENT_SECRET, "client_secret");
929929
config.put(SnowflakeSinkConnectorConfig.OAUTH_REFRESH_TOKEN, "refresh_token");
930930
Utils.validateConfig(config);
@@ -937,7 +937,7 @@ public void testEmptyClientId() {
937937
public void testEmptyClientSecret() {
938938
try {
939939
Map<String, String> config = getConfig();
940-
config.put(SnowflakeSinkConnectorConfig.AUTHENTICATOR_TYPE, OAUTH);
940+
config.put(SnowflakeSinkConnectorConfig.AUTHENTICATOR_TYPE, OAuthConstants.OAUTH);
941941
config.put(SnowflakeSinkConnectorConfig.OAUTH_CLIENT_ID, "client_id");
942942
config.put(SnowflakeSinkConnectorConfig.OAUTH_REFRESH_TOKEN, "refresh_token");
943943
Utils.validateConfig(config);
@@ -950,7 +950,7 @@ public void testEmptyClientSecret() {
950950
public void testEmptyRefreshToken() {
951951
try {
952952
Map<String, String> config = getConfig();
953-
config.put(SnowflakeSinkConnectorConfig.AUTHENTICATOR_TYPE, OAUTH);
953+
config.put(SnowflakeSinkConnectorConfig.AUTHENTICATOR_TYPE, OAuthConstants.OAUTH);
954954
config.put(SnowflakeSinkConnectorConfig.OAUTH_CLIENT_ID, "client_id");
955955
config.put(SnowflakeSinkConnectorConfig.OAUTH_CLIENT_SECRET, "client_secret");
956956
Utils.validateConfig(config);

src/test/java/com/snowflake/kafka/connector/internal/TestUtils.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,6 @@
2626
import static com.snowflake.kafka.connector.Utils.HTTP_PROXY_USER;
2727
import static com.snowflake.kafka.connector.Utils.HTTP_USE_PROXY;
2828
import static com.snowflake.kafka.connector.Utils.JDK_HTTP_AUTH_TUNNELING;
29-
import static com.snowflake.kafka.connector.Utils.OAUTH;
30-
import static com.snowflake.kafka.connector.Utils.REFRESH_TOKEN;
3129
import static com.snowflake.kafka.connector.Utils.SF_DATABASE;
3230
import static com.snowflake.kafka.connector.Utils.SF_SCHEMA;
3331
import static com.snowflake.kafka.connector.Utils.SF_URL;
@@ -365,7 +363,7 @@ public static Map<String, String> getConfWithOAuth() {
365363
if (!confWithOAuth.containsKey(Utils.SF_OAUTH_REFRESH_TOKEN)) {
366364
confWithOAuth.put(Utils.SF_OAUTH_REFRESH_TOKEN, getRefreshToken(confWithOAuth));
367365
}
368-
confWithOAuth.put(Utils.SF_AUTHENTICATOR, OAUTH);
366+
confWithOAuth.put(Utils.SF_AUTHENTICATOR, OAuthConstants.OAUTH);
369367
confWithOAuth.remove(Utils.SF_PRIVATE_KEY);
370368
confWithOAuth.put(Utils.SF_ROLE, getProfile(PROFILE_PATH).get(ROLE).asText());
371369
}
@@ -875,7 +873,7 @@ public static String getRefreshToken(Map<String, String> config) {
875873
getAZCode(config),
876874
AZ_GRANT_TYPE,
877875
AZ_CREDENTIAL_TYPE_CODE,
878-
REFRESH_TOKEN);
876+
OAuthConstants.REFRESH_TOKEN);
879877
}
880878

881879
private static String getAZCode(Map<String, String> config) {

0 commit comments

Comments
 (0)