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

jfeinauer pushed a commit to branch feature/IOTDB-700-add-openid
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git


The following commit(s) were added to refs/heads/feature/IOTDB-700-add-openid 
by this push:
     new 93290f6  IOTBD-700 Implemented OpenID Connect integration in IoTDB.
93290f6 is described below

commit 93290f6dea2aecf2526dd8977c519e8ab4a46365
Author: julian <[email protected]>
AuthorDate: Sun May 24 15:06:46 2020 +0200

    IOTBD-700 Implemented OpenID Connect integration in IoTDB.
    
    Further Changes:
    - UserNames can now contain colon (":") and "-"
    - New Argument in IoTDB Config
---
 server/pom.xml                                     |   5 +
 .../org/apache/iotdb/db/qp/strategy/SqlBase.g4     |   2 +
 .../iotdb/db/auth/authorizer/BasicAuthorizer.java  |   4 +-
 .../db/auth/authorizer/LocalFileAuthorizer.java    |  13 +-
 .../iotdb/db/auth/authorizer/OpenIdAuthorizer.java | 268 +++++++++++----------
 .../java/org/apache/iotdb/db/conf/IoTDBConfig.java |  10 +-
 .../org/apache/iotdb/db/service/TSServiceImpl.java |   2 +-
 .../db/auth/authorizer/OpenIdAuthorizerTest.java   |  48 ++--
 8 files changed, 191 insertions(+), 161 deletions(-)

diff --git a/server/pom.xml b/server/pom.xml
index 924799d..351f6a6 100644
--- a/server/pom.xml
+++ b/server/pom.xml
@@ -165,6 +165,11 @@
             <version>0.10.7</version>
             <scope>runtime</scope>
         </dependency>
+        <dependency>
+            <groupId>com.nimbusds</groupId>
+            <artifactId>oauth2-oidc-sdk</artifactId>
+            <version>8.3</version>
+        </dependency>
     </dependencies>
     <build>
         <plugins>
diff --git a/server/src/main/antlr4/org/apache/iotdb/db/qp/strategy/SqlBase.g4 
b/server/src/main/antlr4/org/apache/iotdb/db/qp/strategy/SqlBase.g4
index 4c56b68..1a8723f 100644
--- a/server/src/main/antlr4/org/apache/iotdb/db/qp/strategy/SqlBase.g4
+++ b/server/src/main/antlr4/org/apache/iotdb/db/qp/strategy/SqlBase.g4
@@ -925,6 +925,8 @@ NAME_CHAR
     |   'a'..'z'
     |   '0'..'9'
     |   '_'
+    |   '-'
+    |   ':'
     |   CN_CHAR
     ;
 
diff --git 
a/server/src/main/java/org/apache/iotdb/db/auth/authorizer/BasicAuthorizer.java 
b/server/src/main/java/org/apache/iotdb/db/auth/authorizer/BasicAuthorizer.java
index 6bbeb1c..1040e37 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/auth/authorizer/BasicAuthorizer.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/auth/authorizer/BasicAuthorizer.java
@@ -48,8 +48,8 @@ public abstract class BasicAuthorizer implements IAuthorizer, 
IService {
     }
   }
 
-  private IUserManager userManager;
-  private IRoleManager roleManager;
+  IUserManager userManager;
+  IRoleManager roleManager;
 
   BasicAuthorizer(IUserManager userManager, IRoleManager roleManager) throws 
