Ioni c CORS Проблема только при добавлении пользовательского заголовка в запрос (Spring boot backend) - PullRequest
0 голосов
/ 22 марта 2020

Я знаю ... Проблема CORS c - это хорошо обсуждаемая тема c. После долгих поисков решения моей проблемы я прошу вас о помощи:)

У меня есть приложение ioni c angular и приложение с пружинной загрузкой для моего бэкэнда. Серверная часть размещается на сервере publi c (с доменом) и с ssl-шифрованием letsencrypt.

Все работало нормально, пока я не добавил пользовательский заголовок. Я получаю для каждого запроса ошибку cors:

Access to XMLHttpRequest at 'https://www.BACKEND_URL.com:5000/healthstatus' 
from origin 'http://localhost:8100' has been blocked by CORS policy: 
Response to preflight request doesn't pass access control check: 
No 'Access-Control-Allow-Origin' header is present on the requested resource.

Я добавил аргумент пользовательского заголовка с перехватчиком, например:

import {Injectable} from '@angular/core'; 
import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor } from '@angular/common/http';
import {Observable} from "rxjs"; 
import {AuthService} from "../services/auth.service";

@Injectable() export class TokenInterceptor implements HttpInterceptor {

  constructor(public auth: AuthService) { } 

  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
   console.log('####: interceptor: addHeader'); 
   request = request.clone({ setHeaders: { Authorization: `Bearer TEST-TOKEN` } });
   return next.handle(request);
  }
}

На контроллере, который я добавил, также CrossOrigin аннотация

@CrossOrigin
@Controller

Только когда я редактирую заголовок, я получаю ошибку CORS. Можете ли вы дать мне совет? Есть ли другой способ добавить мой токен в запрос?

Заранее спасибо

1 Ответ

0 голосов
/ 23 марта 2020

Наконец-то я нашел решение!

При загрузке Spring я использую "HandlerInterceptor". Этот перехватчик разрешает только те запросы, которые содержат мой токен в заголовке.

Когда браузер запрашивает у сервера некоторую информацию о cors, браузер отправляет OPTIONS -call на внутренний сервер. Этот вызов опции также был отклонен и, таким образом, не смог получить разрешенные методы / заголовки / происхождение ...

Мой код выглядит следующим образом

if (request.getMethod().equals("OPTIONS")) { 
    response.setHeader("Access-Control-Allow-Origin", "*");
    //I've changed the 'Authorization' header to 'token' (at the end of the following codeline) 
    response.setHeader("Access-Control-Allow-Headers", "AuthID,Origin,X-Requested-With,Content-Type,Accept,token");
    //After that, continue without checking if the request is correct
    return true; 
} else {
    //check if the request-header contains my token...
}

Если вы реализовали загрузку с использованием пружины безопасности вы должны настроить следующий код:

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .cors()
            .and()
            .authorizeRequests()
            .antMatchers("/", "/**").permitAll()
            .antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
            .anyRequest().authenticated();

        http.csrf().disable();
        http.headers().frameOptions().disable();
    }
...