Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

HazelcastSerializationException occured after UserSessionHandler #107

Closed
glassfox opened this issue Jan 2, 2019 · 16 comments
Closed

HazelcastSerializationException occured after UserSessionHandler #107

glassfox opened this issue Jan 2, 2019 · 16 comments
Labels
Milestone

Comments

@glassfox
Copy link

glassfox commented Jan 2, 2019

  • After upgrade version of vertx from 3.5.4 to 3.6.2 in exist project, authentication process in clustered mode failed with below error.
  • Was try to change authentication to Shiro -> Same behavior.
  • I am not sure if this issue referenced to hazelcast. But in case of non cluster mode all working great.
  • Still investigation the issue and do not have in this stage working code example that able to publish here.

Compiled in java 10.0.2
Execution in centos 7 64

Following the Exception:

com.hazelcast.nio.serialization.HazelcastSerializationException: Problem while reading DataSerializable, namespace: 0, ID: 0, class: 'io.vertx.spi.cluster.hazelcast.impl.ConversionUtils$DataSerializableHolder', exception: Failed to load class java.lang.IndexOutOfBoundsException: index: 189, length: 4635 (expected: range(0, 322))
at com.hazelcast.internal.serialization.impl.DataSerializableSerializer.rethrowReadException(DataSerializableSerializer.java:183) ~[pension-api-fat.jar:2.2.1-SNAPSHOT]
at com.hazelcast.internal.serialization.impl.DataSerializableSerializer.readInternal(DataSerializableSerializer.java:164) ~[pension-api-fat.jar:2.2.1-SNAPSHOT]
at com.hazelcast.internal.serialization.impl.DataSerializableSerializer.read(DataSerializableSerializer.java:106) ~[pension-api-fat.jar:2.2.1-SNAPSHOT]
at com.hazelcast.internal.serialization.impl.DataSerializableSerializer.read(DataSerializableSerializer.java:51) ~[pension-api-fat.jar:2.2.1-SNAPSHOT]
at com.hazelcast.internal.serialization.impl.StreamSerializerAdapter.read(StreamSerializerAdapter.java:48) ~[pension-api-fat.jar:2.2.1-SNAPSHOT]
at com.hazelcast.internal.serialization.impl.AbstractSerializationService.toObject(AbstractSerializationService.java:187) ~[pension-api-fat.jar:2.2.1-SNAPSHOT]
at com.hazelcast.map.impl.proxy.MapProxySupport.toObject(MapProxySupport.java:1169) ~[pension-api-fat.jar:2.2.1-SNAPSHOT]
at com.hazelcast.map.impl.proxy.MapProxyImpl.get(MapProxyImpl.java:116) ~[pension-api-fat.jar:2.2.1-SNAPSHOT]
at io.vertx.spi.cluster.hazelcast.impl.HazelcastAsyncMap.lambda$get$0(HazelcastAsyncMap.java:49) ~[pension-api-fat.jar:2.2.1-SNAPSHOT]
at io.vertx.core.impl.ContextImpl.lambda$executeBlocking$2(ContextImpl.java:272) ~[pension-api-fat.jar:2.2.1-SNAPSHOT]
at io.vertx.core.impl.TaskQueue.run(TaskQueue.java:76) ~[pension-api-fat.jar:2.2.1-SNAPSHOT]
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[pension-api-fat.jar:2.2.1-SNAPSHOT]
Caused by: java.lang.IllegalStateException: Failed to load class java.lang.IndexOutOfBoundsException: index: 189, length: 4635 (expected: range(0, 322))
at io.vertx.spi.cluster.hazelcast.impl.ConversionUtils$DataSerializableHolder.readData(ConversionUtils.java:66) ~[pension-api-fat.jar:2.2.1-SNAPSHOT]
at com.hazelcast.internal.serialization.impl.DataSerializableSerializer.readInternal(DataSerializableSerializer.java:160) ~[pension-api-fat.jar:2.2.1-SNAPSHOT]
... 10 more
Caused by: io.vertx.core.VertxException: java.lang.IndexOutOfBoundsException: index: 189, length: 4635 (expected: range(0, 322))
at io.vertx.ext.web.handler.impl.UserHolder.readFromBuffer(UserHolder.java:83) ~[pension-api-fat.jar:2.2.1-SNAPSHOT]
at io.vertx.ext.web.sstore.impl.SharedDataSessionImpl.readDataFromBuffer(SharedDataSessionImpl.java:233) ~[pension-api-fat.jar:2.2.1-SNAPSHOT]
at io.vertx.ext.web.sstore.impl.SharedDataSessionImpl.readFromBuffer(SharedDataSessionImpl.java:94) ~[pension-api-fat.jar:2.2.1-SNAPSHOT]
at io.vertx.spi.cluster.hazelcast.impl.ConversionUtils$DataSerializableHolder.readData(ConversionUtils.java:64) ~[pension-api-fat.jar:2.2.1-SNAPSHOT]
at com.hazelcast.internal.serialization.impl.DataSerializableSerializer.readInternal(DataSerializableSerializer.java:160) ~[pension-api-fat.jar:2.2.1-SNAPSHOT]
... 10 more
Caused by: java.lang.IndexOutOfBoundsException: index: 189, length: 4635 (expected: range(0, 322))
at io.netty.buffer.AbstractByteBuf.checkRangeBounds(AbstractByteBuf.java:1382) ~[pension-api-fat.jar:2.2.1-SNAPSHOT]
at io.netty.buffer.AbstractByteBuf.checkIndex0(AbstractByteBuf.java:1389) ~[pension-api-fat.jar:2.2.1-SNAPSHOT]
at io.netty.buffer.AbstractByteBuf.checkIndex(AbstractByteBuf.java:1377) ~[pension-api-fat.jar:2.2.1-SNAPSHOT]
at io.netty.buffer.AbstractByteBuf.checkDstIndex(AbstractByteBuf.java:1401) ~[pension-api-fat.jar:2.2.1-SNAPSHOT]
at io.netty.buffer.UnpooledHeapByteBuf.getBytes(UnpooledHeapByteBuf.java:190) ~[pension-api-fat.jar:2.2.1-SNAPSHOT]
at io.netty.buffer.WrappedByteBuf.getBytes(WrappedByteBuf.java:343) ~[pension-api-fat.jar:2.2.1-SNAPSHOT]
at io.vertx.core.buffer.impl.BufferImpl.getBytes(BufferImpl.java:167) ~[pension-api-fat.jar:2.2.1-SNAPSHOT]
at io.vertx.core.buffer.impl.BufferImpl.getBuffer(BufferImpl.java:194) ~[pension-api-fat.jar:2.2.1-SNAPSHOT]
at io.vertx.ext.auth.oauth2.impl.OAuth2UserImpl.readFromBuffer(OAuth2UserImpl.java:135) ~[pension-api-fat.jar:2.2.1-SNAPSHOT]
at io.vertx.ext.web.handler.impl.UserHolder.readFromBuffer(UserHolder.java:80) ~[pension-api-fat.jar:2.2.1-SNAPSHOT]
at io.vertx.ext.web.sstore.impl.SharedDataSessionImpl.readDataFromBuffer(SharedDataSessionImpl.java:233) ~[pension-api-fat.jar:2.2.1-SNAPSHOT]
at io.vertx.ext.web.sstore.impl.SharedDataSessionImpl.readFromBuffer(SharedDataSessionImpl.java:94) ~[pension-api-fat.jar:2.2.1-SNAPSHOT]
at io.vertx.spi.cluster.hazelcast.impl.ConversionUtils$DataSerializableHolder.readData(ConversionUtils.java:64) ~[pension-api-fat.jar:2.2.1-SNAPSHOT]
at com.hazelcast.internal.serialization.impl.DataSerializableSerializer.readInternal(DataSerializableSerializer.java:160) ~[pension-api-fat.jar:2.2.1-SNAPSHOT]
... 10 more

