Respuesta para comprobaciones no tiene HTTP aceptar el estado en angular

Tengo el siguiente solicitud get definido en mi servicio:

createAuthorizationHeader(user, pass) {
  let headers: HttpHeaders = new HttpHeaders;
  headers = headers.append('Accept', 'application/json, text/plain, */*');
  headers = headers.append('Authorization', 'Basic ' + btoa(user + ':' + pass));
  headers = headers.append('Content-Type', 'application/json; charset=utf-8');
    console.log(headers);
    return this.http.get(this._loginUrl, {
      headers: headers
    });
}

El resultado es:

OPTIONS https://localhost:8443/delivery/all 401 ()

Failed to load https://localhost:8443/delivery/all: Response for preflight does not have HTTP ok status.

HttpErrorResponse {headers: HttpHeaders, status: 0, statusText: "Unknown Error", url: null, ok: false, …}

También me han hecho la misma petición post con el Cartero, pero todo funciona, por lo que el servidor local funciona.

No puedo entender lo que estoy haciendo mal con mi petición.

  • bien parece un problema de autenticación si usted consigue un 401 -> lo que significa que no autorizados, pls buscar en los servidores de registros
  • Cómo se Resuelve este problema? Puede usted por favor me guía en el mismo?
InformationsquelleAutor KalinJa | 2018-08-27

3 Kommentare

  1. 31

    El CORS contrato requiere que la autenticación no ser necesario en el pre-OPCIONES de vuelo solicitud. Parece que el back-end es requerir la autenticación en la solicitud de OPCIONES y la CONSIGUE.

    Al acceder a su back-end con el Cartero, que son sólo el envío de un GET.
    El navegador envía una solicitud de OPCIONES de primera (sin su encabezado de autenticación), y buscar la respuesta a tener un «Access-Control-Allow-Origin» encabezado que coincide con el origen de la página que realiza la solicitud.

    Si la respuesta a las OPCIONES de respuesta no es una 2xx, o el encabezado no está presente, o el encabezado de no valor no coincide con el solicitante de la página de origen, se mostrará el error que estás experimentando, y la solicitud no se hizo.

    TLDR; cambiar el back-end que no requieren autenticación para el método de OPCIONES cuando el manejo de la url de inicio de sesión.

    • ¿Tiene usted alguna información adicional para actualizar el IIS para que no requieren autenticación para el método de OPCIONES?
    • lo estamos haciendo en el nivel de aplicación (en lugar de IIS). déjeme saber si usted necesita más información sobre qué se podía hacer
  2. 6

    Por defecto, los navegadores no permiten a los usuarios realizar una solicitud de origen Cruzado.

    De Angular para evitar este error, se puede utilizar la configuración de proxy.

    Supongo que si angular de la interfaz de usuario está trabajando en localhost:4200 y se quiere llamar el resto punto final de la url, correo.g: https://localhost:8443/delivery/all

    Los pasos descritos a continuación para solucionar esta cuestión.

    1. Crear un proxy.config.archivo json en su angular de la aplicación de la carpeta raíz. (Donde paquete.archivo json existen)
      Proxy hace es simplemente tomar la petición del navegador en el mismo dominio+puerto donde frontend de la aplicación se ejecuta y, a continuación, reenvía la solicitud a su API de servidor del servidor. CORS es un navegador problema de seguridad y no se aplica cuando se hace «backend para backend» de la comunicación como es el caso con un proxy en el medio.

      El contenido debe ser como sigue.

      Ejemplo:

      {
          "/delivery/all/*": {
          "target": "https://localhost:8443",
          "secure": false,
          "logLevel": "debug",
          "changeOrigin": true
          }
      }
      

      Todas las peticiones hechas a /entrega/all/… dentro de nuestra solicitud será enviada a https://localhost:8443/delivery/all/

      Nota: el changeOrigin de la propiedad. Definitivamente, usted se tiene que establecer a true cuando usted está utilizando algunos virtual de proxy (tal como se ha configurado con Apache2) en su backend

    2. Agregar la configuración de proxy mientras se ejecuta la aplicación. Angular apoya «–proxy-config», donde usted puede proporcionar el archivo de configuración de proxy.
      Si usted está utilizando el «npm start» opción para probar, tienes que agregar «–proxy-config» opción como se indica a continuación. Tiene que ser agregado en el paquete.archivo json.

       "scripts": {
      
      "ng": "ng",
      "start": "ng serve --proxy-config proxy.config.json",
      "build": "ng build",
      "test": "ng test",
      "lint": "ng lint",
      "e2e": "ng e2e"
      }
      

      Si se ejecuta directamente a través de «ng servir», a continuación, se ha modificado como se indica a continuación.
      «ng servir –proxy-de configuración de proxy.config.json»

    3. La llamada HTTP dentro de nuestro Angular de la aplicación se puede cambiar a este. El servidor enviará automáticamente la solicitud a «https://localhost:8443/delivery/all«.

      este.http.get(‘https://localhost:8443/delivery/all‘)
      .mapa(res => res.json());

      a

      este.http.get (‘//entrega de todos’)
      .mapa(res => res.json());

    aquí está el enlace para más información: https://sudhasoftjava.wordpress.com/2018/10/05/proxy-configuration-in-angular/

  3. 2

    @Daryl

    Lo que hemos hecho es añadir una configuración personalizada para Cors. Y, a continuación, habilitar a través de la configuración de seguridad en el servidor de java. Este Servidor sólo se habilita para dirigir RESTO de las llamadas, como se explica en la respuesta.

    @Configuration
    public class CorsConfig {
    
        @Bean
        public WebMvcConfigurer corsConfigurer() {
            return new WebMvcConfigurerAdapter() {
                @Override
                public void addCorsMappings(CorsRegistry registry) {
                    registry.addMapping("/**").allowedMethods("GET", "POST", "PUT", "DELETE").allowedOrigins("*")
                            .allowedHeaders("*");
                }
            };
        }
    }
    

    Y este entra en la web de configuración de seguridad:

    @Override
        protected void configure(final HttpSecurity http) throws Exception {
            http.csrf().disable()
                    .antMatcher("/**")
                    .authorizeRequests().and()
                    .httpBasic()
                    .and()
                    .authorizeRequests().anyRequest().authenticated().and().cors();
        }
    

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea