page navigationend change angular2 angular header basic-authentication

navigationend - router events subscribe angular 4



La autenticación básica angular 2 no funciona (5)

El problema es con el servidor backend. Cualquier navegador envía una solicitud de verificación previa haciendo una solicitud de origen cruzado. El servidor backend en este caso no está manejando la solicitud de verificación previa con éxito. Intente hacer la configuración de cors en el servidor backend. Eso resolverá este problema.

Estoy intentando conectar / hacer una solicitud POST a una API con Angular2, es una API muy simple con una contraseña de autenticación básica. Al deshabilitar la contraseña en la api todo funciona como se esperaba. Pero cuando habilito la Autenticación Angular Básica ya no puedo conectarme a la API. En Cartero todo funciona. Intenté lo siguiente sin éxito.

Tengo dos encabezados "Tipo de contenido" y "Autorización"

headers.append("Content-Type", "application/x-www-form-urlencoded");

He intentado estos dos encabezados.

headers.append("Authorization", "Basic " + btoa(Username + ":" + Password)); headers.append("Authorization", "Basic VXNlcm5hbWU6UGFzc3dvcmQ=");

Lo único que puedo encontrar es que en los encabezados de solicitud RAW solo hay una línea con los nombres de encabezado pero faltan los valores:

Access-Control-Request-Headers: authorization, content-type

Cabeceras en bruto:

#Request Headers OPTIONS /shipment HTTP/1.1 Host: api.example.com Connection: keep-alive Access-Control-Request-Method: POST Origin: http://localhost:4200 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36 Access-Control-Request-Headers: authorization, content-type Accept: */* Referer: http://localhost:4200/address Accept-Encoding: gzip, deflate, sdch Accept-Language: en-US,en;q=0.8,nl;q=0.6

Espero que alguien pueda ayudar


Esto resolvió mis problemas:
Angular2 http post - ¿Cómo enviar el encabezado de autorización?

De acuerdo. He encontrado problema

No estaba en el lado angular. Para ser honesto, no hubo ningún problema en absoluto.

La razón por la que no pude realizar mi solicitud con éxito fue que la aplicación de mi servidor no estaba manejando correctamente la solicitud de OPCIONES.

¿Por qué OPCIONES, no POST? Mi aplicación de servidor está en un host diferente, luego frontend. Debido a CORS, mi navegador estaba convirtiendo POST en OPCIÓN: http://restlet.com/blog/2015/12/15/understanding-and-using-cors/

Con la ayuda de esta respuesta: Spring OAuth2 JWT Authorization Server + CORS independiente

Implementé el filtro adecuado en mi aplicación del lado del servidor.

Gracias a @Supamiu, la persona que me señaló que no estoy enviando POST en absoluto.


Tuve el mismo problema en mi aplicación.

Como puede ver, la solicitud que se envía no es POST sino OPCIÓN (verificación previa)

https://developer.mozilla.org/fr/docs/HTTP/Access_control_CORS

Debe permitir la solicitud de OPCIONES en su API. Si tiene la aplicación Spring, puede agregar esto a la configuración de Spring Security:

protected void configure(HttpSecurity http) throws Exception { http.csrf().disable() .authorizeRequests() **.antMatchers(HttpMethod.OPTIONS, "/**").permitAll()** (..) }

En mi caso funciona


Versión simplificada para agregar encabezados personalizados a su solicitud:

import {Injectable} from ''@angular/core''; import {Http, Headers} from ''@angular/http''; @Injectable() export class ApiService { constructor(private _http: Http) {} call(url): Observable<any> { let username: string = ''username''; let password: string = ''password''; let headers: Headers = new Headers(); headers.append("Authorization", "Basic " + btoa(username + ":" + password)); headers.append("Content-Type", "application/x-www-form-urlencoded"); return this._http.post(url, data, {headers: headers}) } }

Es difícil determinar dónde se equivocó, debido a la falta de código de la llamada http real que hace. Pero este ejemplo debería funcionar para usted


jrcastillo sugirió otra opción here

Pasé tantas horas tratando de solucionar este problema y este liner resolvió mi problema.

@Override public void configure(WebSecurity web) throws Exception { web.ignoring().antMatchers(HttpMethod.OPTIONS, "/**"); }

Fui un poco más específico al final, ya que esto afectó mi ruta / login , así que hice lo siguiente:

@Override public void configure(WebSecurity web) throws Exception { web.ignoring().antMatchers(HttpMethod.OPTIONS, "/api/**"); }