@tsegismont
Copy link
Contributor

@pmlopes has something be changed in the way session data is stored between 3.5 and 3.6? I don't believe anything has changed on the vertx-hazelcast side, that's why I'm asking.

@tsegismont
Copy link
Contributor

@glassfox thanks for reporting. A reproducer would be great if/when you can provide it.

@glassfox
Copy link
Author

Hi, the Issue only occurred with OAuth2Auth.
Following the reproducer:

`
import java.util.List;

import org.apache.commons.lang3.StringUtils;

import com.google.common.base.MoreObjects;

import io.vertx.core.AbstractVerticle;
import io.vertx.core.Future;
import io.vertx.core.http.HttpHeaders;
import io.vertx.core.http.HttpMethod;
import io.vertx.core.http.HttpServerOptions;
import io.vertx.core.json.JsonObject;
import io.vertx.core.logging.Logger;
import io.vertx.core.logging.LoggerFactory;
import io.vertx.ext.auth.User;
import io.vertx.ext.auth.oauth2.AccessToken;
import io.vertx.ext.auth.oauth2.KeycloakHelper;
import io.vertx.ext.auth.oauth2.OAuth2Auth;
import io.vertx.ext.auth.oauth2.OAuth2FlowType;
import io.vertx.ext.auth.oauth2.providers.KeycloakAuth;
import io.vertx.ext.web.Router;
import io.vertx.ext.web.RoutingContext;
import io.vertx.ext.web.Session;
import io.vertx.ext.web.handler.CookieHandler;
import io.vertx.ext.web.handler.OAuth2AuthHandler;
import io.vertx.ext.web.handler.SessionHandler;
import io.vertx.ext.web.handler.UserSessionHandler;
import io.vertx.ext.web.sstore.ClusteredSessionStore;
import io.vertx.ext.web.sstore.SessionStore;

public class AOuthTestVerticle extends AbstractVerticle {
private static final Logger logger = LoggerFactory.getLogger(AOuthTestVerticle.class);

private static final String EXPIRED_PREFIX = "Expired";
private static final String INVALID_PREFIX = "Invalid";
private OAuth2Auth oauth2;

private String appExternalUrl;

public static void handle401(RoutingContext context) {
	context.put("user", null);
	if(!context.response().closed()) {
		context.response().setStatusCode(401)
		.end();
	}
}

@Override
public void start(Future<Void> startFuture) throws Exception {
	
	appExternalUrl = config().getString("app.http.address.external");
	
	oauth2 = KeycloakAuth.create(vertx, OAuth2FlowType.AUTH_CODE, config());
	
	SessionStore sessionStore = ClusteredSessionStore.create(vertx);
	var router = Router.router(vertx);
	
	router.route().handler(CookieHandler.create());
	router.route().handler(SessionHandler.create(sessionStore));
	router.route().handler(UserSessionHandler.create(oauth2));
	
	router.get("/login_entry/").handler(this::loginEntry);
	
	router.route("/callback").handler(context -> authCallback(appExternalUrl, context));
	OAuth2AuthHandler authHandler = OAuth2AuthHandler.create(oauth2);
	router.route().handler(authHandler);
	
	router.route().method(HttpMethod.GET).path("/validate").handler(this::validate);
	
	vertx.createHttpServer(new HttpServerOptions()
			.setPort(8083)
			.setHost("localhost"))
	.requestHandler(router).listen();
	
	startFuture.complete();
}

private String generateAuthRedirectUrl(String from, String to) {
	return oauth2.authorizeURL(new JsonObject()
			.put("redirect_uri", from + "/callback?redirect_uri=" + to)
			.put("scope", MoreObjects.firstNonNull(config().getString("scope"), "$pages"))
			.put("state", ""));
}

private void loginEntry(RoutingContext ctx) {
	
	String relativeRedirectUrl = StringUtils.EMPTY;
	List<String> list = ctx.queryParam("redirect_uri");
	if(list.size() > 0) {
		relativeRedirectUrl = list.get(0);
	}
	ctx
	.response()
	.end(new JsonObject().put("redirect_url", generateAuthRedirectUrl(appExternalUrl, appExternalUrl + relativeRedirectUrl)).toString());
}

private void authCallback(String hostUrl, RoutingContext ctx) {
	
	final String code = ctx.request().getParam("code");
	// code is a require value
	if (code == null) {
		
		ctx.fail(400);
		return;
	}
	final String redirectTo = ctx.request().getParam("redirect_uri");
	final String redirectUri = hostUrl + ctx.currentRoute().getPath() + "?redirect_uri=" + redirectTo;
	logger.debug("redirectUri:{}",redirectUri);
	oauth2.authenticate(new JsonObject().put("code", code).put("redirect_uri", redirectUri), res -> {
		if (res.failed()) {
			logger.warn("Auth fail. error:'{}'", res.cause().getMessage());
			handle401(ctx);
		} else {
			AccessToken token = (AccessToken)res.result();
			
			ctx.setUser(token);
			Session session = ctx.session();
			if (session != null) {
				logger.debug("session not null");
				// the user has upgraded from unauthenticated to authenticated
				// session should be upgraded as recommended by owasp
				session.regenerateId();
				// we should redirect the UA so this link becomes invalid
				ctx.response()
					// disable all caching
					.putHeader(HttpHeaders.CACHE_CONTROL, "no-cache, no-store, must-revalidate")
					.putHeader("Pragma", "no-cache")
					.putHeader(HttpHeaders.EXPIRES, "0")
					.putHeader(HttpHeaders.LOCATION, redirectTo)
		              .setStatusCode(302)
		              .end("Redirecting to " + redirectTo + ".");
			} else {
				// there is no session object so we cannot keep state
				ctx.reroute("/");
			}
		}
	});
}

public void validate(RoutingContext ctx) {
	try {
		User user = ctx.user();
		
		if(null == user || null == user.principal()){
			handle401(ctx);
		}
		else{
			JsonObject principal = KeycloakHelper.accessToken(user.principal());
				
			String username = principal.getString("username");
			ctx.response().end(new JsonObject().put("username", username).encode());
		}
	} catch (Throwable t) {
		ctx.fail(t);
	}
}

}
`

