React App + Spring Boot-在Chrome中未设置Cookie中的JWT身份验证令牌

问题描述 投票:0回答:1

我正在尝试将Spring Boot配置为在来自我的react应用程序的登录请求之后将包含JWT auth令牌的set-cookie设置为cookie,然后期望浏览器将自动将此cookie设置为cookie指定的所有请求路径。在我朋友的环境中,这种行为还可以-相同的代码,Chrome浏览器,不同的计算机。我尝试清除node_modules,进行mvn全新安装,还尝试使用其他浏览器Chrome和FireFox,但没有成功。

这里是所有相关代码(如果我缺少其他重要信息,请告诉我)

  • React在本地主机上运行:3000
  • Spring Boot在本地主机上运行:8080
  • package.json中有一个代理

    “代理”:“ http://localhost:8080”,

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

enter image description here

登录后,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");
        }
    }

我们的方法有什么问题吗?是什么导致我的浏览器无法通过身份验证Cookie?

reactjs spring-boot google-chrome cookies setcookie
1个回答
0
投票

哦,这很尴尬...

问题是此行

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

!environment.acceptsProfiles(Profiles.of("dev"))的计算结果为true,这导致仅在连接安全的情况下才传递cookie,这不是因为它是本地主机。谜团解决了。

© www.soinside.com 2019 - 2024. All rights reserved.