Указание заголовков CORS для withCredentials: true - PullRequest
0 голосов
/ 09 мая 2018

Мне нужно указать заголовки CORS, потому что мне нужно отправлять ключ cookie в каждом запросе. У меня есть бэкэнд с Java Spring Boot и пользовательский интерфейс с Angular 5 на разных серверах.

На стороне интерфейса я вызываю сервер со следующим кодом TS:

@Injectable()
export class CoreApi {
  private baseUrl = 'http://localhost:8080/rest/';

  constructor(public http: HttpClient) {
  }

  public get(url: string = ''): Observable<any> {
    return this.http.get(this.getUrl(url), { withCredentials: true });
  }

  public post(url: string, data: any = {}): Observable < any > {
    return this.http.post(this.getUrl(url), data, { withCredentials: true });
  }

  private getUrl(url: string = ''): string {
    return this.baseUrl + url;
  }
}

Мне нужно withCredentials: true для отправки cookie, иначе Spring Security не сможет распознать пользователя без идентификатора сеанса. Но на сервере я поставил response.setHeader("Access-Control-Allow-Origin", "*") для возможности работы с двумя разными серверами для пользовательского интерфейса и бэкэнда.

И я в порочном круге: если я удаляю Access-Control-Allow-Origin - *, я получаю:

No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:4200' is therefore not allowed access.

Если я удаляю withCredentials: true Spring Security не работает правильно без идентификатора сеанса. И все запросы после аутентификации - UNAUTHORIZED без куки.

Я думаю, что нужно реализовать белый список происхождения и отвечать на запросы CORS с допустимым источником, когда задействованы учетные данные. Но как это сделать? Если вы знаете что-нибудь об этом, пожалуйста, дайте мне знать. Спасибо!

Может быть фильтр что-то вроде этого:

@WebFilter(urlPatterns = {"/*" })
public class CorsRestFilter implements Filter {
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        ...somehow sfecifying Access-Control-Allow-Origin...
        response.setHeader("Access-Control-Allow-Methods", "POST, GET");
        chain.doFilter(req, res);
    }
}

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Вам также необходимо добавить заголовок Access-Control-Allow-Origin.

response.setHeader("Access-Control-Allow-Origin", "http://localhost:4200");

Если вы делаете вызовы из разных источников с учетными данными, вам нужно добавить явный хост, а не *. В противном случае ваш звонок будет заблокирован браузером.

-

Если вы используете spring, вы также можете использовать их тег crossorigin: https://spring.io/guides/gs/rest-service-cors/

0 голосов
/ 09 мая 2018

создать постоянный компонент сервиса и внедрить его в вызов метода сервиса например:

service.ts

const httpOptions = {
  headers: new HttpHeaders({ 'Content-Type': 'application/json' }),
  withCredentials: true,
};



demoServiceMethod(requestparameter): Observable<PayloadResponse<any>> {
    return this.http.post<PayloadResponse<any>>(environment.baseurl +
      'v1/test/api', requestparameter, httpOptions)
      .pipe(catchError(this.apiErrorService.handleError<PayloadResponse<any>>('operation name  ')));
  }
...