Angular 2 - добавлять withCredentials = true с каждым запросом http

Я использую Angular 2 (не последний, как с помощью Angular-Cli: 1.0.0-бета.11-WebPack.9-4), и я должен установить withCredentials в true для каждого запроса HTTP. Я попытался настроить его для одного запроса, используя

http.get (' http://my.domain.com/request', {withCredentials: true})

и все работает нормально, однако я пытаюсь использовать что-то в начальной загрузке, как показано ниже, но не получаю никакого успеха

import './polyfills.ts';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { enableProdMode } from '@angular/core';
import { environment } from './environments/environment';
import { AppModule } from './app/';
import {Http, Headers, BaseRequestOptions, RequestOptions, BrowserXhr} from '@angular/http';

if (environment.production) {
  enableProdMode();
}

export class MyRequestOptions extends BaseRequestOptions {
  constructor () {
    super();
    this.headers.append('withCredentials','true');
  }
}

platformBrowserDynamic().bootstrapModule(AppModule, 
  [{ provide: RequestOptions, useClass: MyRequestOptions}]
);

2 ответа

Я не знаю, требуется ли это больше, но у меня была та же проблема, и я решил следующим образом:

  1. Создайте подкласс BaseRequestOptions (который расширяет RequestOptions):

    import { Headers, BaseRequestOptions } from "@angular/http";
    
    export class AuthRequestOptions extends BaseRequestOptions {
       constructor() {
          super();
          this.withCredentials = true;
       }
    }
    
  2. Зарегистрируйте его в загрузочном приложении

    import { RequestOptions } from '@angular/http';
    import { AuthRequestOptions } from './<path>/AuthRequestOptions';
    
    @NgModule({
       bootstrap: [...],
       imports: [...],
       providers: [
          { provide: RequestOptions, useClass: AuthRequestOptions},
          ...
       ]
    }...
    

(В моем случае это работает с CORS+NTLMAuthentication)

Как указано Sierrodc Angular 4.3+ позволяет использовать перехватчики для настройки этого. Полный пример, который работает с NTLMAuthentication показан ниже:

Перехватчик

@Injectable()
export class WithCredentialsInterceptor implements HttpInterceptor {


    intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

        request = request.clone({
            withCredentials: true
        });

        return next.handle(request);
    }
}

Конфигурация модуля (перехватчик позволяет соединяться с другими перехватчиками):

@NgModule({
    imports: [CommonModule, BasicRoutingModule, HttpClientModule],
    declarations: [HomeComponent, CounterComponent, FetchDataComponent],
    providers: [
        {
            provide: HTTP_INTERCEPTORS,
            useClass: WithCredentialsInterceptor,
            multi: true
        },
        {
            provide: HTTP_INTERCEPTORS,
            useClass: BaseUrlInterceptor,
            multi: true
        }
    ]
})
export class BasicModule { }

Фактическое использование

constructor(
    private http: HttpClient) {

    this.http.get<WeatherForecast[]>('api/SampleData/WeatherForecasts')
        .subscribe(result => {
            this.forecasts = result;
        },
        error => {
            console.error(error);
        });
}
Другие вопросы по тегам