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

Vert.x集成Google OAuth2.0遇scope不匹配403错误求助

解决Vert.x Google OAuth2.0集成中的principal scope != handler scopes错误

问题原因

错误java.lang.IllegalStateException: principal scope != handler scopes的核心诱因:

  • 手动实现的/callback路由认证逻辑,与OAuth2AuthHandler.setupCallback()的内置处理逻辑冲突
  • 手动调用authProvider.authenticate()时未指定scope,导致获取的用户权限范围和OAuth2AuthHandler配置的email、profile不匹配
  • 访问/protected的RedirectAuthHandler未配置对应scope,进一步触发权限验证失败

解决方案

修改代码,移除重复的callback处理并统一scope配置:

public class MainVerticle extends AbstractVerticle {

  public static void main(String[] args) {
    Vertx.vertx().deployVerticle(new MainVerticle());
  }

  @Override
  public void start(Promise<Void> startPromise) throws Exception {
    final String CLIENT_ID = "CLIENT_ID";
    final String CLIENT_SECRET = "CLIENT_SECRET";
    
    OAuth2Auth authProvider = GoogleAuth.create(vertx, CLIENT_ID, CLIENT_SECRET);
    Router router = Router.router(vertx);

    // 配置OAuth2认证处理器,指定回调地址和所需scope
    OAuth2AuthHandler authHandler = OAuth2AuthHandler.create(vertx, authProvider, "http://localhost:8080/callback")
        .withScopes(List.of("email", "profile"));

    // 让authHandler自动处理回调路由,无需手动实现
    authHandler.setupCallback(router.route("/callback"));

    // 登录路由绑定认证处理器
    router.route("/login").handler(authHandler);

    // 保护路由:配置RedirectAuthHandler并指定相同的scope,确保权限验证一致
    router.route("/protected").handler(RedirectAuthHandler.create(authProvider, "/login")
        .withScopes(List.of("email", "profile")));

    // 处理受保护路由的响应
    router.route("/protected").handler(ctx -> {
      User user = ctx.user();
      if (user != null) {
        JsonObject profile = user.principal();
        String name = profile.getString("name");
        String email = profile.getString("email");
        ctx.response().end("Bienvenido, " + name + " con email " + email);
      } else {
        ctx.fail(401);
      }
    });

    // 首页路由
    router.get("/").handler(ctc -> ctc.response()
        .putHeader("content-type", "text/html")
        .end("Hello<br><a href=\"/login\">Protected by Google</a>"));

    // 启动HTTP服务器
    vertx.createHttpServer()
        .requestHandler(router)
        .listen(8080, http -> {
          if (http.succeeded()) {
            startPromise.complete();
            System.out.println("HTTP server started on port 8080");
          } else {
            startPromise.fail(http.cause());
          }
        });
  }
}

修改要点

  • 删除手动编写的/callback路由处理逻辑,setupCallback()会自动完成code兑换token、用户信息获取及上下文设置
  • 给RedirectAuthHandler添加与OAuth2AuthHandler一致的scope配置,确保权限验证规则统一
  • 简化/protected路由的处理逻辑,直接从上下文获取已认证的用户信息即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 09:07:05