Конечная точка возвращает 403 после успешного выполнения (Spring Boot)JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Конечная точка возвращает 403 после успешного выполнения (Spring Boot)

Сообщение Anonymous »

Я создал конечную точку «/api/chat», которая при вызове делает еще один запрос к API OpenAI (оплачено, ключ API действителен и все такое). При тестировании конечной точки в Postman я сначала запрашиваю конечную точку /auth/login, чтобы получить действительный токен входа JWT, копирую его для заголовка авторизации моего вызова /api/chat, а затем отправляю его (токен аутентификации входа действителен на 100%). и отлично работает и для всех остальных конечных точек).
Когда делается запрос к /api/chat, Postman обрабатывает его около 1,5–2 секунд. В первую секунду моя консоль запуска в Intellij регистрирует правильные данные, обозначающие сделанный запрос. В оставшееся время он записывает точный ожидаемый ответ модели OpenAI API. Вы могли бы подумать, что это означает, что все выполнено нормально, и, похоже, так оно и было, но затем Postman (и мой веб-сайт, если вы попробуете его там) возвращает 403 вместо 200 OK. Это проблема, потому что, хотя я физически вижу, что правильный ответ регистрируется в моей консоли IDE без ошибок, ошибка 403 означает, что я не могу извлечь что-либо из этого для использования, а веб-сайт не может его получить и обрабатывает его как полностью неудачный запрос.
ЕДИНСТВЕННЫЙ способ, которым я «исправил» это, - это сделать конечную точку /api/chat общедоступной в моем файле SecurityConfig, что заставило ее выполняться точно так же и давать тот же результат. результат, но возвращает 200 OK, как и ожидалось. Однако я, конечно, не могу оставить это так, поскольку это означало бы, что у людей будет публичный доступ для совершения вызовов на конечную точку, за каждый запрос у меня будет взиматься плата.
Я потратил много часов пытался понять это, включая поиск в Google, запрос GPT — ничего. Проверил все мои данные аутентификации JWT, попробовал что-то, где токен аутентификации сохраняется, ничего не помогло. CORS и CSRF, похоже, тоже не то. Я могу только думать, что это что-то не так с Spring Security, потому что добавление конечной точки в список .permitAll() (сделание его общедоступным) в SecurityConfig - единственное, что заставило его вернуть 200 ОК, как и ожидалось. Это очень расстраивает, потому что он выполняется и регистрируется именно так и так, как и должно, но по какой-то причине возвращает 403.
Это мой первый проект с Spring, поэтому, если это что-то тривиальное, пожалуйста, помогите вне. Заранее спасибо. Ключ API установлен в моих переменных env, и хотя я включил некоторую регистрацию ошибок, ошибки никогда не регистрируются, а только правильные ответы, которые я ожидаю от модели AI, а затем она возвращает 403, как я упомянул. Я включу соответствующие фрагменты кода, но если вы считаете, что проблема в другом файле или части этих файлов, дайте мне знать, и я поделюсь всем, что смогу. Не то чтобы это слишком важно, я не думаю, но я использую React для внешнего интерфейса.
:
Конфигурация безопасности:
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.csrf()
.disable()
.authorizeHttpRequests(authorize -> authorize
.requestMatchers("/auth/**", "/", "/index.html", "/manifest.json", "/static/**", "/*.js", "/*.jsx", "/*.css", "/home", "/log-in", "/sign-up")
.permitAll()
.requestMatchers("/auth/signup", "/auth/login").anonymous()
.anyRequest()
.authenticated()
)
.sessionManagement(session -> session
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
)
.authenticationProvider(authenticationProvider)
.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);

return http.build();

Контроллер:
@PostMapping
public Mono getChatCompletion(@RequestBody ChatRequest chatRequest, @RequestHeader HttpHeaders headers) {

return openAiService.getChatCompletion(chatRequest.getInput())
.map(response -> {
logger.info("Response: {}", response); // Logging response
return ResponseEntity.ok(response);
})
.defaultIfEmpty(ResponseEntity.noContent().build());
}

public static class ChatRequest {
private String input;

public String getInput() {
return input;
}

public void setInput(String input) {
this.input = input;
}
}

Сервис:
public Mono getChatCompletion(String userInput) {
String requestBody = String.format("""
{
"model": "gpt-3.5-turbo",
"messages": [
{
"role": "system",
"content": "MY CONTENT"
},
{
"role": "user",
"content": "%s"
}
],
"temperature": 1,
"max_tokens": 256,
"top_p": 1,
"frequency_penalty": 0,
"presence_penalty": 0
}
""", userInput);

logger.info("Sending request to OpenAI with body: {}", requestBody);

return this.webClient.post()
.uri("/chat/completions")
.header("Content-Type", "application/json")
.header("Authorization", "Bearer " + openaiApiKey)
.bodyValue(requestBody)
.retrieve()
.bodyToMono(String.class)
.doOnNext(response -> logger.info("Received response from OpenAI: {}", response))
.doOnError(WebClientResponseException.class, error -> {
logger.error("Error response from OpenAI: {}", error.getResponseBodyAsString());
})
.doOnError(error -> logger.error("Error occurred: ", error));
}

Мой запрос Почтальона (не слишком уместен, проблема не в этом):
{
input: "MY INPUT"
}


Подробнее здесь: https://stackoverflow.com/questions/786 ... pring-boot
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»