1

我有一个网站,当用户登录时,它会创建一个存储在内存中的访问令牌和一个存储在 HttpOnly cookie 中的刷新令牌。当用户注销时,我想删除 HttpOnly cookie。但是,由于它是 HttpOnly,我无法使用 JavaScript 执行此操作,因此我的计划是从过期的服务器发送另一个 cookie 并覆盖有效的 cookie。不幸的是,由于某种原因,这不起作用。

这就是我首先创建cookie的方式:

 String refreshToken = issueRefreshToken(username);
 long currentDate = Calendar.getInstance().getTimeInMillis();
 Date expDate = new Date(currentDate + 60 * 24 * 7 * ONE_MINUTE_IN_MILLIS);

 NewCookie newCookie = new NewCookie("RefreshCookie",
                    refreshToken,
                    "/",
                    null,
                    NewCookie.DEFAULT_VERSION,
                    "Comment",
                    60 * 60 * 24 * 7,
                    expDate,
                    false,
                    true);

            // Return the token  on the response
 return Response.ok(accessToken).cookie(newCookie).header("Access-Control-Allow-Credentials", true).build();

这会按预期工作并创建一个有效期为一周的刷新 cookie。

我有另一个端点 (/logout) 创建另一个 cookie,假设它会覆盖第一个。

 @POST
 public Response logout(){
        NewCookie logoutCookie = new NewCookie(
                "RefreshCookie",
                null,
                "/",
                null,
                NewCookie.DEFAULT_VERSION,
                "",
                0,
                new Date(),
                false,
                true);
        return Response.ok().cookie(logoutCookie).header("Access-Control-Allow-Credentials", true).build();
    }

当第一个客户端未设置时,此 cookie 甚至不会保存到前端。我试图从设置第一个 cookie 的子路径发送它,但没有运气。有什么我在这里想念的吗?这是错误的方法吗?

4

1 回答 1

0

从您所说的是您正在使用 httpOnly cookie,因此您必须了解一件事是,从客户端您将无法实现这一目标,因为那样会破坏拥有 httpOnly cookie 的目的,而这本来就是相同的就像吃普通饼干一样。

  • 因此,现在您在用户注销时摆脱 cookie 的解决方案在您的后端,我相信在其中制作 cookie 是您想要删除该特定 cookie 的地方。
于 2020-11-09T09:06:57.457 回答