Code review comment: @pedroigor OK, so we just keep recycling for every concurrent request. OK, I'm still a bit unclear about where these concurrent requests can originate from with the same `sub`, I'll ping you later to understand better :-) but obviously there are all sort of variations possible with 'sub' being reused. I'll open an issue to track the even loop issue

Code under review:
public void accept(UniEmitter<? super SecurityIdentity> emitter) {
                            OAuth2TokenImpl token = new OAuth2TokenImpl(configContext.auth, new JsonObject());

                            
                            token.principal().put("refresh_token", entry.getToken());

                            token.refresh(new Handler<AsyncResult<Void>>() {
                                @Override
                                public void handle(AsyncResult<Void> result) {
                                    if (result.succeeded()) {
                                        authenticate(identityProviderManager,
                                                new IdTokenCredential(token.opaqueIdToken(), context))
                                                        .subscribe().with(new Consumer<SecurityIdentity>() {
                                                            @Override
                                                            public void accept(SecurityIdentity identity) {
                                                                
                                                                processSuccessfulAuthentication(context, configContext, token,
                                                                        identity);
                                                                
                                                                entry.setToken(token.opaqueRefreshToken());
                                                                emitter.complete(
                                                                        augmentIdentity(identity, token.opaqueAccessToken(),
                                                                                token.opaqueRefreshToken(),
                                                                                context));
                                                            }
                                                        }, new Consumer<Throwable>() {
                                                            @Override
                                                            public void accept(Throwable throwable) {
                                                                emitter.fail(throwable);
                                                            }
                                                        });
                                    } else {
                                        emitter.fail(new AuthenticationFailedException(result.cause()));
                                    }
                                }
                            });
                        }

Line commented on: context));

Revised code:
public void accept(UniEmitter<? super SecurityIdentity> emitter) {
                OAuth2TokenImpl token = new OAuth2TokenImpl(configContext.auth, new JsonObject());

                
                token.principal().put("refresh_token", refreshToken);

                token.refresh(new Handler<AsyncResult<Void>>() {
                    @Override
                    public void handle(AsyncResult<Void> result) {
                        if (result.succeeded()) {
                            authenticate(identityProviderManager,
                                    new IdTokenCredential(token.opaqueIdToken(), context))
                                            .subscribe().with(new Consumer<SecurityIdentity>() {
                                                @Override
                                                public void accept(SecurityIdentity identity) {
                                                    
                                                    processSuccessfulAuthentication(context, configContext, token,
                                                            identity);
                                                    
                                                    emitter.complete(
                                                            augmentIdentity(identity, token.opaqueAccessToken(),
                                                                    token.opaqueRefreshToken(),
                                                                    context));
                                                }
                                            }, new Consumer<Throwable>() {
                                                @Override
                                                public void accept(Throwable throwable) {
                                                    emitter.fail(throwable);
                                                }
                                            });
                        } else {
                            emitter.fail(new AuthenticationFailedException(result.cause()));
                        }
                    }
                });
            }