我正在尝试将Spring Boot配置为在来自我的react应用程序的登录请求之后将包含JWT auth令牌的set-cookie设置为cookie,然后期望浏览器将自动将此cookie设置为cookie指定的所有请求路径。在我朋友的环境中,这种行为还可以-相同的代码,Chrome浏览器,不同的计算机。我尝试清除node_modules,进行mvn全新安装,还尝试使用其他浏览器Chrome和FireFox,但没有成功。
这里是所有相关代码(如果我缺少其他重要信息,请告诉我)
package.json中有一个代理
“代理”:“ http://localhost:8080”,
为了测试身份验证流程,我们从登录表单(反应)发出登录请求,该请求已成功代理到端口8080,服务器的响应已成功返回JWT令牌作为身份验证的一部分曲奇饼。 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");
}
}
我们的方法有什么问题吗?是什么导致我的浏览器无法通过身份验证Cookie?
哦,这很尴尬...
问题是此行
cookie.setSecure(!environment.acceptsProfiles(Profiles.of("dev")));
!environment.acceptsProfiles(Profiles.of("dev"))
的计算结果为true
,这导致仅在连接安全的情况下才传递cookie,这不是因为它是本地主机。谜团解决了。