eclipse-vertx / eclipse-vertx/vertx-http-proxy

Silent failure to send backend request after authentication with OAuth2

Open
#101 5 comments 0 reactions 1 assignee Claimed by @tsegismont View on GitHub
bug
Dominant language
Java
Stars
68
Forks
37
PR merge metrics
No merged PRs in 30d

Description

When the Vert.x Web Proxy handler is installed after an OAuth2 handler, the proxy silently fails to send the request to the backend just after authentication.

If the user is already authenticated with the OAuth2 provider, the proxy successfully sends the request.

Here's an example setup:

```java
router.route().handler(SessionHandler.create(LocalSessionStore.create(vertx)));

OAuth2Auth authProvider = GithubAuth.create(vertx, clientId, clientSecret);
router.route("/protected").handler(OAuth2AuthHandler.create(vertx, authProvider, "http://localhost:4180/oauth2/callback")
.setupCallback(router.route("/oauth2/callback"))
.withScope("user:email"));

router.route("/protected").handler(rc -> {
Context context = vertx.getOrCreateContext();
User user = rc.user();
Session session = rc.session();
JsonObject userInfo = session.get("userInfo");
if (userInfo == null) {
authProvider.userInfo(user).onComplete(ar -> {
if (ar.succeeded()) {
session.put("userInfo", ar.result());
context.putLocal("userInfo", ar.result());
context.putLocal("accessToken", user.get("access_token"));
rc.next();
} else {
session.destroy();
rc.fail(ar.cause());
}
});
} else {
context.putLocal("userInfo", userInfo);
context.putLocal("accessToken", user.get("access_token"));
rc.next();
}
});

HttpClient proxyClient = vertx.createHttpClient();
HttpProxy httpProxy = HttpProxy.reverseProxy(proxyClient)
.addInterceptor(new ProxyInterceptor() {
@Override
public Future handleProxyRequest(ProxyContext pc) {
ProxyRequest proxyRequest = pc.request();
MultiMap headers = proxyRequest.headers();
headers.remove("Cookie");
Context context = vertx.getOrCreateContext();
JsonObject userInfo = context.getLocal("userInfo");
if (userInfo != null) {
headers.set("X-Forwarded-User", userInfo.getString("login"));
headers.set("X-Forwarded-Email", userInfo.getString("email"));
headers.set("X-Forwarded-Access-Token", context.getLocal("accessToken"));
}
return pc.sendRequest();
}
});
router.route().handler(ProxyHandler.create(httpProxy, 8080, "localhost"));
```

With debugging, it appears that when the proxy sets up the pipe on the incoming request, no callback is invoked:

https://github.com/eclipse-vertx/vertx-http-proxy/blob/5ec808d0122d955beb1fdf892d341ee540119e83/src/main/java/io/vertx/httpproxy/impl/ProxiedRequest.java#L195-L203

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.