page navigationend change angular http cookies oauth-2.0 cors

navigationend - router events subscribe angular 4



Angular 4: configuraciĆ³n con credenciales en cada solicitud: cookie de cors (2)

Otra forma quizás más simple es crear tu propio ApiService . Se usaría un HttpClient inyectado. Todas las solicitudes de XHR utilizarían ApiService en lugar de HttpClient directamente.

Aquí hay una implementación de ejemplo:

https://github.com/gothinkster/angular-realworld-example-app/blob/63f5cd879b5e1519abfb8307727c37ff7b890d92/src/app/core/services/api.service.ts

Algunos de los códigos que he modificado:

@Injectable() export class ApiService { private httpOptions = { headers: new HttpHeaders({ ''Content-Type'': ''application/json'' }), withCredentials: true // to allow cookies to go from "https://localhost:4567" to "http://localhost:5678" }; constructor( private http: HttpClient ) { } private formatErrors(error: any) { return throwError(error.error); } get(path: string, params: HttpParams = new HttpParams()): Observable<any> { return this.http.get(`${environment.api_url}${path}`, { params }) .pipe(catchError(this.formatErrors)); } put(path: string, body: Object = {}): Observable<any> { return this.http.put( `${environment.api_url}${path}`, JSON.stringify(body), this.httpOptions ).pipe(catchError(this.formatErrors)); } post(path: string, body: Object = {}): Observable<any> { return this.http.post( `${environment.api_url}${path}`, JSON.stringify(body), this.httpOptions ).pipe(catchError(this.formatErrors)); }

Mi cliente angular está separado del backend y he habilitado cors en el backend, todo funciona bien, excepto el hecho de que mi autenticación falla porque la cookie no se agrega a las solicitudes.

Después de buscar en línea, encontré que debería establecer {withCredentials : true} en cada solicitud http. Me las arreglé para hacerlo en una sola solicitud y funciona, pero no en todas las solicitudes.

Intenté usar BrowserXhr ¿Cómo enviar "Cookie" en el encabezado de solicitud para todas las solicitudes en Angular2? pero no funciona y también está en desuso.

También probé RequestOptions pero no funcionó.

¿Qué puedo hacer para configurar {withCredentials: true} en cada solicitud http?

Edición posterior:

@Injectable() export class ConfigInterceptor implements HttpInterceptor { constructor(private csrfService: CSRFService) { } intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { let token = this.csrfService.getCSRF() as string; const credentialsReq = req.clone({withCredentials : true, setHeaders: { "X-XSRF-TOKEN": token } }); return next.handle(credentialsReq); } }


Puedes usar un HttpInterceptor .

@Injectable() export class CustomInterceptor implements HttpInterceptor { constructor() { } intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { request = request.clone({ withCredentials: true }); return next.handle(request); } }

A continuación tienes que proporcionarlo:

@NgModule({ bootstrap: [AppComponent], imports: [...], providers: [ { provide: HTTP_INTERCEPTORS, useClass: CustomInterceptor , multi: true } ] }) export class AppModule {}

Fuente y explicación completa.