AuthException {
     this.userManager = userManager;
diff --git 
a/server/src/main/java/org/apache/iotdb/db/auth/authorizer/LocalFileAuthorizer.java
 
b/server/src/main/java/org/apache/iotdb/db/auth/authorizer/LocalFileAuthorizer.java
index 2a76648..ffa5503 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/auth/authorizer/LocalFileAuthorizer.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/auth/authorizer/LocalFileAuthorizer.java
@@ -19,6 +19,10 @@
 package org.apache.iotdb.db.auth.authorizer;
 
 import java.io.File;
+import java.io.IOException;
+import java.net.URISyntaxException;
+
+import com.nimbusds.oauth2.sdk.ParseException;
 import org.apache.iotdb.db.auth.AuthException;
 import org.apache.iotdb.db.auth.role.LocalFileRoleManager;
 import org.apache.iotdb.db.auth.user.LocalFileUserManager;
@@ -46,7 +50,7 @@ public class LocalFileAuthorizer extends BasicAuthorizer {
   /**
    * function for getting the instance of the local file authorizer.
    */
-  public static LocalFileAuthorizer getInstance() throws AuthException {
+  public static IAuthorizer getInstance() throws AuthException {
     if (InstanceHolder.instance == null) {
       throw new AuthException("Authorizer uninitialized");
     }
@@ -54,12 +58,13 @@ public class LocalFileAuthorizer extends BasicAuthorizer {
   }
 
   private static class InstanceHolder {
-    private static LocalFileAuthorizer instance;
+    private static OpenIdAuthorizer instance;
 
     static {
       try {
-        instance = new LocalFileAuthorizer();
-      } catch (AuthException e) {
+        
IoTDBDescriptor.getInstance().getConfig().setOpenIdProviderUrl("https://auth.demo.pragmaticindustries.de/auth/realms/IoTDB/";);
+        instance = new OpenIdAuthorizer();
+      } catch (AuthException | ParseException | IOException | 
URISyntaxException e) {
         logger.error("Authorizer initialization failed due to ", e);
         instance = null;
       }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/auth/authorizer/OpenIdAuthorizer.java
 
b/server/src/main/java/org/apache/iotdb/db/auth/authorizer/OpenIdAuthorizer.java
index 5330000..f8c051a 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/auth/authorizer/OpenIdAuthorizer.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/auth/authorizer/OpenIdAuthorizer.java
@@ -4,13 +4,20 @@
 
 package org.apache.iotdb.db.auth.authorizer;
 
+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.apache.iotdb.db.auth.AuthException;
-import org.apache.iotdb.db.auth.role.IRoleManager;
+import org.apache.iotdb.db.auth.entity.Role;
+import org.apache.iotdb.db.auth.entity.User;
 import org.apache.iotdb.db.auth.role.LocalFileRoleManager;
-import org.apache.iotdb.db.auth.user.IUserManager;
 import org.apache.iotdb.db.auth.user.LocalFileUserManager;
 import org.apache.iotdb.db.conf.IoTDBConfig;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
@@ -18,6 +25,13 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.io.File;
+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.*;
 
 /**
  * Uses an OpenID Connect provider for Authorization / Authentication.
@@ -25,47 +39,87 @@ import java.io.File;
 public class OpenIdAuthorizer extends BasicAuthorizer {
 
     private static final Logger logger = 
LoggerFactory.getLogger(OpenIdAuthorizer.class);
+    public static final String IOTDB_ADMIN_ROLE_NAME = "iotdb_admin";
 
     private static IoTDBConfig config = 
IoTDBDescriptor.getInstance().getConfig();
 
-    private final String secret;
+    private RSAPublicKey providerKey;
 
-    public OpenIdAuthorizer() throws AuthException {
-        this(config.getOpenIdSecret());
+    /** Stores all claims to the respective user */
+    private Map<String, Claims> loggedClaims = new HashMap<>();
+
+    public OpenIdAuthorizer() throws AuthException, ParseException, 
IOException, URISyntaxException {
+        this(config.getOpenIdProviderUrl());
     }
 
-    OpenIdAuthorizer(String secret) throws AuthException {
+    OpenIdAuthorizer(JSONObject jwk) throws AuthException, URISyntaxException, 
ParseException, IOException {
         super(new LocalFileUserManager(config.getSystemDir() + File.separator 
+ "users"),
                 new LocalFileRoleManager(config.getSystemDir() + 
File.separator + "roles"));
-        if (secret == null) {
-            throw new IllegalArgumentException("OpenID Secret is null which is 
not allowed!");
+        try {
+            providerKey = RSAKey.parse(jwk).toRSAPublicKey();
+        } catch (java.text.ParseException | JOSEException e) {
+            throw new AuthException("Unable to get OIDC Provider Key from JWK 
" +  jwk.toString(), e);
         }
-        this.secret = secret;
+        logger.info("Initialized with providerKey: {}", providerKey);
     }
 
-    /**
-     * function for getting the instance of the local file authorizer.
-     */
-    public static OpenIdAuthorizer getInstance() throws AuthException {
-        if (OpenIdAuthorizer.InstanceHolder.instance == null) {
-            throw new AuthException("Authorizer uninitialized");
+    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!");
+        }
+
+        //
+        OIDCProviderMetadata providerMetadata = fetchMetadata(providerUrl);
+
+        System.out.println(providerMetadata);
+
+        try {
+            URL url = new 
URI(providerMetadata.getJWKSetURI().toString().replace("http", 
"https")).toURL();
+            System.out.println("Using url " + url);
+            return getProviderRSAJWK(url.openStream());
+        } catch (IOException e) {
+            throw new AuthException("Unable to start the Auth", e);
         }
-        return OpenIdAuthorizer.InstanceHolder.instance;
     }
 
-    private static class InstanceHolder {
-        private static OpenIdAuthorizer instance;
+    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());
+            }
+        }
 
-        static {
-            // Only for testing here!
-            
IoTDBDescriptor.getInstance().getConfig().setOpenIdSecret("111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111");
-            try {
-                instance = new OpenIdAuthorizer();
-            } catch (AuthException e) {
-                logger.error("Authorizer initialization failed due to ", e);
-                instance = null;
+        // 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 (k.get("use").equals("sig") && k.get("kty").equals("RSA")) {
+                return k;
             }
         }
+        return null;
+    }
+
+    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 = null;
+        try (java.util.Scanner s = new java.util.Scanner(stream)) {
+            providerInfo = s.useDelimiter("\\A").hasNext() ? s.next() : "";
+        }
+        return OIDCProviderMetadata.parse(providerInfo);
     }
 
     @Override
@@ -92,10 +146,14 @@ public class OpenIdAuthorizer extends BasicAuthorizer {
         logger.debug("Issuer: {}", claims.getIssuer());
         logger.debug("Expiration: {}", claims.getExpiration());
         // Create User if not exists
-        if (!super.listAllUsers().contains(claims.getId())) {
-            logger.info("User {} logs in for first time, storing it locally!", 
claims.getId());
-            super.createUser(claims.getSubject(), "UNUSED_PASSWORT");
+        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.createUser(iotdbUsername, UUID.randomUUID().toString());
         }
+        // Always store claims and user
+        this.loggedClaims.put(getUsername(claims), claims);
         return true;
     }
 
@@ -105,11 +163,19 @@ public class OpenIdAuthorizer extends BasicAuthorizer {
                 // Basically ignore the Expiration Date, if there is any???
                 .setAllowedClockSkewSeconds(Long.MAX_VALUE / 1000)
                 // .setSigningKey(DatatypeConverter.parseBase64Binary(secret))
-                .setSigningKey(secret.getBytes())
+                .setSigningKey(providerKey)
                 .parseClaimsJws(token)
                 .getBody();
     }
 
+    private String getUsername(Claims claims) {
+        return "openid:" + claims.getSubject();
+    }
+
+    private String getUsername(String token) {
+        return getUsername(validateToken(token));
+    }
+
     @Override
     public void createUser(String username, String password) throws 
AuthException {
         throw new UnsupportedOperationException("This operation is not 
supported for JWT Auth Provider!");
@@ -120,115 +186,63 @@ public class OpenIdAuthorizer extends BasicAuthorizer {
         throw new UnsupportedOperationException("This operation is not 
supported for JWT Auth Provider!");
     }
 
+    /**
+     * So not with the token!
+     * @param token Usually the JWT but could also be just the name of the 
user ({@link #getUsername(String)}.
+     * @return true if the user is an admin
+     */
     @Override
     boolean isAdmin(String token) {
         Claims claims;
-        try {
-            claims = validateToken(token);
-        } catch (JwtException e) {
-            logger.warn("Unable to validate token {}!", token, e);
-            return false;
+        if (this.loggedClaims.containsKey(token)) {
+            // This is a username!
+            claims = this.loggedClaims.get(token);
+        } else {
+            // Its a token
+            try {
+                claims = validateToken(token);
+            } catch (JwtException e) {
+                logger.warn("Unable to validate token {}!", token, e);
+                return false;
+            }
         }
-        if (!(claims.get("IOTDB_ADMIN") instanceof Boolean) || 
!claims.get("IOTDB_ADMIN", Boolean.class)) {
-            logger.warn("Given Token has no admin rights, is custom claim 
IOTDB_ADMIN set to true?");
+        // 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 void grantPrivilegeToUser(String username, String path, int 
privilegeId) throws AuthException {
-//        if (isAdmin(username)) {
-//            throw new AuthException("Given Token has no Admin privileges!");
-//        }
-//        // Yes, you are Admin! Gratz!
-//        // Do something here...
-//        super.grantPrivilegeToUser(username, path, privilegeId);
-//    }
-//    @Override
-//    public void revokePrivilegeFromUser(String username, String path, int 
privilegeId) throws AuthException {
-//        throw new NotImplementedException("Not yet implemented!");
-//    }
-//
-//    @Override
-//    public void createRole(String roleName) throws AuthException {
-//        throw new NotImplementedException("Not yet implemented!");
-//    }
-//
-//    @Override
-//    public void deleteRole(String roleName) throws AuthException {
-//        throw new NotImplementedException("Not yet implemented!");
-//    }
-//
-//    @Override
-//    public void grantPrivilegeToRole(String roleName, String path, int 
privilegeId) throws AuthException {
-//        throw new NotImplementedException("Not yet implemented!");
-//    }
-//
-//    @Override
-//    public void revokePrivilegeFromRole(String roleName, String path, int 
privilegeId) throws AuthException {
-//        throw new NotImplementedException("Not yet implemented!");
-//    }
-//
-//    @Override
-//    public void grantRoleToUser(String roleName, String username) throws 
AuthException {
-//        throw new NotImplementedException("Not yet implemented!");
-//    }
-//
-//    @Override
-//    public void revokeRoleFromUser(String roleName, String username) throws 
AuthException {
-//        throw new NotImplementedException("Not yet implemented!");
-//    }
-//
-//    @Override
-//    public Set<Integer> getPrivileges(String username, String path) throws 
AuthException {
-//        throw new NotImplementedException("Not yet implemented!");
-//    }
+    @Override
+    public boolean checkUserPrivileges(String username, String path, int 
privilegeId)
+            throws AuthException {
+        if (isAdmin(username)) {
+            return true;
+        }
+
+        User user = userManager.getUser(getUsername(username));
+        if (user == null) {
+            throw new AuthException(String.format("No such user : %s", 
getUsername(username)));
+        }
+        // get privileges of the user
+        if (user.checkPrivilege(path, privilegeId)) {
+            return true;
+        }
+        // merge the privileges of the roles of the user
+        for (String roleName : user.getRoleList()) {
+            Role role = roleManager.getRole(roleName);
+            if (role.checkPrivilege(path, privilegeId)) {
+                return true;
+            }
+        }
+        return false;
+    }
 
     @Override
     public void updateUserPassword(String username, String newPassword) throws 
AuthException {
         throw new UnsupportedOperationException("This operation is not 
supported for JWT Auth Provider!");
     }
-//
-//    @Override
-//    public boolean checkUserPrivileges(String username, String path, int 
privilegeId) throws AuthException {
-//        throw new NotImplementedException("Not yet implemented!");
-//    }
-//
-//    @Override
-//    public void reset() throws AuthException {
-//        // Do nothing
-//        super.reset();
-//    }
-//
-//    @Override
-//    public List<String> listAllUsers() {
-//        // Unsure if we list all "known" users or just throw this exception??
-//        throw new UnsupportedOperationException("This operation is not 
supported for JWT Auth Provider!");
-//    }
-//
-//    @Override
-//    public List<String> listAllRoles() {
-//        throw new NotImplementedException("Not yet implemented!");
-//    }
-//
-//    @Override
-//    public Role getRole(String roleName) throws AuthException {
-//        throw new NotImplementedException("Not yet implemented!");
-//    }
-//
-//    @Override
-//    public User getUser(String username) throws AuthException {
-//        throw new NotImplementedException("Not yet implemented!");
-//    }
-//
-//    @Override
-//    public boolean isUserUseWaterMark(String userName) throws AuthException {
-//        throw new NotImplementedException("Not yet implemented!");
-//    }
-//
-//    @Override
-//    public void setUserUseWaterMark(String userName, boolean useWaterMark) 
throws AuthException {
-//        throw new NotImplementedException("Not yet implemented!");
-//    }
+
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java 
b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
index ad3fabc..9073305 100644
--- a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
+++ b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
@@ -549,7 +549,7 @@ public class IoTDBConfig {
   private int tagAttributeTotalSize = 700;
 
   // Open ID Secret
-  private String openIdSecret = null;
+  private String openIdProviderUrl = null;
 
   public IoTDBConfig() {
     // empty constructor
@@ -1510,11 +1510,11 @@ public class IoTDBConfig {
     this.primitiveArraySize = primitiveArraySize;
   }
 
-  public String getOpenIdSecret() {
-    return openIdSecret;
+  public String getOpenIdProviderUrl() {
+    return openIdProviderUrl;
   }
 
-  public void setOpenIdSecret(String openIdSecret) {
-    this.openIdSecret = openIdSecret;
+  public void setOpenIdProviderUrl(String openIdProviderUrl) {
+    this.openIdProviderUrl = openIdProviderUrl;
   }
 }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java 
b/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
index 052e27c..0426bdb 100644
--- a/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
@@ -181,7 +181,7 @@ public class TSServiceImpl implements TSIService.Iface, 
ServerContext {
     boolean status;
     IAuthorizer authorizer;
     try {
-      authorizer = OpenIdAuthorizer.getInstance();
+      authorizer = LocalFileAuthorizer.getInstance();
     } catch (AuthException e) {
       throw new TException(e);
     }
diff --git 
a/server/src/test/java/org/apache/iotdb/db/auth/authorizer/OpenIdAuthorizerTest.java
 
b/server/src/test/java/org/apache/iotdb/db/auth/authorizer/OpenIdAuthorizerTest.java
index 6470656..bd51137 100644
--- 
a/server/src/test/java/org/apache/iotdb/db/auth/authorizer/OpenIdAuthorizerTest.java
+++ 
b/server/src/test/java/org/apache/iotdb/db/auth/authorizer/OpenIdAuthorizerTest.java
@@ -4,57 +4,61 @@
 
 package org.apache.iotdb.db.auth.authorizer;
 
+import com.nimbusds.oauth2.sdk.ParseException;
+import com.nimbusds.oauth2.sdk.util.JSONObjectUtils;
 import org.apache.iotdb.db.auth.AuthException;
+import org.junit.Ignore;
 import org.junit.Test;
 
-import static org.junit.Assert.*;
+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\\/OP8Yx6tJe0i9GR2Q9jR9S3jQo
 [...]
+
     @Test
-    public void loginWithJWT() throws AuthException {
-        String jwt = 
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwiZXhwIjoiMTIzIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.PB603vtDyNkryxeLjomX1JQuSF2JHKXHyixzPBCA7tQ";
-        String secret = 
"111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111";
+    public void loginWithJWT() throws AuthException, ParseException, 
IOException, URISyntaxException {
+        String jwt = 
"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJxMS1XbTBvelE1TzBtUUg4LVNKYXAyWmNONE1tdWNXd25RV0tZeFpKNG93In0.eyJleHAiOjE1OTAzMTcxNzYsImlhdCI6MTU5MDMxNjg3NiwianRpIjoiY2MyNWQ3MDAtYjc5NC00OTA4LTg0OGUtOTRhNzYzNmM5YzQxIiwiaXNzIjoiaHR0cDovL2F1dGguZGVtby5wcmFnbWF0aWNpbmR1c3RyaWVzLmRlL2F1dGgvcmVhbG1zL0lvVERCIiwiYXVkIjoiYWNjb3VudCIsInN1YiI6Ijg2YWRmNGIzLWE4ZTUtNDc1NC1iNWEwLTQ4OGI0OWY0M2VkMiIsInR5cCI6IkJlYXJlciIsImF6cCI6ImlvdGRiIiwic2Vzc2lvbl9zdGF0ZSI6Ijk0ZmI5NGZjLTg3YTMtND
 [...]
 
-        OpenIdAuthorizer authorizer = new OpenIdAuthorizer(secret);
+        OpenIdAuthorizer authorizer = new 
OpenIdAuthorizer(JSONObjectUtils.parse(OPEN_ID_PUBLIC_JWK));
         boolean login = authorizer.login(jwt, null);
 
         assertTrue(login);
     }
 
     @Test
-    public void isAdmin_hasAccess() throws AuthException {
+    public void isAdmin_hasAccess() throws AuthException, ParseException, 
IOException, URISyntaxException {
         // IOTDB_ADMIN = true
-        String jwt = 
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwiZXhwIjoiMTIzIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyLCJJT1REQl9BRE1JTiI6dHJ1ZX0.dxB417n9GFAGbwL7kyIvgenEBycjlJLZbB1I_GF0qd8";
-        String secret = 
"111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111";
+        String jwt = 
"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJxMS1XbTBvelE1TzBtUUg4LVNKYXAyWmNONE1tdWNXd25RV0tZeFpKNG93In0.eyJleHAiOjE1OTAzMjM5MjgsImlhdCI6MTU5MDMyMzYyOCwianRpIjoiZGQ5ZDZhNmItZjgzOC00Mjk3LTg5YWUtMjdlZTgxNzVhMThiIiwiaXNzIjoiaHR0cDovL2F1dGguZGVtby5wcmFnbWF0aWNpbmR1c3RyaWVzLmRlL2F1dGgvcmVhbG1zL0lvVERCIiwiYXVkIjoiYWNjb3VudCIsInN1YiI6ImJhMzJlNDcxLWM3NzItNGIzMy04ZGE2LTZmZThhY2RhMDA3MyIsInR5cCI6IkJlYXJlciIsImF6cCI6ImlvdGRiIiwic2Vzc2lvbl9zdGF0ZSI6IjViZDRhNmM5LTBmYzItNG
 [...]
 
-        OpenIdAuthorizer authorizer = new OpenIdAuthorizer(secret);
+        OpenIdAuthorizer authorizer = new 
OpenIdAuthorizer(JSONObjectUtils.parse(OPEN_ID_PUBLIC_JWK));
         boolean admin = authorizer.isAdmin(jwt);
 
         assertTrue(admin);
     }
 
     @Test
-    public void isAdmin_AdminClaimFalse() throws AuthException {
+    public void isAdmin_noAdminClaim() throws AuthException, ParseException, 
IOException, URISyntaxException {
         // IOTDB_ADMIN = false
-        String jwt = 
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwiZXhwIjoiMTIzIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyLCJJT1REQl9BRE1JTiI6ZmFsc2V9.80lCGEWhgW6YO55TFC98v_mj8ts0IcrBMb2drsxEpZ0";
-        String secret = 
"111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111";
+        String jwt = 
"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJxMS1XbTBvelE1TzBtUUg4LVNKYXAyWmNONE1tdWNXd25RV0tZeFpKNG93In0.eyJleHAiOjE1OTAzMTcxNzYsImlhdCI6MTU5MDMxNjg3NiwianRpIjoiY2MyNWQ3MDAtYjc5NC00OTA4LTg0OGUtOTRhNzYzNmM5YzQxIiwiaXNzIjoiaHR0cDovL2F1dGguZGVtby5wcmFnbWF0aWNpbmR1c3RyaWVzLmRlL2F1dGgvcmVhbG1zL0lvVERCIiwiYXVkIjoiYWNjb3VudCIsInN1YiI6Ijg2YWRmNGIzLWE4ZTUtNDc1NC1iNWEwLTQ4OGI0OWY0M2VkMiIsInR5cCI6IkJlYXJlciIsImF6cCI6ImlvdGRiIiwic2Vzc2lvbl9zdGF0ZSI6Ijk0ZmI5NGZjLTg3YTMtND
 [...]
 
-        OpenIdAuthorizer authorizer = new OpenIdAuthorizer(secret);
+        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
-    public void isAdmin_noAdminClaim() throws AuthException {
-        // IOTDB_ADMIN = false
-        String jwt = 
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwiZXhwIjoiMTIzIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.PB603vtDyNkryxeLjomX1JQuSF2JHKXHyixzPBCA7tQ";
-        String secret = 
"111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111";
-
-        OpenIdAuthorizer authorizer = new OpenIdAuthorizer(secret);
-        boolean admin = authorizer.isAdmin(jwt);
-
-        assertFalse(admin);
+    @Ignore
+    public void fetchMetadata() throws ParseException, IOException, 
URISyntaxException, AuthException {
+        OpenIdAuthorizer openIdAuthorizer = new 
OpenIdAuthorizer("https://auth.demo.pragmaticindustries.de/auth/realms/IoTDB/";);
+        
openIdAuthorizer.login("eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJxMS1XbTBvelE1TzBtUUg4LVNKYXAyWmNONE1tdWNXd25RV0tZeFpKNG93In0.eyJleHAiOjE1OTAzMTcxNzYsImlhdCI6MTU5MDMxNjg3NiwianRpIjoiY2MyNWQ3MDAtYjc5NC00OTA4LTg0OGUtOTRhNzYzNmM5YzQxIiwiaXNzIjoiaHR0cDovL2F1dGguZGVtby5wcmFnbWF0aWNpbmR1c3RyaWVzLmRlL2F1dGgvcmVhbG1zL0lvVERCIiwiYXVkIjoiYWNjb3VudCIsInN1YiI6Ijg2YWRmNGIzLWE4ZTUtNDc1NC1iNWEwLTQ4OGI0OWY0M2VkMiIsInR5cCI6IkJlYXJlciIsImF6cCI6ImlvdGRiIiwic2Vzc2lvbl9zdGF0ZSI6Ijk0ZmI5NGZj
 [...]
     }
 }
\ No newline at end of file

Reply via email to