Когда я тестирую localhost с Postman, у меня вроде проблем нет. Однако при попытке отправить файлы cookie клиенту на другом компьютере заголовок Set-Cookie, похоже, отклоняется клиентом.
Это логика получения запроса на вход от клиент и возвращает токен доступа JWT, если логин действителен:
Код: Выделить всё
@PostMapping("/login")
public ResponseEntity authenticate(HttpServletRequest request, HttpServletResponse response, @RequestBody AuthRequestDTO requestDTO){
// Verify the client's login (username and password)
AuthDTO responseDTO = authService.authenticate(requestDTO);
// Set JWT access token if the client's login details are valid
ResponseCookie cookieAccessToken = ResponseCookie.from("accessToken", responseDTO.getAccessToken())
.maxAge(Duration.ofMinutes(5))
.domain(request.getRemoteAddr())
.sameSite("Lax")
.secure(false)
.httpOnly(true)
.build();
// Add access token as "Set-Cookie" key-value in HTTP response header.
response.addHeader(HttpHeaders.SET_COOKIE, cookieAccessToken.toString());
log.info("Access Token Cookie : " + cookieAccessToken.toString());
return ResponseEntity.ok().body(null);
}
Для справки, это мой Настройки конфигурации Spring Security (AUTH_WHITELIST обеспечивает доступ к API входа в систему без необходимости использования токена доступа, а jwtAuthenticationFilter — это компонент Spring Bean моей пользовательской реализации JWT):
Код: Выделить всё
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception{
http.csrf((csrf) -> csrf.disable())
.headers((header)->header.frameOptions((fo)->fo.sameOrigin()))
.authorizeHttpRequests((authorize) -> authorize
.requestMatchers(AUTH_WHITELIST).permitAll()
.requestMatchers("/api/admin").hasAnyRole(ADMIN_MAIN.name(), ADMIN_SUB.name())
.requestMatchers("/api/file").hasAnyRole(ADMIN_MAIN.name(), ADMIN_SUB.name())
.requestMatchers("/**").hasAnyRole(ADMIN_MAIN.name(), ADMIN_SUB.name(), USER_ENTERPRISE.name(), USER_INDIVIDUAL.name(), VISITOR.name())
.anyRequest().authenticated());
http.sessionManagement((sessionManagement) -> sessionManagement
.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.authenticationProvider(authenticationProvider)
.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);
http.logout((logout) -> logout.logoutUrl("/api/auth/logout").addLogoutHandler(logoutHandler)
.logoutSuccessHandler((request, response, authentication) -> SecurityContextHolder.clearContext()));
return http.build();
}
РЕДАКТИРОВАТЬ: у меня настроен CORS в отдельном файле. .
Код: Выделить всё
@Override
public void addCorsMappings(CorsRegistry registry){
registry.addMapping("/**")
.allowedOriginPatterns("*")
.allowCredentials(true)
.allowedMethods("GET", "POST", "PUT", "DELETE");
}
Подробнее здесь: https://stackoverflow.com/questions/781 ... connection