withcredentials origin headers habilitar control allow http xmlhttprequest cors

headers - xmlhttprequest access-control-allow-origin



¿Cómo hacer XMLHttpRequest cross-domain withCredentials, HTTP Authorization(CORS)? (1)

He escrito un artículo con una configuración completa de CORS.

He encontrado varios problemas que pueden dar lugar a este problema:

  1. Access-Control-Allow-Origin no puede ser un comodín si se usan credenciales. Es más fácil copiar el encabezado de Origin de la solicitud en este campo. No está del todo claro por qué el estándar no permitiría un comodín.
  2. Firefox almacena en caché los resultados del control de acceso incluso si borra la memoria caché (tal vez para la sesión). El reinicio obligó a hacer una nueva solicitud de OPTIONS . Para ayudar en la depuración, agregué el encabezado Access-Control-Max-Age: 1
  3. El nombre de usuario / contraseña del comando de open aparentemente no se puede usar como credenciales. Debe agregar un encabezado de Authorization usted mismo. xhr.setRequestHeader( ''Authorization'', ''Basic '' + btoa( user + '':'' + pass ) )

En general, el sistema withCredentials es bastante inteligente. Es más fácil simplemente escribir un servidor que acepte la autorización como parte del cuerpo de la solicitud.

No puedo realizar una solicitud de dominio cruzado con un encabezado de Autorización (prueba con Firefox). Tengo solicitudes que funcionan sin autenticación, pero una vez que configuro withCredentials en true, ya no puedo leer la respuesta del servidor.

En el servidor, after_request estos encabezados (usando un método after_request en Flask):

resp.headers[''Access-Control-Allow-Origin''] = ''*'' resp.headers[''Access-Control-Allow-Credentials''] = ''true'' resp.headers[''Access-Control-Allow-Methods''] = ''POST, OPTIONS'' resp.headers[''Access-Control-Allow-Headers''] = ''Authorization''

Firefox nunca hace ninguna llamada OPCIONES . En el cliente hago una llamada XMLHttpRequest:

var xhr = new XMLHttpRequest() xhr.open( ''POST'', ''http://test.local:8002/test/upload'', true) xhr.withCredentials = true xhr.onreadystatechange = function() { console.log( xhr.status, xhr.statusText ) } xhr.send(fd)

Sin withCredentials establecido, la declaración de registro registrará la información withCredentials en la consola. Una vez que establezco el valor, el xhr no permite el acceso y solo escribo un valor de 0 y una cadena vacía. No he establecido el encabezado de autorización aquí, pero eso no debería afectar mi capacidad para leer el resultado.

Si intento agregar un nombre de usuario / contraseña al comando "abrir", obtengo un NS_ERROR_DOM_BAD_URI: Access to restricted URI denied error de NS_ERROR_DOM_BAD_URI: Access to restricted URI denied .

¿Qué estoy haciendo mal?