@glassfox
Copy link
Author

I think, the issue with write json to buffer.
I changed serialization/deserialization via string -> all working great.
following the 2 changed functions for OAuth2TokenImpl:

`

@Override
public void writeToBuffer(Buffer buff) {
	super.writeToBuffer(buff);
	if (principal != null) {
		byte[] bytes = principal.encode().getBytes(StandardCharsets.UTF_8);
	    buff.appendInt(bytes.length);
	    buff.appendBytes(bytes);
	} else {
		buff.appendInt(0);
	}
}

@Override
public int readFromBuffer(int pos, Buffer buff) {
	super.readFromBuffer(pos, buff);
	int len = buff.getInt(pos);
	pos += 4;
	
	if (len > 0) {
		byte[] bytes = buff.getBytes(pos, pos + len);
		principal = new JsonObject(new String(bytes, StandardCharsets.UTF_8));
		pos += len;
	} else {
		principal.clear();
	}
	// re-attempt to decode tokens
	init(principal);
	return pos;
}

`

@tsegismont
Copy link
Contributor

@glassfox I'm a little confused, where does the last snippet come from? Also, it sounds like it's not related to the Hazelcast cluster manager, is it?

@glassfox
Copy link
Author

Yes, its not part of Hazelcast cluster manager.
Snipet part of OAuth2TokenImpl.java from vertx-auth project .

