【问题标题】:Spring Boot + Angular 9 JWT token store in HTTPOnly CookieHTTPOnly Cookie 中的 Spring Boot + Angular 9 JWT 令牌存储
【发布时间】:2020-10-06 21:21:36
【问题描述】:

我正在使用带有无状态会话实现的 Angular 9 的 Spring Boot。该应用程序正在成功执行登录和注册功能。字符串引导会在每个登录请求上生成令牌(JWT)。登录后,当我尝试运行第二个 TAB 的应用程序时,它再次要求我登录。为了克服这个问题,我将令牌保存在 Localstorage 中,然后在单击另一个 TAB 时,角度代码能够从 Localstorage 中选择令牌。但经过一些研发后,我知道应该使用 HTTPOnly Cookie 来代替 Localstorage。有人可以帮助我在 Angular 9 和 Spring Boot 中使用仅限 HTTP 的 cookie。谢谢

【问题讨论】:

  • 在成功验证后添加cookie作为响应,而不是本地存储,然后就可以了

标签: spring-boot jwt angular9 cookie-httponly


【解决方案1】:

这里是创建 HTTP Only cookie 并将其附加到您的响应的示例代码。至少您需要传入 HttpServletResponse 以将 cookie 附加到标头。您可以使用 ResponseEntity 或其他东西来返回响应正文中的任何内容。

@PostMapping("/refresh_token")
public ResponseEntity refreshToken(HttpServletResponse response)
{
   //create cookie for refresh token
   Cookie refreshTokenCookie = new Cookie("refresh_token", refreshToken);
   refreshTokenCookie.setHttpOnly(true);
   refreshTokenCookie.setSecure(true); //only allows HTTPS
   refreshTokenCookie.setPath("/");
   refreshTokenCookie.setDomain("api.lsp.com"); //restrict domain

   response.addCookie(refeshTokenCookie);

   return ResponseEntity(HttpStatus.OK);
}

【讨论】:

    【解决方案2】:

    确实,刷新令牌应该设置为 cookie http,而不是本地存储,因为这里有很好的解释 JWT refresh token flow 为了回答您的问题,@user521990 的响应是 cookie 实现的一个很好的例子:

    • 请注意在开发模式下设置refreshTokenCookie.setSecure(false);,因为您没有使用HTTPS
    • 另外,如果您没有明确地设置域(),那么请求的域将是默认域
    • 然后将路径设置为 refreshTokenCookie.setPath("/"); 将使其成为可在任何地方访问的全局 cookie

    在开发模式下,您将需要一些 CORS 配置来启用在浏览器中设置的 cookie。至少您需要在 Java 控制器 @CrossOrigin(origins = "http://localhost:4200", allowCredentials = "true") 中进行以下配置(或者您可以在不同的文件中更全局地进行此配置)
    最后在 Angular 应用程序中,将选项 { withCredentials: true } 添加到需要设置或使用 httponly cookie 的请求中

    【讨论】:

    • HttpOnly 和 HTTP 或 HTTPS 无关,表示 cookie 是否被客户端代码访问(我猜你想说setSecure(false)?)
    猜你喜欢
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 2021-02-11
    • 2020-08-09
    • 2021-05-20
    • 1970-01-01
    • 2015-09-15
    • 2016-09-13
    相关资源
    最近更新 更多