Проблема:
Когда я делаю запрос к https://api.example.com/user-profile/auth-data из моего интерфейса (и даже от Postman) я получаю следующий ответ:
Код: Выделить всё
{
"timestamp": "2024-10-29T15:56:39.325+00:00",
"status": 404,
"error": "Not Found",
"message": "No message available",
"path": "/user-profile/auth-data"
}
Детали конфигурации:
Вот мой класс SecurityConfiguration:
Код: Выделить всё
@Configuration
@EnableWebSecurity
@EnableMethodSecurity
@AllArgsConstructor
@SpringBootApplication(scanBasePackages = {"com.dynamicquotation.dq"})
public class SecurityConfiguration implements WebMvcConfigurer {
private final JwtFilter jwtFilter;
private final DataSource dataSource;
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.cors(cors -> cors.configurationSource(request -> {
CorsConfiguration configuration = new CorsConfiguration();
configuration.setAllowedOrigins(List.of("https://example.com", "https://accounts.google.com"));
configuration.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE", "OPTIONS"));
configuration.setAllowedHeaders(List.of("*"));
configuration.setExposedHeaders(List.of("Authorization"));
configuration.setAllowCredentials(true);
return configuration;
}))
.csrf(AbstractHttpConfigurer::disable);
http.sessionManagement(sess -> sess.sessionAuthenticationStrategy(sessionAuthenticationStrategy()));
// Authorization
http.authorizeHttpRequests(auth ->
auth
.requestMatchers("/auth/login", "/auth/is-token-valid", "/logout", "/contact", "/quotation/single-quotation/**").permitAll()
.anyRequest().authenticated()
);
http.oauth2Login(Customizer.withDefaults());
http.httpBasic(withDefaults());
// logout
http.logout(l -> l
.logoutUrl("/logout")
.logoutSuccessUrl("/")
.clearAuthentication(true)
.deleteCookies("JSESSIONID")
.invalidateHttpSession(true)
.logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
.logoutSuccessHandler((request, response, authentication) -> response.setStatus(HttpServletResponse.SC_OK))
.addLogoutHandler((request, response, authentication) -> {
// Additional logout handler
}).permitAll());
http.addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class);
return http.build();
}
...
Я также использую Nginx в качестве обратного прокси со следующей конфигурацией:
Код: Выделить всё
server {
listen 443 ssl;
server_name api.example.com;
ssl_certificate /etc/letsencrypt/live/api.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/api.example.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
На следующем снимке экрана с вкладки «Сеть» браузера вы видите ошибку 404 ошибки на конкретных конечных точках (
Код: Выделить всё
auth-data

Код: Выделить всё
is-token-valid
Вопрос:
Что может быть причиной ошибки 404 только на рабочем сервере, несмотря на то, что конечная точка работает локально? Может ли быть какая-либо проблема с конфигурацией или средой, которую я упускаю?
Обновить
Посмотрите разницу между контроллерами:
Код: Выделить всё
@RestController
@RequestMapping("/auth")
@RequiredArgsConstructor
public class AuthController {
@GetMapping("/is-token-valid")
public ResponseEntity isTokenValid(@RequestParam("token") String token) { // Status 200
Код: Выделить всё
@RestController
@RequestMapping("/user-profile")
@AllArgsConstructor
public class UserProfileController {
@GetMapping("/auth-data")
public ResponseEntity getAuthData(@RequestHeader("Authorization") String authorizationHeader) { // Status 404
Код: Выделить всё
@RequestMapping("/quotation")
@RestController
public class QuotationController {
@GetMapping(value = "/list")
public List listQuotations(@ModelAttribute("token") String token) { // Status 404
Подробнее здесь: https://stackoverflow.com/questions/791 ... -on-localh