Deshabilite la autenticación para el método OPCIONES HTTP (solicitud de verificación previa) en Nginx

Deshabilite la autenticación para el método OPCIONES HTTP (solicitud de verificación previa) en Nginx

Mi problema es exactamente el mismo que se describe aquí:Deshabilite la autenticación para el método OPCIONES HTTP (solicitud de verificación previa). Estoy intentando utilizar contraseñas CORS y HTTP al mismo tiempo. Cuando el navegador ve OPCIONES rebotadas (código de estado 401), por alguna razón comprobará inmediatamente los encabezados CORS (que estarán ausentes) y rechazará la solicitud.

Aquí está mi configuración:

location /api/ {
    proxy_pass http://127.0.0.1:14000;
    proxy_set_header Host $host;
    add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS";
    add_header Access-Control-Allow-Origin $http_origin;
    add_header Access-Control-Allow-Headers "Authorization, Content-Type";
    add_header Access-Control-Allow-Credentials true;
    auth_basic            "Restricted Area";
    auth_basic_user_file  /var/www/admin.htpasswd;
}

Respuesta1

Aquí está la solución que se me ocurrió. Sin embargo, no es necesario duplicar todas las directivas CORS add_header.

location /api/ {
    proxy_pass http://127.0.0.1:14000;
    proxy_set_header Host $host;
    add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS";
    add_header Access-Control-Allow-Origin $http_origin;
    add_header Access-Control-Allow-Headers "Authorization, Content-Type";
    add_header Access-Control-Allow-Credentials true;
    if ($request_method = OPTIONS) {
        add_header Content-Length 0;
        add_header Content-Type text/plain;
        add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS";
        add_header Access-Control-Allow-Origin $http_origin;
        add_header Access-Control-Allow-Headers "Authorization, Content-Type";
        add_header Access-Control-Allow-Credentials true;
        return 200;
    }
    auth_basic            "Restricted Area";
    auth_basic_user_file  /var/www/admin.htpasswd;
}

Respuesta2

Encontré una solución más limpia que permite al nodo administrar la solicitud:

Coloque la siguiente configuración dentro de "ubicación" y elimine cualquier auth_basic del servidor. Esto funcionará.

  location / {
    # Your node proxy configuration for example #

    # Make options requests work #
    limit_except OPTIONS {
      auth_basic "Restricted access zone";
      auth_basic_user_file /etc/nginx/pass/protected;
    }
  }

Respuesta3

siguiente información enlimit_except/if bloquea problemas, sugeriría usar map:

map $request_method $auth_basic_value {
    default "Restricted";
    "OPTIONS" "off";
}


location / {
        auth_basic $auth_basic_value;
}

Tenga en cuenta que si tiene algunos try_filesen esa ubicación, que pueden reescribir la consulta en otra ubicación, es posible que también deba configurar auth_basic $auth_basic_value.

información relacionada