配置带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);
页面认证正常,但重定向到回调时失败,我认为代理路由陷入了循环。请问能否解决这个问题?
解决方案
问题核心是路由顺序和回调路径的拦截冲突:
- 全局的
proxyRouter.route("/*").handler(oauth2)会拦截所有请求,包括/callback回调请求,导致回调请求被重复要求认证,引发循环。 - 回调请求不需要被代理到后端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
相关产品推荐
相关产品推荐

