Предотвратить HttpClient от чтения куки на PUT, POST & PATCH - PullRequest
0 голосов
/ 31 мая 2018

Как я могу предотвратить попытки моего приложения Angular прочитать document.cookie при запросах PUT / POST и PATCH от HttpClient?

  • Myприложение работает в iframe в другом веб-приложении, где доступ к файлам cookie не разрешен!
    Я не могу контролировать эту среду / приложение.
  • GET-запросы работают без проблем.
  • Я использую Angular 6.0.2

Ошибка

put, post & patch Запрос от HttpClient производит следующую ошибку.

backend.service.ts: 127 DOMException: Не удалось прочитать свойство cookie из «Document»: документ помещен в «песочницу» и отсутствует флаг «allow-same-origin».в HttpXsrfCookieExtractor.push ../ node_modules/@angular/common/fesm5/http.js.HttpXsrfCookieExtractor.getToken (http://localhost:8080/44812272_a91e_4126_ad7b_6a54454…_sc-lightcontrol.jar/vendor.js:27596:37) в HttpXsrfInterceptor.push ../ node_modules/@angularjsh .hmHttpXsrfInterceptor.intercept (http://localhost:8080/44812272_a91e_4126_ad7b_6a54454…_sc-lightcontrol.jar/vendor.js:27633:39) в HttpInterceptorHandler.push ../ node_modules / @ angular / common / fesm5 /http.js.HttpInterceptorHandler.handle (http://localhost:8080/44812272_a91e_4126_ad7b_6a54454…_sc-lightcontrol.jar/vendor.js:27004:33) в HttpInterceptingHandler.ushdules / @angular / common / fesm5 / http.js.HttpInterceptingHandler.handle (http://localhost:8080/44812272_a91e_4126_ad7b_6a54454…_sc-lightcontrol.jar/vendor.js:27677:27) в MergeMapSubscriber.project (http://localhost:8080/44812272_a91e_4126_ad7b_6a54454…_sc-lightcontrol.jar/vendor.js:26755:184) в MergeMapSubscriber.push ../ node_modules / rxjs / _esm5 / internal / operator / mergeMap).js.MergeMapSubscriber._tryNext (http://localhost:8080/44812272_a91e_4126_ad7b_6a54454…_sc-lightcontrol.jar/vendor.js:110070:27) в MergeMapSubscriber.push ../ node_modules / rxjs / _esm5 / internal / operator / mergeMap.js.MergeMapSubscriber._next (http://localhost:8080/44812272_a91e_4126_ad7b_6a54454…_sc-lightcontrol.jar/vendor.js:110060:18) в MergeMapSubnode_modules / rxjs / _esm5 / internal / Subscriber.js.Subscriber.next (http://localhost:8080/44812272_a91e_4126_ad7b_6a54454…_sc-lightcontrol.jar/vendor.js:101403:18) в Observable._subscribe (http://localhost:8080/44812272_a91e_4126_ad7b_6a54454…_sc-lightcontrol.jar/vendor.js:104821:20) в Observable.push ../ node_modules / rxjs / _esm5 / internal / Observable.js.Observable._trySubscribe (http://localhost:8080/44812272_a91e_4126_ad7b_6a54454…_sc-lightcontrol.jar/vendor.js:100628:25)

Код

putTest(), postTest() и patchTest() не работают с вышеуказанным исключением.
getTest() работает.

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

@Injectable({ providedIn: 'root' })
export class BackendService {

  constructor(
    private http: HttpClient,
    private messageService: MessageService
  ) { }

  putTest(): Observable<any> {
    console.log('PUT test');
    return this.http.put(BackendUrl.updateDeviceToControl, mockDevicePropertyData, httpOptions)
      .pipe(
        tap(_ => console.log('Success')),
        catchError(this.handleError<any>('PUT test'))
      );
  }

  patchTest(): Observable<any> {
    console.log('PATCH test');
    return this.http.patch(BackendUrl.updateDeviceToControl, mockDevicePropertyData, httpOptions)
      .pipe(
        tap(_ => console.log('Success')),
        catchError(this.handleError<any>('PATCH test'))
      );
  }

  postTest(): Observable<any> {
    console.log('POST test');
    return this.http.post(BackendUrl.updateDeviceToControl, mockDevicePropertyData, httpOptions)
      .pipe(
        tap(_ => console.log('Success')),
        catchError(this.handleError<any>('POST test'))
      );
  }

  getTest(): Observable<any> {
    console.log('GET test');
    return this.http.get(BackendUrl.updateDeviceToControl)
      .pipe(
        tap(_ => console.log('Success')),
        catchError(this.handleError<any>('GET test'))
      );
  }
}

1 Ответ

0 голосов
/ 03 июня 2018

Запросы PUT / POST и PATCH работают, если я отключаю поддержку XSRF для защиты для исходящих запросов, которая включена по умолчанию и пытается прочитать файл cookie XSRF-TOKEN.

@NgModule({
...,
imports: [
  HttpClientModule,
  HttpClientXsrfModule.disable(),
],
...
})

HttpClientXsrfModule.disable ()

...