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:
-
Access-Control-Allow-Origin
no puede ser un comodín si se usan credenciales. Es más fácil copiar el encabezado deOrigin
de la solicitud en este campo. No está del todo claro por qué el estándar no permitiría un comodín. - 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 encabezadoAccess-Control-Max-Age: 1
- El nombre de usuario / contraseña del comando de
open
aparentemente no se puede usar como credenciales. Debe agregar un encabezado deAuthorization
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?