You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

配置带OAuth2登录的Vertx反向代理服务器:路由问题排查

问题:Vertx反向代理OAuth2回调路由循环问题

我为一个老旧Web应用搭建了Vertx反向代理以实现认证功能,后端应用运行在8200端口,代理运行在8201端口。已在Azure Active Directory注册应用并设置回调路由,但怀疑路由配置有误。我希望通过代理的所有请求都受OAuth2保护,相关代码如下:

v = Vertx.vertx();

HttpClient proxyClient = v.createHttpClient();
HttpProxy httpProxy = HttpProxy.reverseProxy(proxyClient);
Router proxyRouter = Router.router(v);

HttpServer proxyServer = v.createHttpServer();

OAuth2Auth authProvider = AzureADAuth.create(v, "CLIENT_ID", "CLIENT_SECRET", "TENANT_ID");

OAuth2AuthHandler oauth2 = OAuth2AuthHandler.create(v, authProvider, "http://localhost:8201/callback");

oauth2.setupCallback(proxyRouter.route("/callback"));
proxyRouter.route("/*").handler(oauth2);
proxyRouter.route(HttpMethod.GET, "/*").handler(ProxyHandler.create(httpProxy, 8200, "localhost"));

proxyServer.requestHandler(proxyRouter).listen(8201);

页面认证正常,但重定向到回调时失败,我认为代理路由陷入了循环。请问能否解决这个问题?


解决方案

问题核心是路由顺序和回调路径的拦截冲突:

  1. 全局的proxyRouter.route("/*").handler(oauth2)会拦截所有请求,包括/callback回调请求,导致回调请求被重复要求认证,引发循环。
  2. 回调请求不需要被代理到后端8200端口,当前配置会让回调请求被转发,进一步加剧问题。

修改后的代码如下:

v = Vertx.vertx();

HttpClient proxyClient = v.createHttpClient();
HttpProxy httpProxy = HttpProxy.reverseProxy(proxyClient);
Router proxyRouter = Router.router(v);

HttpServer proxyServer = v.createHttpServer();

OAuth2Auth authProvider = AzureADAuth.create(v, "CLIENT_ID", "CLIENT_SECRET", "TENANT_ID");

OAuth2AuthHandler oauth2 = OAuth2AuthHandler.create(v, authProvider, "http://localhost:8201/callback");

// 优先注册回调路由,确保回调请求被专属逻辑处理
oauth2.setupCallback(proxyRouter.route("/callback"));

// 为除/callback外的所有路径添加认证拦截
proxyRouter.route("/*").pathRegex("^(?!/callback).*$").handler(oauth2);

// 代理逻辑仅作用于除/callback外的GET请求
proxyRouter.route(HttpMethod.GET, "/*").pathRegex("^(?!/callback).*$").handler(ProxyHandler.create(httpProxy, 8200, "localhost"));

proxyServer.requestHandler(proxyRouter).listen(8201);

关键调整点:

  • 路由顺序优先:先注册回调路由,让/callback请求被优先匹配,避免被全局认证拦截器捕获
  • 路径排除规则:用pathRegex("^(?!/callback).*$")排除回调路径,让认证和代理逻辑都不作用于回调请求
  • 回调请求隔离:确保回调请求仅由OAuth2的回调处理器处理,不会被转发到后端,也不会触发二次认证

修改后,Azure AD重定向的回调请求会直接完成认证流程,不会陷入循环,其他所有请求则会先经过OAuth2认证,再被代理到后端8200端口。


内容的提问来源于stack exchange,提问作者skword

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 23:41:04