【问题标题】:How do I delete a HttpOnly Cookie on the client?如何删除客户端上的 HttpOnly Cookie?
【发布时间】:2020-11-09 07:09:38
【问题描述】:

我有一个网站,当用户登录时,它会创建一个存储在内存中的访问令牌和一个存储在 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 的子路径发送它,但没有运气。有什么我在这里想念的吗?这是错误的做法吗?

【问题讨论】:

  • 我遇到了同样的问题!登录并设置 HttpOnly cookie 工作得很好,但在注销时删除该 cookie 是不可能的?无法将其设置为空值,将 max-age 更改为 0 也无济于事。你解决了吗?

标签: java reactjs cookies jax-rs cookie-httponly


【解决方案1】:

从您所说的来看,您正在使用 httpOnly cookie,因此您必须了解一件事是,从客户端您将无法实现这一目标,因为那样会破坏拥有 httpOnly cookie 的目的,而不仅仅是和普通的 cookie 一样。

  • 因此,现在您在用户注销时删除 cookie 的解决方案是在您的后端,我相信 cookie 是您想要删除该特定 cookie 的地方。

【讨论】:

  • 没错!但是,据我所知,实现此目的的唯一方法是用一个将立即过期的新 cookie 覆盖第一个 cookie。问题是这对我不起作用,因为 cookie 没有保存或覆盖,我不知道为什么会这样。
  • 你可以阅读我曾经给需要服务器端会话的人提供的示例stackoverflow.com/questions/64683813/… 会话都保存在 mongoStore 中,因此您可以轻松处理此类事情,这就是我处理快速会话的方式
  • @NtshemboHlongwane 如果我们要覆盖服务器上的 HttpOnly cookie,如果服务器当前不可用(例如由于客户端上的网络问题)但用户的意图是退出?
猜你喜欢
  • 2011-04-22
  • 1970-01-01
  • 2019-11-26
  • 1970-01-01
  • 2020-09-29
  • 2012-08-30
  • 1970-01-01
  • 2013-04-02
  • 2020-11-23
相关资源
最近更新 更多