@Override public Future<DeviceUser> authenticateDevice(final T context) { final Future<DeviceUser> result = Future.future(); parseCredentials(context) .compose(authInfo -> { final Future<User> authResult = Future.future(); getAuthProvider(context).authenticate(authInfo, authResult); return authResult; }).setHandler(authAttempt -> { if (authAttempt.succeeded()) { if (authAttempt.result() instanceof DeviceUser) { result.complete((DeviceUser) authAttempt.result()); } else { log.warn("configured AuthProvider does not return DeviceUser instances [type returned: {}", authAttempt.result().getClass().getName()); result.fail(new ClientErrorException(HttpURLConnection.HTTP_UNAUTHORIZED)); } } else { result.fail(authAttempt.cause()); } }); return result; }