reactjs - React App + Spring Boot - cookie 中的 JWT 身份验证令牌未在 Chrome 中设置
问题描述
在我的反应应用程序发出登录请求后,我正在尝试将 Spring Boot 配置为包含 JWT 身份验证令牌的 set-cookie,然后期望浏览器会自动将此 cookie 设置为 cookie 路径指定的所有请求。这种行为在我朋友的环境中没问题 - 相同的代码、Chrome 浏览器、不同的机器。我尝试清除node_modules,mvn clean install,还尝试了不同的浏览器Chrome和FireFox,没有成功。
这是所有相关代码(如果我遗漏了其他重要内容,请告诉我)
- React 在 localhost:3000 上运行
- Spring Boot 在 localhost:8080 上运行
package.json 中有一个代理
“代理”:“ http://localhost:8080 ”,
为了测试身份验证流程,我们从登录表单 (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?
解决方案
哦,这很尴尬……
问题是这条线
cookie.setSecure(!environment.acceptsProfiles(Profiles.of("dev")));
!environment.acceptsProfiles(Profiles.of("dev"))
正在评估true
并且它导致cookie仅在连接安全时才通过,这不是因为它是本地主机。谜团已揭开。
推荐阅读
- php - 如何在 Laravel 中使用 Jquery Ajax
- javascript - 重新加载div而不刷新页面
- python - Atom:无法在设置的安装包部分中搜索包或主题
- java - JSON解码错误:根名称'timestamp'与预期的Eureka +spring security + Docker不匹配
- react-native - Callback in React Native onPress for a Method
- javascript - 从外部 javascript 渲染 HTML
- java - Springboot 应用程序抛出 java.lang.Exception: DEBUG STACK TRACE for PoolBackedDataSource.close()
- python - 我如何检查我的聊天机器人中的 2 个句子是否相似
- windows - 无法在 Windows 上编译 gstreamer,因为它缺少 glib-2.0
- android - 如何从活动回收器适配器更改活动中按钮的可见性