page change angular angular-http-interceptors

change - Angular 6: ¿Por qué falta el token de portador en la compilación de producción?(Funciona bien en la construcción de desarrollo)



change title angular 4 (6)

¿Puedes intentar configurar el encabezado en la llamada api real? Me gusta, ejemplo:

put(path: string, body: Object = {}): Observable<any> { return this.http.put(`${environment.api_url}${path}`, body, { headers: this.setHeaders() }) .map((res: Response) => { return res; }); } private setHeaders(): HttpHeaders { const headersConfig = { ''Content-Type'': ''application/json'', ''Accept'': ''application/json'', ''Authorization'': ''Bearer '' + this.oauthService.getAccessToken() }; return new HttpHeaders(headersConfig); }

Y el interceptor tendrá justo el

request.clone()

Estoy usando Angular 6 con un Interceptor HTTP configurado para aplicar el token de portador a las solicitudes salientes.

  • En la compilación dev ( ng serve ), el token se aplica y todo funciona bien. :-)

  • En la compilación de producción ( ng serve --prod ) la solicitud se envía sin el token de portador. :-(

En la compilación prod, he verificado que el encabezado se está aplicando, volcando los encabezados en la consola después de aplicarlos.

No tengo idea de por qué están excluidos de la solicitud http.

No hay diferencias en environment archivos de mi environment .

¿Qué más debería estar mirando?

¿Qué puedo hacer para arreglar esto?

Al principio pensé que esto era un problema entre mi entorno local y mi entorno de prueba, pero luego intenté ejecutar ng serve --prod localmente y vi los mismos resultados.

Todo lo que hay que decir, todo es idéntico, excepto uno que es una compilación de producción y el otro una compilación de desarrollo.

JWT-interceptor

import { Injectable } from ''@angular/core''; import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor } from ''@angular/common/http''; import { Observable } from ''rxjs''; @Injectable() export class JwtInterceptor implements HttpInterceptor { intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { // add authorization header with jwt token if available let currentUser = JSON.parse(localStorage.getItem(''currentUser'')); if (currentUser && currentUser.token) { request = request.clone({ setHeaders: { Authorization: `Bearer ${currentUser.token}` } }); console.log(''headers:'', request.headers); // <---- I can see headers in console output } return next.handle(request); } }

Esto es lo que veo en la consola:

app.module.ts

import { HttpClientModule, HttpClient, HttpInterceptor } from ''@angular/common/http''; import { BrowserModule } from ''@angular/platform-browser''; import { NgModule } from ''@angular/core''; import { HTTP_INTERCEPTORS } from ''@angular/common/http''; import { PortalModule } from ''@angular/cdk/portal''; import { FormsModule, ReactiveFormsModule } from ''@angular/forms''; import { JwtInterceptor } from ''./jwt-interceptor''; import { ENV } from ''../environments/environment''; import { AppComponent } from ''./app.component''; import { AppRoutingModule } from ''./app-routing.module''; ... import { myApiService } from ''./services/my-api.service''; import { myModalComponent } from ''./_components/my-modal/my-modal.component''; import { myModalService } from ''./services/my-modal.service''; import { AngularLaravelEchoModule, PusherEchoConfig, EchoInterceptor } from ''angular-laravel-echo/angular-laravel-echo''; export const echoConfig: PusherEchoConfig = { userModel: ''App.User'', notificationNamespace: ''App//Notifications'', options: { broadcaster: ''pusher'', key: ENV.pusherConfig.key, cluster: ENV.pusherConfig.cluster, host: ENV.apiRoot, authEndpoint: ENV.apiRoot + ''/broadcasting/auth'', } }; @NgModule({ declarations: [ AppComponent, ... ], imports: [ BrowserModule, HttpClientModule, BrowserModule, AppRoutingModule, FormsModule, ReactiveFormsModule, PortalModule, AngularLaravelEchoModule.forRoot(echoConfig) ], providers: [ myApiService, myModalService, { provide: HTTP_INTERCEPTORS, useClass: JwtInterceptor, multi: true, }, { provide: HTTP_INTERCEPTORS, useClass: EchoInterceptor, multi: true } ], bootstrap: [AppComponent], entryComponents: [ myModalComponent ] }) export class AppModule { }


Escribí esta aplicación en StackBlitz, y funciona bien cuando la ejecuto localmente con ng serve --prod .

https://stackblitz.com/edit/angular-yzckos

Descárguelo y ejecútelo para ver si aún undefined está undefined en la pestaña de su red. Si puedes ver que el encabezado se envía correctamente, entonces definitivamente hay algo gracioso en tu código.

Intente bramido

1- intente ejecutar `ng serve --port = aDifferentPort // como 2098

Quizás haya algo corriendo en ese puerto y enviando un encabezado de autenticación.

2- Prueba con AOT falso, no puedo pensar por qué eso causaría algún problema.

3- Asegúrate de que tu navegador no tenga ninguna extensión que anule el encabezado Auth o prueba otros navegadores

4- Apague sus otros interceptores HTTP, tal vez uno de ellos haga algo inesperado

5- Cambie el nombre del encabezado de Authorizaion a MyAuthorization , vea si aún no está definido, si no lo hace, entonces se está anulando por algo, verifique su package.json y asegúrese de que no esté ejecutando nada más en El servicio de producción.

6- Apague el JwtInterceptor completo e intente adjuntar el encabezado de autorización a su solicitud HTTP , JwtInterceptor si aún undefined está undefined .

7- Si ninguno ayudó, realmente necesita enviarnos más código :)


He tenido casi el mismo problema en el entorno de producción donde el servidor ignora completamente el encabezado de Authorization . Angular 6 envía el encabezado de Authorization correctamente, pero el servidor se elimina por completo (debido a la mayoría de los servidores de producción, la configuración de seguridad del alojamiento compartido). Sé que esta podría no ser la respuesta que estás buscando. Pero, solo quería darte una pista.

Así que, finalmente, para que funcionara, tuve que usar un parámetro de encabezado diferente, como Php-Auth-Digest , como este.

request = request.clone({ setHeaders: { "Php-Auth-Digest": `Bearer ${currentUser.token}`, } });

Como solución, intente cambiar el nombre de su parámetro de encabezado.

¡Aclamaciones!


Prueba esto

if (currentUser && currentUser.token) { request = request.clone({ setHeaders: { Authorization: `Bearer ${currentUser.token}` } }); console.log(''headers:'', request.headers); // <---- I can see headers in console output } if (typeof $ != ''undefined'') { $.ajaxSetup({ beforeSend: function (xhr: any) { xhr.setRequestHeader(''Authorization'', ''Bearer '' + currentUser.token); } }); } return next.handle(request);


Puede intentar clonar los encabezados manualmente en su método request.clone() . Esto es lo que funciona para mí:

export class HttpHeaderInterceptor implements HttpInterceptor { // ... intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { // ... const clonedRequest = req.clone({ headers: req.headers.set(''Authorization'', ''Bearer '' + currentUser.token) }); return next.handle(clonedRequest).pipe( catchError(err => { /* Error handling here */ }) ); } }

Espero que esto ayude un poco :-)


Tengo una idea acerca de esto, pero no estoy seguro de que funcione o no, por favor verifique

HttpHeaders son mutables, si agrega cualquier encabezado, actualiza el existente y agrega el valor, por lo que esto me causa un problema al agregar un encabezado, así que siga el siguiente método:

private getHeaders(): HttpHeaders { let headers = new HttpHeaders(); headers = headers.append("Content-Type", "application/json"); return headers; }

Desde entonces, agregué los nuevos encabezados, asigné el objeto al objeto original y devolví el objeto.

Pero en su caso, puede usar el mismo método anterior en su HttpInterceptor o tratar de cambiar los headers setheaders con headers como se muestra a continuación.

if (currentUser && currentUser.token) { request = request.clone({ headers: new HttpHeaders({ Authorization: `Bearer ${currentUser.token}` }) }); console.log(''headers:'', request.headers); }

Estoy seguro de que esto resolverá tu problema en ambas versiones: prueba y hazme saber si no funciona. Espero que funcione gracias, ¡feliz codificación!