@glassfox
Copy link
Author

Sorry,
part of OAuth2UserImpl.java. -> base class of OAuth2TokenImpl.java

@tsegismont
Copy link
Contributor

@glassfox I can't debug without a full reproducer (instructions to setup Keycloak and a project to fork on GitHub). Can you investigate further and share the contents of principal? I can't see why it is encoded fine via String but not straight to Buffer.

@glassfox
Copy link
Author

Hi @tsegismont
Here you able to find how to setup Keycloak and simple project.

@glassfox
Copy link
Author

@tsegismont
Following the principal for example:

{"access_token":"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJFbUhGVHBWUFVTQTBwYk1KeDl1YXlfeUtfZVE1ZXpfaXpkTlRpSENVWXh3In0.eyJqdGkiOiIxYTllN2MyOC1mOTRhLTQzYzAtYWY5OC1hMTYyYWQxNzEyMjUiLCJleHAiOjE1NDk5ODgxMDcsIm5iZiI6MCwiaWF0IjoxNTQ5OTg4MDQ3LCJpc3MiOiJodHRwOi8vMTkyLjE2OC4zMC41MC9hdXRoL3JlYWxtcy90YW1hbC1iYWNrb2ZmaWNlLWRldiIsImF1ZCI6Im9mZmljZS1hZG1pbiIsInN1YiI6IjFmODFhYjczLTQ4NjAtNDg4OS05YTIzLTViNWZjM2Y4ZGNjYSIsInR5cCI6IkJlYXJlciIsImF6cCI6InBlbnNpb24tYWRtaW4iLCJhdXRoX3RpbWUiOjE1NDk5ODgwNDcsInNlc3Npb25fc3RhdGUiOiIwZjhmY2FiNi04Yjc0LTQ3OTYtOGQ1NC0yMGM5M2QyNTlkYTIiLCJhY3IiOiIxIiwiYWxsb3dlZC1vcmlnaW5zIjpbImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MyJdLCJyZXNvdXJjZV9hY2Nlc3MiOnsib2ZmaWNlLWFkbWluIjp7InJvbGVzIjpbImFjY291bnQtYmlsbGluZy1sb2dzIiwiY2xpZW50cyIsInN1cHBsaWVycyIsImNvbmZpZ3VyYXRpb24iLCJhY2NvdW50LXRyYW5zYWN0aW9ucy1oaXN0b3J5IiwiYWNjb3VudC1wcm9tb3Rpb25zI3JlYWQiLCJhY2NvdW50cyNyZWFkIiwiYWNjb3VudC1jb25zdW1lcnMjcmVhZCIsInByb2R1Y3RzIiwic2NoZWR1bGVycyIsImNvbnN1bWVycyIsImNhdGVnb3JpZXMiLCJiaWxsaW5nLWxvZ3MiLCJyZXBvcnRzLXB1cmNoYXNlZC1pdGVtcyIsImFjY291bnQtZGV0YWlscyNyZWFkIiwiJHBhZ2VzIiwicmVwb3J0cy1wdXJjaGFzZWQtaXRlbXMtYmlsbGluZyIsInBhY2thZ2VzIiwiYWNjb3VudC1jb25zdW1lcnMiLCJhY2NvdW50LXB1cmNoYXNlcyIsImFjY291bnQtcHJvbW90aW9ucyIsInByb21vdGlvbnMiLCJhY2NvdW50LXB1cmNoYXNlcyNyZWFkIiwiYWNjb3VudHMiLCJhY2NvdW50LWRldGFpbHMiXX0sInBlbnNpb24tYWRtaW4iOnsicm9sZXMiOlsic3VtbWFyeSIsInJlcG9ydHMiLCJtYW51YWwtZml4IiwicmVwb3J0cy1oaXN0b3J5IiwiJHBhZ2VzIiwiY29tcGFueS1wYXJ0cyIsImVtcGxveWVlIiwicmVwb3J0cy1kb3dubG9hZCIsImVtcGxveWVlcyIsInJlcG9ydHMtc3RhdGlzdGljcyIsIiRhZG1pbiIsIiR0YW1hbF9tYW5hZ2VyIl19fSwic2NvcGUiOiIiLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJhZG1pbiIsImdpdmVuX25hbWUiOiIiLCJmYW1pbHlfbmFtZSI6IiIsImVtYWlsIjoib2ZmaWNlLWFkbWluQHRhbWFsLmNvLmlsIn0.moNtdxhNHbGnEkUO5FyUwIgzW6axGdAeZHAnDO5oAL3hhptEil8poMIpvRGo4M-lTH-iRBREpBg81emGpKLI6nwMKPuhCdAIw8dcTRb1T2UzsDqbDkifgIn-cHzeuVfJy5Ykp_pU5q0NnspXD5NdDJtLOdrSIFQ87bW4cAM03dCLp85hI0UDIU3_PldyMGjidMqzOQWDE9sY1gYPDp7jMLUfgKFpAljVbDMeMqtm4TViXJRH4SAPbilC4D9UMekMWIwmoGTxYrjdlOhxNPoP3c1PNtzsKsWMp9-px2OBZ30ne13KNF2p1HLIkXiAcfq0dfYz3JylWW-mCP34q_Ystg","expires_in":60,"refresh_expires_in":1800,"refresh_token":"eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI2YTU5MmFkNS00MzI4LTRiMDctODRhNy00YzhlZTQyMGYzMzkifQ.eyJqdGkiOiIwZmYxNTZiMC0wZGU5LTQwOTQtODQzMy1hZDBiMjVjNDhhYjgiLCJleHAiOjE1NDk5ODk4NDcsIm5iZiI6MCwiaWF0IjoxNTQ5OTg4MDQ3LCJpc3MiOiJodHRwOi8vMTkyLjE2OC4zMC41MC9hdXRoL3JlYWxtcy90YW1hbC1iYWNrb2ZmaWNlLWRldiIsImF1ZCI6Imh0dHA6Ly8xOTIuMTY4LjMwLjUwL2F1dGgvcmVhbG1zL3RhbWFsLWJhY2tvZmZpY2UtZGV2Iiwic3ViIjoiMWY4MWFiNzMtNDg2MC00ODg5LTlhMjMtNWI1ZmMzZjhkY2NhIiwidHlwIjoiUmVmcmVzaCIsImF6cCI6InBlbnNpb24tYWRtaW4iLCJhdXRoX3RpbWUiOjAsInNlc3Npb25fc3RhdGUiOiIwZjhmY2FiNi04Yjc0LTQ3OTYtOGQ1NC0yMGM5M2QyNTlkYTIiLCJyZXNvdXJjZV9hY2Nlc3MiOnsib2ZmaWNlLWFkbWluIjp7InJvbGVzIjpbImFjY291bnQtYmlsbGluZy1sb2dzIiwiY2xpZW50cyIsInN1cHBsaWVycyIsImNvbmZpZ3VyYXRpb24iLCJhY2NvdW50LXRyYW5zYWN0aW9ucy1oaXN0b3J5IiwiYWNjb3VudC1wcm9tb3Rpb25zI3JlYWQiLCJhY2NvdW50cyNyZWFkIiwiYWNjb3VudC1jb25zdW1lcnMjcmVhZCIsInByb2R1Y3RzIiwic2NoZWR1bGVycyIsImNvbnN1bWVycyIsImNhdGVnb3JpZXMiLCJiaWxsaW5nLWxvZ3MiLCJyZXBvcnRzLXB1cmNoYXNlZC1pdGVtcyIsImFjY291bnQtZGV0YWlscyNyZWFkIiwiJHBhZ2VzIiwicmVwb3J0cy1wdXJjaGFzZWQtaXRlbXMtYmlsbGluZyIsInBhY2thZ2VzIiwiYWNjb3VudC1jb25zdW1lcnMiLCJhY2NvdW50LXB1cmNoYXNlcyIsImFjY291bnQtcHJvbW90aW9ucyIsInByb21vdGlvbnMiLCJhY2NvdW50LXB1cmNoYXNlcyNyZWFkIiwiYWNjb3VudHMiLCJhY2NvdW50LWRldGFpbHMiXX0sInBlbnNpb24tYWRtaW4iOnsicm9sZXMiOlsic3VtbWFyeSIsInJlcG9ydHMiLCJtYW51YWwtZml4IiwicmVwb3J0cy1oaXN0b3J5IiwiJHBhZ2VzIiwiY29tcGFueS1wYXJ0cyIsImVtcGxveWVlIiwicmVwb3J0cy1kb3dubG9hZCIsImVtcGxveWVlcyIsInJlcG9ydHMtc3RhdGlzdGljcyIsIiRhZG1pbiIsIiR0YW1hbF9tYW5hZ2VyIl19fSwic2NvcGUiOiIifQ.AuFmV4pSxbJ5gUj7S5WIJ8LtRO_KHUCyP4yCSU1GpnU","token_type":"bearer","not-before-policy":0,"session_state":"0f8fcab6-8b74-4796-8d54-20c93d259da2","scope":"","expires_at":1549988107826}

@tsegismont
Copy link
Contributor

I can't see anything wrong with the content of the principal and don't understand why it is decoded fine via String and not via Buffer on your machine.

Can you please provide a real reproducer with your instructions to setup KC? And how you did the upgrade from 3.5? Thanks

@tsegismont
Copy link
Contributor

@glassfox you said in the first message that you could observe the same problem with Shiro. Perhaps creating a reproducer with Shiro would be easier?

pmlopes added a commit to eclipse-vertx/vertx-auth that referenced this issue Mar 14, 2019
@pmlopes pmlopes added the bug label Mar 14, 2019
@pmlopes pmlopes added this to the 3.7.0 milestone Mar 14, 2019
@pmlopes
Copy link
Member

pmlopes commented Mar 14, 2019

There's a subtle typpo and the "string" version does not do the same typpo, that's why it worked. The issue has been fixed in vertx-auth.

@tsegismont
Copy link
Contributor

tsegismont commented Mar 14, 2019 via email

@pmlopes
Copy link
Member

pmlopes commented Mar 14, 2019

yes it was already back ported 😉

@glassfox
Copy link
Author

Thanks !

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Development

No branches or pull requests

3 participants