Spring Boot + Angular 9 JWT令牌存储在HTTPOnly Cookie中

时间:2020-06-17 06:13:50

标签: spring-boot jwt angular9 cookie-httponly

我正在将Spring Boot与Angular 9和STATELESS会话实现一起使用。该应用程序已成功执行登录和注册功能。字符串启动会在每个登录请求上生成令牌(JWT)。登录后,当我尝试运行第二个TAB的应用程序时,再次要求我登录。为解决此问题,我将令牌保存在Localstorage中,然后在单击另一个TAB时,角度代码便可以从Localstorage中选择令牌。但是经过一些研发,我才知道应该使用HTTPOnly Cookie代替Localstorage。有人可以帮我在Angular 9和Spring Boot中使用仅HTTP的cookie。谢谢

2 个答案:

答案 0 :(得分:0)

此处是示例代码,用于创建HTTP唯一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);
}

答案 1 :(得分:0)

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

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

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