首页 > 解决方案 > React App + Spring Boot - cookie 中的 JWT 身份验证令牌未在 Chrome 中设置

问题描述

在我的反应应用程序发出登录请求后,我正在尝试将 Spring Boot 配置为包含 JWT 身份验证令牌的 set-cookie,然后期望浏览器会自动将此 cookie 设置为 cookie 路径指定的所有请求。这种行为在我朋友的环境中没问题 - 相同的代码、Chrome 浏览器、不同的机器。我尝试清除node_modules,mvn clean install,还尝试了不同的浏览器Chrome和FireFox,没有成功。

这是所有相关代码(如果我遗漏了其他重要内容,请告诉我)

为了测试身份验证流程,我们从登录表单 (react) 发出登录请求,该请求成功代理到端口 8080,并且来自服务器的响应成功地将 JWT 令牌作为身份验证 cookie 的一部分返回。cookie 被指定到/api路径。如下 Chrome 中所示的网络请求:

在此处输入图像描述

登录后,react 应用程序立即向后端发出第二个 HTTP 请求,但服务器上的断点显示没有 cookie 作为此请求的一部分从浏览器传递。请求是http://localhost:3000/api/user

fetch在我们用来发出请求的前端,它看起来像这样:

fetch("/api/user, {
    credentials: "same-origin"
  })

仅作为附加上下文,这是我们在成功登录后从服务器返回原始 cookie 的方式:

@PostMapping("/signin")
    public ResponseEntity signin(@RequestBody AuthenticationRequest data, HttpServletResponse response) {
        try {
            String username = data.getUsername();
            Authentication authentication = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(username, data.getPassword()));
            User user = (User) authentication.getPrincipal();
            String token = jwtTokenProvider.createToken(user);
            final Cookie cookie = new Cookie("auth", token);
            cookie.setSecure(!environment.acceptsProfiles(Profiles.of("dev")));
            cookie.setHttpOnly(true);
            cookie.setMaxAge(Integer.MAX_VALUE);
            cookie.setPath("/api");
            response.addCookie(cookie);

            return ok(buildUserResponseObject(user));
        } catch (AuthenticationException e) {
            throw new BadCredentialsException("Invalid username/password supplied");
        }
    }

我们的方法有什么问题吗?是什么阻止了我的浏览器传递 auth cookie?

标签: reactjsspring-bootgoogle-chromecookiessetcookie

解决方案


哦,这很尴尬……

问题是这条线

cookie.setSecure(!environment.acceptsProfiles(Profiles.of("dev")));

!environment.acceptsProfiles(Profiles.of("dev"))正在评估true并且它导致cookie仅在连接安全时才通过,这不是因为它是本地主机。谜团已揭开。


推荐阅读