Vert.x JWT身份验证提供禁止访问

时间:2019-11-25 14:09:14

标签: java vert.x java-11

场景

我正在我的http服务器verticle的start()中调用此方法:

private void setupAuth(Router router) {
    // Secure access key
    var config = new JWTAuthOptions()
      .setKeyStore(new KeyStoreOptions()
        .setType("jceks")
        .setPath("C:\\Users\\3587741\\Desktop\\Projects\\P_Gatlin\\jwt\\keystore.jceks")
        .setPassword("secret")
      );

    // Setup the secure route
    authProvider = JWTAuth.create(vertx, config);
    router.route().handler(BodyHandler.create());
    router.route().handler(SessionHandler.create(LocalSessionStore.create(vertx)).setAuthProvider(authProvider));

    // Redirect to a login page if the user is NOT logged
    var redirectAuthHandler = RedirectAuthHandler.create(authProvider, RouteNames.LOGIN_ADMIN, "/");

    // Secure every page that starts with "/admin/..."
    router.route("/admin/*").handler(redirectAuthHandler);
    router.post(RouteNames.LOGIN_CHECKER).handler(FormLoginHandler.create(authProvider));
  }

为了安全起见,我需要使用/admin/*路径。以上实现几乎是从官方documentation粘贴而来的。我已使用此行生成密钥:

keytool -genkeypair -keystore keystore.jceks -storetype jceks -storepass secret -keyalg EC -keysize 256 -alias ES512 -keypass secret -sigalg SHA512withECDSA -dname "CN=,OU=,O=,L=,ST=,C=" -validity 360

从上面开始,密码为secret,别名为es512。这是登录页面的内容

  <form action="/login-auth" method="POST">
    <div class="credential">
      <input type="text" name="username" placeholder="Username" />
      <input type="password" name="password" placeholder="Password" />

      <input type="submit" value="OK" />
    </div>
  </form>

其中/login-authRouteNames.LOGIN_CHECKERrouter.post(RouteNames.LOGIN_CHECKER).handler(FormLoginHandler.create(authProvider));的值


在我的网页中,我尝试访问http://localhost/admin/test,并且正确地重定向到/login页面:

enter image description here

为什么我会收到此消息

  

禁止

当我尝试访问时?别名和密码正确,我也使用keytool测试了它们并匹配(我在命令中使用它们来生成jceks)。怎么了?

我是否无法以某种方式使用JWT身份验证?

1 个答案:

答案 0 :(得分:1)

您在这里混合了2种不兼容的东西。

  • FormAuthHandler函数用于将您的浏览器重定向到一个HTML页面,在该页面上要求向最终用户输入登录名/密码。这就是您正在观察的。
  • JWTHandler函数用于验证JWT令牌。

因此,当您的浏览器将表单提交到服务器时,它将发送一个表单(带有用户名/密码),而不是JWT令牌。由于缺少令牌,因此您将获得禁止的错误代码。