This is an automated email from the ASF dual-hosted git repository.
jiangtian pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/master by this push:
new f7b70883ec1 Remove OpenIdAuthorizer and OpenID authentication
dependencies (#17320)
f7b70883ec1 is described below
commit f7b70883ec1a2569f55f1ec99848521927cddbd2
Author: Haonan <[email protected]>
AuthorDate: Fri Mar 20 12:32:41 2026 +0800
Remove OpenIdAuthorizer and OpenID authentication dependencies (#17320)
* Remove OpenID authorizer and configuration dependencies
* Remove stale OpenID dependencies from SBOM metadata
---
LICENSE-binary | 10 -
dependencies.json | 8 -
.../persistence/auth/AuthorPlanExecutor.java | 10 +-
iotdb-core/datanode/pom.xml | 27 ---
.../db/auth/authorizer/OpenIdAuthorizerTest.java | 114 ---------
iotdb-core/node-commons/pom.xml | 16 --
.../conf/iotdb-system.properties.template | 6 -
.../commons/auth/authorizer/OpenIdAuthorizer.java | 270 ---------------------
.../apache/iotdb/commons/conf/CommonConfig.java | 11 -
.../iotdb/commons/conf/CommonDescriptor.java | 3 -
pom.xml | 39 +--
11 files changed, 2 insertions(+), 512 deletions(-)
diff --git a/LICENSE-binary b/LICENSE-binary
index 482b1c1e7a5..243bc9d7583 100644
--- a/LICENSE-binary
+++ b/LICENSE-binary
@@ -216,7 +216,6 @@ following license. See licenses/ for text of these licenses.
Apache License 2.0
--------------------------------------
commons-cli:commons-cli:1.5.0
-com.nimbusds:content-type:2.2
com.google.code.gson:gson:2.13.1
com.google.guava.guava:32.1.2-jre
com.fasterxml.jackson.core:jackson-annotations:2.16.2
@@ -224,7 +223,6 @@ com.fasterxml.jackson.core:jackson-core:2.16.2
com.fasterxml.jackson.core:jackson-databind:2.16.2
jakarta.inject:jakarta.inject:2.6.1
at.yawk.lz4:lz4-java:1.10.0
-com.github.stephenc.jcip:jcip-annotations:1.0-1
com.github.ben-manes.caffeine:caffeine:2.9.3
org.eclipse.jetty:jetty-http:9.4.58.v20250814
org.eclipse.jetty:jetty-io:9.4.58.v20250814
@@ -232,12 +230,7 @@ org.eclipse.jetty:jetty-security:9.4.58.v20250814
org.eclipse.jetty:jetty-server:9.4.58.v20250814
org.eclipse.jetty:jetty-servlet:9.4.58.v20250814
org.eclipse.jetty:jetty-util:9.4.58.v20250814
-io.jsonwebtoken:jjwt-api:0.12.7
-io.jsonwebtoken:jjwt-impl:0.12.7
-io.jsonwebtoken:jjwt-jackson:0.12.7
-net.minidev:json-smart:2.5.2
com.google.code.findbugs:jsr305:3.0.2
-com.nimbusds:lang-tag:1.7
com.librato.metrics:librato-java:2.1.0
org.apache.thrift:libthrift:0.14.1
io.dropwizard.metrics:metrics-core:4.2.19
@@ -255,14 +248,11 @@ io.netty:netty-transport:4.1.126.Final
io.netty:netty-transport-native-epoll:4.1.126.Final:linux-aarch_64
io.netty:netty-transport-native-epoll:4.1.126.Final:linux-x86_64
io.netty:netty-transport-native-unix-common:4.1.126.Final
-com.nimbusds:nimbus-jose-jwt:9.37.4
-com.nimbusds:oauth2-oidc-sdk:10.15
org.osgi:org.osgi.core:7.0.0
org.osgi:osgi.cmpn:7.0.0
org.ops4j.pax.jdbc:pax-jdbc-common:1.5.6
org.xerial.snappy:snappy-java:1.1.10.5
io.airlift.airline:0.9
-net.minidev:accessors-smart:2.5.0
BSD 3-Clause
diff --git a/dependencies.json b/dependencies.json
index 4a1cbf804d7..eaaf50beae5 100644
--- a/dependencies.json
+++ b/dependencies.json
@@ -18,7 +18,6 @@
"com.github.ben-manes.caffeine:caffeine",
"com.github.luben:zstd-jni",
"com.github.moquette-io.moquette:moquette-broker",
- "com.github.stephenc.jcip:jcip-annotations",
"com.github.wendykierp:JTransforms",
"com.google.code.findbugs:jsr305",
"com.google.code.gson:gson",
@@ -28,10 +27,6 @@
"com.google.guava:listenablefuture",
"com.google.j2objc:j2objc-annotations",
"com.h2database:h2-mvstore",
- "com.nimbusds:content-type",
- "com.nimbusds:lang-tag",
- "com.nimbusds:nimbus-jose-jwt",
- "com.nimbusds:oauth2-oidc-sdk",
"com.sun.istack:istack-commons-runtime",
"com.zaxxer:HikariCP",
"commons-cli:commons-cli",
@@ -40,7 +35,6 @@
"io.airlift:airline",
"io.airlift:units",
"io.dropwizard.metrics:metrics-core",
- "io.jsonwebtoken:jjwt-api",
"io.micrometer:micrometer-commons",
"io.micrometer:micrometer-core",
"io.micrometer:micrometer-observation",
@@ -88,8 +82,6 @@
"javax.xml.bind:jaxb-api",
"net.java.dev.jna:jna",
"net.java.dev.jna:jna-platform",
- "net.minidev:accessors-smart",
- "net.minidev:json-smart",
"org.antlr:antlr4-runtime",
"org.apache.commons:commons-csv",
"org.apache.commons:commons-lang3",
diff --git
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/auth/AuthorPlanExecutor.java
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/auth/AuthorPlanExecutor.java
index c915630b4f5..cf537d5c667 100644
---
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/auth/AuthorPlanExecutor.java
+++
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/auth/AuthorPlanExecutor.java
@@ -22,7 +22,6 @@ package org.apache.iotdb.confignode.persistence.auth;
import org.apache.iotdb.common.rpc.thrift.TSStatus;
import org.apache.iotdb.commons.auth.AuthException;
import org.apache.iotdb.commons.auth.authorizer.IAuthorizer;
-import org.apache.iotdb.commons.auth.authorizer.OpenIdAuthorizer;
import org.apache.iotdb.commons.auth.entity.ModelType;
import org.apache.iotdb.commons.auth.entity.PrivilegeModelType;
import org.apache.iotdb.commons.auth.entity.PrivilegeType;
@@ -83,14 +82,7 @@ public class AuthorPlanExecutor implements
IAuthorPlanExecutor {
try {
status = authorizer.login(username, password, useEncryptedPassword);
if (status) {
- // Bring this user's permission information back to the datanode for
caching
- if (authorizer instanceof OpenIdAuthorizer) {
- username = ((OpenIdAuthorizer)
authorizer).getIoTDBUserName(username);
- result = getUserPermissionInfo(username, ModelType.ALL);
- result.getUserInfo().setIsOpenIdUser(true);
- } else {
- result = getUserPermissionInfo(username, ModelType.ALL);
- }
+ result = getUserPermissionInfo(username, ModelType.ALL);
result.setStatus(RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS,
"Login successfully"));
} else {
diff --git a/iotdb-core/datanode/pom.xml b/iotdb-core/datanode/pom.xml
index 1acf65574f0..ffba7f4bb64 100644
--- a/iotdb-core/datanode/pom.xml
+++ b/iotdb-core/datanode/pom.xml
@@ -282,33 +282,11 @@
<artifactId>mockito-core</artifactId>
<scope>test</scope>
</dependency>
- <!-- Possibly these need to move into the compile or provided scope -->
- <dependency>
- <groupId>io.jsonwebtoken</groupId>
- <artifactId>jjwt-impl</artifactId>
- <scope>test</scope>
- </dependency>
- <!-- Possibly these need to move into the compile or provided scope -->
- <dependency>
- <groupId>io.jsonwebtoken</groupId>
- <artifactId>jjwt-jackson</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>net.minidev</groupId>
- <artifactId>json-smart</artifactId>
- <scope>test</scope>
- </dependency>
<dependency>
<groupId>org.apache.ratis</groupId>
<artifactId>ratis-thirdparty-misc</artifactId>
<scope>runtime</scope>
</dependency>
- <dependency>
- <groupId>com.nimbusds</groupId>
- <artifactId>oauth2-oidc-sdk</artifactId>
- <scope>test</scope>
- </dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-core</artifactId>
@@ -493,11 +471,6 @@
<!-- For some reason this plugin missed it being used
for a constant import -->
<ignoredDependency>org.apache.iotdb:isession</ignoredDependency>
</ignoredDependencies>
- <usedDependencies>
- <!-- These are used at runtime in tests -->
-
<usedDependency>io.jsonwebtoken:jjwt-impl</usedDependency>
-
<usedDependency>io.jsonwebtoken:jjwt-jackson</usedDependency>
- </usedDependencies>
</configuration>
</plugin>
<plugin>
diff --git
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/auth/authorizer/OpenIdAuthorizerTest.java
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/auth/authorizer/OpenIdAuthorizerTest.java
deleted file mode 100644
index 196cc80e5b6..00000000000
---
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/auth/authorizer/OpenIdAuthorizerTest.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * 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.apache.iotdb.db.auth.authorizer;
-
-import org.apache.iotdb.commons.auth.AuthException;
-import org.apache.iotdb.commons.auth.authorizer.OpenIdAuthorizer;
-import org.apache.iotdb.commons.conf.CommonConfig;
-import org.apache.iotdb.commons.conf.CommonDescriptor;
-import org.apache.iotdb.db.utils.EnvironmentUtils;
-
-import com.nimbusds.oauth2.sdk.ParseException;
-import com.nimbusds.oauth2.sdk.util.JSONObjectUtils;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Ignore;
-import org.junit.Test;
-
-import java.io.IOException;
-import java.net.URISyntaxException;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-public class OpenIdAuthorizerTest {
-
- private static final String OPEN_ID_PUBLIC_JWK =
-
"{\"kty\":\"RSA\",\"x5t#S256\":\"TZFbbj6HsRU28HYvrcVnDs03KreV3DE24-Cxb9EPdS4\",\"e\":\"AQAB\",\"use\":\"sig\",\"x5t\":\"l_N2UlC_a624iu5eYFypnB1Wr20\",\"kid\":\"q1-Wm0ozQ5O0mQH8-SJap2ZcN4MmucWwnQWKYxZJ4ow\",\"x5c\":[\"MIICmTCCAYECBgFyRdXW2DANBgkqhkiG9w0BAQsFADAQMQ4wDAYDVQQDDAVJb1REQjAeFw0yMDA1MjQwODM3MjJaFw0zMDA1MjQwODM5MDJaMBAxDjAMBgNVBAMMBUlvVERCMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAozDCZTVc9946VvhZ6E\\/OP8Yx6tJe0i9GR2Q9jR9S3jQoo0haT\\/P1b\\/zvQK52qA1xj6tBVg64xl3+LUxtCvh3HfA
[...]
- private static CommonConfig config;
-
- @Before
- public void setUp() throws Exception {
- EnvironmentUtils.envSetUp();
- config = CommonDescriptor.getInstance().getConfig();
- }
-
- @After
- public void tearDown() throws Exception {
- EnvironmentUtils.cleanEnv();
- }
-
- @Test
- public void loginWithJWT() throws AuthException, ParseException {
- String jwt =
-
"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJxMS1XbTBvelE1TzBtUUg4LVNKYXAyWmNONE1tdWNXd25RV0tZeFpKNG93In0.eyJleHAiOjE1OTAzMTcxNzYsImlhdCI6MTU5MDMxNjg3NiwianRpIjoiY2MyNWQ3MDAtYjc5NC00OTA4LTg0OGUtOTRhNzYzNmM5YzQxIiwiaXNzIjoiaHR0cDovL2F1dGguZGVtby5wcmFnbWF0aWNpbmR1c3RyaWVzLmRlL2F1dGgvcmVhbG1zL0lvVERCIiwiYXVkIjoiYWNjb3VudCIsInN1YiI6Ijg2YWRmNGIzLWE4ZTUtNDc1NC1iNWEwLTQ4OGI0OWY0M2VkMiIsInR5cCI6IkJlYXJlciIsImF6cCI6ImlvdGRiIiwic2Vzc2lvbl9zdGF0ZSI6Ijk0ZmI5NGZjLTg3YTMtNDg4Ny04M2Q3LWE
[...]
-
- OpenIdAuthorizer authorizer = new
OpenIdAuthorizer(JSONObjectUtils.parse(OPEN_ID_PUBLIC_JWK));
- boolean login = authorizer.login(jwt, null, false);
-
- assertTrue(login);
- }
-
- @Test
- public void isAdmin_hasAccess() throws AuthException, ParseException {
- // IOTDB_ADMIN = true
- String jwt =
-
"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJxMS1XbTBvelE1TzBtUUg4LVNKYXAyWmNONE1tdWNXd25RV0tZeFpKNG93In0.eyJleHAiOjE1OTAzMjM5MjgsImlhdCI6MTU5MDMyMzYyOCwianRpIjoiZGQ5ZDZhNmItZjgzOC00Mjk3LTg5YWUtMjdlZTgxNzVhMThiIiwiaXNzIjoiaHR0cDovL2F1dGguZGVtby5wcmFnbWF0aWNpbmR1c3RyaWVzLmRlL2F1dGgvcmVhbG1zL0lvVERCIiwiYXVkIjoiYWNjb3VudCIsInN1YiI6ImJhMzJlNDcxLWM3NzItNGIzMy04ZGE2LTZmZThhY2RhMDA3MyIsInR5cCI6IkJlYXJlciIsImF6cCI6ImlvdGRiIiwic2Vzc2lvbl9zdGF0ZSI6IjViZDRhNmM5LTBmYzItNGIxMy05Y2QxLTF
[...]
-
- OpenIdAuthorizer authorizer = new
OpenIdAuthorizer(JSONObjectUtils.parse(OPEN_ID_PUBLIC_JWK));
- boolean admin = authorizer.isAdmin(jwt);
-
- assertTrue(admin);
- }
-
- @Test
- public void isAdmin_noAdminClaim() throws AuthException, ParseException {
- // IOTDB_ADMIN = false
- String jwt =
-
"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJxMS1XbTBvelE1TzBtUUg4LVNKYXAyWmNONE1tdWNXd25RV0tZeFpKNG93In0.eyJleHAiOjE1OTAzMTcxNzYsImlhdCI6MTU5MDMxNjg3NiwianRpIjoiY2MyNWQ3MDAtYjc5NC00OTA4LTg0OGUtOTRhNzYzNmM5YzQxIiwiaXNzIjoiaHR0cDovL2F1dGguZGVtby5wcmFnbWF0aWNpbmR1c3RyaWVzLmRlL2F1dGgvcmVhbG1zL0lvVERCIiwiYXVkIjoiYWNjb3VudCIsInN1YiI6Ijg2YWRmNGIzLWE4ZTUtNDc1NC1iNWEwLTQ4OGI0OWY0M2VkMiIsInR5cCI6IkJlYXJlciIsImF6cCI6ImlvdGRiIiwic2Vzc2lvbl9zdGF0ZSI6Ijk0ZmI5NGZjLTg3YTMtNDg4Ny04M2Q3LWE
[...]
-
- OpenIdAuthorizer authorizer = new
OpenIdAuthorizer(JSONObjectUtils.parse(OPEN_ID_PUBLIC_JWK));
- boolean admin = authorizer.isAdmin(jwt);
-
- assertFalse(admin);
- }
-
- /** Can be run manually as long as the site below is active... */
- @Test
- @Ignore("We have to find a way to test this against a defined OIDC Provider")
- public void fetchMetadata()
- throws ParseException, IOException, URISyntaxException, AuthException {
- OpenIdAuthorizer openIdAuthorizer =
- new
OpenIdAuthorizer("https://auth.demo.pragmaticindustries.de/auth/realms/IoTDB/");
- boolean login =
- openIdAuthorizer.login(
-
"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJxMS1XbTBvelE1TzBtUUg4LVNKYXAyWmNONE1tdWNXd25RV0tZeFpKNG93In0.eyJleHAiOjE1OTAzMTcxNzYsImlhdCI6MTU5MDMxNjg3NiwianRpIjoiY2MyNWQ3MDAtYjc5NC00OTA4LTg0OGUtOTRhNzYzNmM5YzQxIiwiaXNzIjoiaHR0cDovL2F1dGguZGVtby5wcmFnbWF0aWNpbmR1c3RyaWVzLmRlL2F1dGgvcmVhbG1zL0lvVERCIiwiYXVkIjoiYWNjb3VudCIsInN1YiI6Ijg2YWRmNGIzLWE4ZTUtNDc1NC1iNWEwLTQ4OGI0OWY0M2VkMiIsInR5cCI6IkJlYXJlciIsImF6cCI6ImlvdGRiIiwic2Vzc2lvbl9zdGF0ZSI6Ijk0ZmI5NGZjLTg3YTMtNDg4Ny04M2Q
[...]
- "",
- false);
- assertTrue(login);
-
config.setOpenIdProviderUrl("https://auth.demo.pragmaticindustries.de/auth/realms/IoTDB/");
- OpenIdAuthorizer openIdAuthorizer1 = new OpenIdAuthorizer();
- login =
- openIdAuthorizer1.login(
-
"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJxMS1XbTBvelE1TzBtUUg4LVNKYXAyWmNONE1tdWNXd25RV0tZeFpKNG93In0.eyJleHAiOjE1OTAzMTcxNzYsImlhdCI6MTU5MDMxNjg3NiwianRpIjoiY2MyNWQ3MDAtYjc5NC00OTA4LTg0OGUtOTRhNzYzNmM5YzQxIiwiaXNzIjoiaHR0cDovL2F1dGguZGVtby5wcmFnbWF0aWNpbmR1c3RyaWVzLmRlL2F1dGgvcmVhbG1zL0lvVERCIiwiYXVkIjoiYWNjb3VudCIsInN1YiI6Ijg2YWRmNGIzLWE4ZTUtNDc1NC1iNWEwLTQ4OGI0OWY0M2VkMiIsInR5cCI6IkJlYXJlciIsImF6cCI6ImlvdGRiIiwic2Vzc2lvbl9zdGF0ZSI6Ijk0ZmI5NGZjLTg3YTMtNDg4Ny04M2Q
[...]
- "",
- false);
- assertTrue(login);
- }
-}
diff --git a/iotdb-core/node-commons/pom.xml b/iotdb-core/node-commons/pom.xml
index 098f2b64d29..29cb467f790 100644
--- a/iotdb-core/node-commons/pom.xml
+++ b/iotdb-core/node-commons/pom.xml
@@ -138,26 +138,10 @@
<groupId>com.google.code.findbugs</groupId>
<artifactId>jsr305</artifactId>
</dependency>
- <dependency>
- <groupId>net.minidev</groupId>
- <artifactId>json-smart</artifactId>
- </dependency>
- <dependency>
- <groupId>com.nimbusds</groupId>
- <artifactId>nimbus-jose-jwt</artifactId>
- </dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
</dependency>
- <dependency>
- <groupId>io.jsonwebtoken</groupId>
- <artifactId>jjwt-api</artifactId>
- </dependency>
- <dependency>
- <groupId>com.nimbusds</groupId>
- <artifactId>oauth2-oidc-sdk</artifactId>
- </dependency>
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
diff --git
a/iotdb-core/node-commons/src/assembly/resources/conf/iotdb-system.properties.template
b/iotdb-core/node-commons/src/assembly/resources/conf/iotdb-system.properties.template
index fedaa5ab43b..ed148b3a0b7 100644
---
a/iotdb-core/node-commons/src/assembly/resources/conf/iotdb-system.properties.template
+++
b/iotdb-core/node-commons/src/assembly/resources/conf/iotdb-system.properties.template
@@ -1733,16 +1733,10 @@ compressor=LZ4
####################
# which class to serve for authorization. By default, it is
LocalFileAuthorizer.
-# Another choice is org.apache.iotdb.commons.auth.authorizer.OpenIdAuthorizer
# effectiveMode: restart
# Privilege: SECURITY
authorizer_provider_class=org.apache.iotdb.commons.auth.authorizer.LocalFileAuthorizer
-# If OpenIdAuthorizer is enabled, then openID_url must be set.
-# effectiveMode: restart
-# Privilege: SECURITY
-openID_url=
-
# encryption provider class
# effectiveMode: first_start
iotdb_server_encrypt_decrypt_provider=org.apache.iotdb.commons.security.encrypt.MessageDigestEncrypt
diff --git
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/auth/authorizer/OpenIdAuthorizer.java
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/auth/authorizer/OpenIdAuthorizer.java
deleted file mode 100644
index ee66ee5bced..00000000000
---
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/auth/authorizer/OpenIdAuthorizer.java
+++ /dev/null
@@ -1,270 +0,0 @@
-/*
- * 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.apache.iotdb.commons.auth.authorizer;
-
-import org.apache.iotdb.commons.auth.AuthException;
-import org.apache.iotdb.commons.auth.entity.PrivilegeUnion;
-import org.apache.iotdb.commons.auth.role.LocalFileRoleManager;
-import org.apache.iotdb.commons.auth.user.LocalFileUserManager;
-import org.apache.iotdb.commons.conf.CommonConfig;
-import org.apache.iotdb.commons.conf.CommonDescriptor;
-import org.apache.iotdb.rpc.TSStatusCode;
-
-import com.nimbusds.jose.JOSEException;
-import com.nimbusds.jose.jwk.RSAKey;
-import com.nimbusds.oauth2.sdk.ParseException;
-import com.nimbusds.oauth2.sdk.util.JSONObjectUtils;
-import com.nimbusds.openid.connect.sdk.op.OIDCProviderMetadata;
-import io.jsonwebtoken.Claims;
-import io.jsonwebtoken.JwtException;
-import io.jsonwebtoken.Jwts;
-import net.minidev.json.JSONArray;
-import net.minidev.json.JSONObject;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.URL;
-import java.security.interfaces.RSAPublicKey;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Scanner;
-import java.util.UUID;
-
-/** Uses an OpenID Connect provider for Authorization / Authentication. */
-public class OpenIdAuthorizer extends BasicAuthorizer {
-
- private static final Logger logger =
LoggerFactory.getLogger(OpenIdAuthorizer.class);
- public static final String IOTDB_ADMIN_ROLE_NAME = "iotdb_admin";
- public static final String OPENID_USER_PREFIX = "openid-";
-
- private static final CommonConfig config =
CommonDescriptor.getInstance().getConfig();
-
- private final RSAPublicKey providerKey;
-
- /** Stores all claims to the respective user */
- private final Map<String, Claims> loggedClaims = new HashMap<>();
-
- public OpenIdAuthorizer() throws AuthException, ParseException, IOException,
URISyntaxException {
- this(config.getOpenIdProviderUrl());
- }
-
- public OpenIdAuthorizer(JSONObject jwk) throws AuthException {
- super(
- new LocalFileUserManager(config.getUserFolder()),
- new LocalFileRoleManager(config.getRoleFolder()));
- try {
- providerKey = RSAKey.parse(jwk).toRSAPublicKey();
- } catch (java.text.ParseException | JOSEException e) {
- throw new AuthException(
- TSStatusCode.INIT_AUTH_ERROR, "Unable to get OIDC Provider Key from
JWK " + jwk, e);
- }
- logger.info("Initialized with providerKey: {}", providerKey);
- }
-
- public OpenIdAuthorizer(String providerUrl)
- throws AuthException, URISyntaxException, ParseException, IOException {
- this(getJwkFromProvider(providerUrl));
- }
-
- private static JSONObject getJwkFromProvider(String providerUrl)
- throws URISyntaxException, IOException, ParseException, AuthException {
- if (providerUrl == null) {
- throw new IllegalArgumentException("OpenID Connect Provider URI must be
given!");
- }
-
- // Fetch Metadata
- OIDCProviderMetadata providerMetadata = fetchMetadata(providerUrl);
-
- logger.debug("Using Provider Metadata: {}", providerMetadata);
-
- try {
- URL url = new URI(providerMetadata.getJWKSetURI().toString()).toURL();
- logger.debug("Using url {}", url);
- return getProviderRsaJwk(url.openStream());
- } catch (IOException e) {
- throw new AuthException(TSStatusCode.INIT_AUTH_ERROR, "Unable to start
the Auth", e);
- }
- }
-
- private static JSONObject getProviderRsaJwk(InputStream is) throws
ParseException {
- // Read all data from stream
- StringBuilder sb = new StringBuilder();
- try (Scanner scanner = new Scanner(is)) {
- while (scanner.hasNext()) {
- sb.append(scanner.next());
- }
- }
-
- // Parse the data as json
- String jsonString = sb.toString();
- JSONObject json = JSONObjectUtils.parse(jsonString);
-
- // Find the RSA signing key
- JSONArray keyList = (JSONArray) json.get("keys");
- for (Object key : keyList) {
- JSONObject k = (JSONObject) key;
- if ("sig".equals(k.get("use")) && "RSA".equals(k.get("kty"))) {
- return k;
- }
- }
- return null;
- }
-
- private static OIDCProviderMetadata fetchMetadata(String providerUrl)
- throws URISyntaxException, IOException, ParseException {
- URI issuerUri = new URI(providerUrl);
- URL providerConfigurationUrl =
issuerUri.resolve(".well-known/openid-configuration").toURL();
- InputStream stream = providerConfigurationUrl.openStream();
- // Read all data from URL
- String providerInfo;
- try (java.util.Scanner s = new java.util.Scanner(stream)) {
- providerInfo = s.useDelimiter("\\A").hasNext() ? s.next() : "";
- }
- return OIDCProviderMetadata.parse(providerInfo);
- }
-
- @Override
- public boolean login(String token, String password, final boolean
useEncryptedPassword)
- throws AuthException {
- if (password != null && !password.isEmpty()) {
- logger.error(
- "JWT Login failed as a non-empty Password was given username
(token): {}", token);
- return false;
- }
- if (token == null || token.isEmpty()) {
- logger.error("JWT Login failed as a Username (token) was empty!");
- return false;
- }
- // This line will throw an exception if it is not a signed JWS (as
expected)
- Claims claims;
- try {
- claims = validateToken(token);
- } catch (JwtException e) {
- logger.error("Unable to login the user with Username (token) {}", token,
e);
- return false;
- }
- logger.debug("JWT was validated successfully!");
- logger.debug("ID: {}", claims.getId());
- logger.debug("Subject: {}", claims.getSubject());
- logger.debug("Issuer: {}", claims.getIssuer());
- logger.debug("Expiration: {}", claims.getExpiration());
- // Create User if not exists
- String iotdbUsername = getUsername(claims);
- if (!super.listAllUsers().contains(iotdbUsername)) {
- logger.info("User {} logs in for first time, storing it locally!",
iotdbUsername);
- // We give the user a random password so that no one could hijack them
via local login
- super.createUserWithoutCheck(iotdbUsername,
UUID.randomUUID().toString());
- }
- // Always store claims and user
- this.loggedClaims.put(getUsername(claims), claims);
- return true;
- }
-
- public String getIoTDBUserName(String token) {
- Claims claims = validateToken(token);
- logger.debug("JWT was validated successfully!");
- logger.debug("ID: {}", claims.getId());
- logger.debug("Subject: {}", claims.getSubject());
- logger.debug("Issuer: {}", claims.getIssuer());
- logger.debug("Expiration: {}", claims.getExpiration());
- // Create User if not exists
- return getUsername(claims);
- }
-
- private Claims validateToken(String token) {
- return Jwts.parser()
- // Basically ignore the Expiration Date, if there is any???
- .clockSkewSeconds(Long.MAX_VALUE / 1000)
- .verifyWith(providerKey)
- .build()
- .parseSignedClaims(token)
- .getPayload();
- }
-
- private String getUsername(Claims claims) {
- return OPENID_USER_PREFIX + claims.getSubject();
- }
-
- @Override
- public void createUser(String username, String password) {
- throwUnsupportedOperationException();
- }
-
- private void throwUnsupportedOperationException() {
- throw new UnsupportedOperationException(
- "This operation is not supported for JWT Auth Provider!");
- }
-
- @Override
- public void deleteUser(String username) {
- throwUnsupportedOperationException();
- }
-
- /**
- * So not with the token!
- *
- * @param token Usually the JWT but could also be just the name of the user.
- * @return true if the user is an admin
- */
- public boolean isAdmin(String token) {
- Claims claims;
- if (this.loggedClaims.containsKey(token)) {
- // This is a username!
- claims = this.loggedClaims.get(token);
- } else {
- // It's a token
- try {
- claims = validateToken(token);
- } catch (JwtException e) {
- logger.warn("Unable to validate token {}!", token, e);
- return false;
- }
- }
- // Get available roles (from keycloack)
- List<String> availableRoles =
- ((Map<String, List<String>>) claims.get("realm_access")).get("roles");
- if (!availableRoles.contains(IOTDB_ADMIN_ROLE_NAME)) {
- logger.warn(
- "Given Token has no admin rights, is there a ROLE with name {} in
'realm_access' role set?",
- IOTDB_ADMIN_ROLE_NAME);
- return false;
- }
- return true;
- }
-
- @Override
- public boolean checkUserPrivileges(String userName, PrivilegeUnion union)
throws AuthException {
- return isAdmin(userName);
- }
-
- @Override
- public void updateUserPassword(String userName, String newPassword) {
- throwUnsupportedOperationException();
- }
-
- @Override
- public void renameUser(String username, String newUsername) {
- throwUnsupportedOperationException();
- }
-}
diff --git
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/CommonConfig.java
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/CommonConfig.java
index a490107ded3..ff4a47b6f84 100644
---
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/CommonConfig.java
+++
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/CommonConfig.java
@@ -58,9 +58,6 @@ public class CommonConfig {
private static final Logger logger =
LoggerFactory.getLogger(CommonConfig.class);
public static final long DEFAULT_TIME_PARTITION_INTERVAL = 604_800_000L;
- // Open ID Secret
- private String openIdProviderUrl = "";
-
// The authorizer provider class which extends BasicAuthorizer
private String authorizerProvider =
"org.apache.iotdb.commons.auth.authorizer.LocalFileAuthorizer";
@@ -535,14 +532,6 @@ public class CommonConfig {
return userEncryptTokenHint;
}
- public String getOpenIdProviderUrl() {
- return openIdProviderUrl;
- }
-
- public void setOpenIdProviderUrl(String openIdProviderUrl) {
- this.openIdProviderUrl = openIdProviderUrl;
- }
-
public String getAuthorizerProvider() {
return authorizerProvider;
}
diff --git
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/CommonDescriptor.java
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/CommonDescriptor.java
index 8483d1425cf..d392a60bbbd 100644
---
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/CommonDescriptor.java
+++
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/CommonDescriptor.java
@@ -77,9 +77,6 @@ public class CommonDescriptor {
public void loadCommonProps(TrimProperties properties) throws IOException {
config.setAuthorizerProvider(
properties.getProperty("authorizer_provider_class",
config.getAuthorizerProvider()).trim());
- // if using org.apache.iotdb.db.auth.authorizer.OpenIdAuthorizer,
openID_url is needed.
- config.setOpenIdProviderUrl(
- properties.getProperty("openID_url",
config.getOpenIdProviderUrl()).trim());
config.setEncryptDecryptProvider(
properties
.getProperty(
diff --git a/pom.xml b/pom.xml
index b8738dc4d84..0e21e3134a0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -107,10 +107,8 @@
<jersey.version>2.40</jersey.version>
<!-- This was the last version to support Java 8 -->
<jetty.version>9.4.58.v20250814</jetty.version>
- <jjwt.version>0.12.7</jjwt.version>
<jline.version>3.26.2</jline.version>
<jna.version>5.14.0</jna.version>
- <json-smart.version>2.5.2</json-smart.version>
<jtransforms.version>3.1</jtransforms.version>
<junit.version>4.13.2</junit.version>
<!-- This was the last version to support Java 8 -->
@@ -127,8 +125,6 @@
<!--mockito.version>4.11.0</mockito.version-->
<moquette.version>0.18.0</moquette.version>
<netty.version>4.1.126.Final</netty.version>
- <nimbus-jose-jwt.version>9.37.4</nimbus-jose-jwt.version>
- <oauth2-oidc-sdk.version>10.15</oauth2-oidc-sdk.version>
<!-- This was the last version to support Java 8 -->
<openapi.generator.version>6.6.0</openapi.generator.version>
<osgi.version>7.0.0</osgi.version>
@@ -377,11 +373,6 @@
<artifactId>units</artifactId>
<version>${airlift-units.version}</version>
</dependency>
- <dependency>
- <groupId>io.jsonwebtoken</groupId>
- <artifactId>jjwt-api</artifactId>
- <version>${jjwt.version}</version>
- </dependency>
<dependency>
<groupId>org.eclipse.milo</groupId>
<artifactId>stack-core</artifactId>
@@ -458,21 +449,6 @@
<artifactId>h2-mvstore</artifactId>
<version>${h2.version}</version>
</dependency>
- <dependency>
- <groupId>io.jsonwebtoken</groupId>
- <artifactId>jjwt-impl</artifactId>
- <version>${jjwt.version}</version>
- </dependency>
- <dependency>
- <groupId>io.jsonwebtoken</groupId>
- <artifactId>jjwt-jackson</artifactId>
- <version>${jjwt.version}</version>
- </dependency>
- <dependency>
- <groupId>com.nimbusds</groupId>
- <artifactId>oauth2-oidc-sdk</artifactId>
- <version>${oauth2-oidc-sdk.version}</version>
- </dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
@@ -493,11 +469,6 @@
<artifactId>powermock-api-mockito2</artifactId>
<version>${powermock.version}</version>
</dependency>
- <dependency>
- <groupId>com.nimbusds</groupId>
- <artifactId>nimbus-jose-jwt</artifactId>
- <version>${nimbus-jose-jwt.version}</version>
- </dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
@@ -634,11 +605,6 @@
<artifactId>caffeine</artifactId>
<version>${caffeine.version}</version>
</dependency>
- <dependency>
- <groupId>net.minidev</groupId>
- <artifactId>json-smart</artifactId>
- <version>${json-smart.version}</version>
- </dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
@@ -719,10 +685,7 @@
<artifactId>jersey-hk2</artifactId>
<version>${jersey.version}</version>
</dependency>
- <!-- Conflict:
- json-smart (pulls in 9.3),
- cglib (pulls in 7.1)
- -->
+ <!-- Conflict: cglib pulls in 7.1 -->
<dependency>
<groupId>org.ow2.asm</groupId>
<artifactId>asm</artifactId>